filter

La proprietà CSS filter permette di applicare vari effetti grafici come una sfocatura o una variazione dei colori ad un elemento, un po’ come i filtri di Photoshop.

I filtri sono comunemente utilizzati per variare il rendering di un’immagine, prima che essa venga visualizzata.

#Sintassi

.filtro {
  filter: <nome filtro> | none;
}

Al posto di <nome filtro> va inserito il nome di un filtro valido, ecco l’elenco:

  • blur
  • brightness
  • contrast
  • drop-shadow
  • grayscale
  • hue-rotate
  • invert
  • opacity
  • saturate
  • sepia
  • url

Ecco un esempio dell’utilizzo di un singolo filtro:

.sfocato {
  filter: blur(30px);
}

Si possono combinare più filtri inserendo uno spazio tra loro, ecco un esempio:

.tanti-filtri {
  filter: grayscale(30%) blur(30px);
}

#Funzioni

Per utilizzare la proprietà filter, bisogna specificare un valore di una delle funzioni elencate sopra. Se il valore non è corretto, la funzione restituirà none.

Quando non è specificato, la funzione accetta un valore espresso con un segno percentuale (es: 38%) o un valore espresso come un decimale (es: 0.38).

#Esempi

Di seguito sono riportati degli esempi dell’utilizzo dei vari filtri su questa immagine:

Immagine da Pexels

#greyscale

filter: grayscale( 0% | 100%);

Il filtro greyscale si traduce in scala di grigi, e come suggerisce il nome, mostra l’immagine a cui è applicato in bianco e nero.

Il valore accettato dalla funzione definisce la proporzione della conversione. Un valore del 100% significa che l’immagine è completamente in scala di grigi. Un valore dello 0% lascia l’immagine inalterata. Parametri tra 0% e 100% sono moltiplicatori lineari dell’effetto. Se il parametro non è inserito, verrà utilizzato 100%. I valori negativi non sono consentiti.

#sepia

filter: sepia( 0% | 100% );

Applica l’effetto seppia all’elemento a cui è applicato il filtro.

Il valore accettato dalla funzione definisce la proporzione della conversione. Un valore del 100% significa che l’immagine è completamente seppia. Un valore dello 0% lascia l’immagine inalterata. Parametri tra 0% e 100% sono moltiplicatori lineari dell’effetto. Se il parametro non è inserito, verrà utilizzato 100%. I valori negativi non sono consentiti.

#saturate

filter: saturate( 0% | 100% );

Aumenta la saturazione dell’elemento a cui è applicato il filtro.

Il valore accettato dalla funzione definisce la proporzione della conversione. Un valore dello 0% significa che l’immagine è completamente senza saturazione. Un valore del 100% lascia l’immagine inalterata. Gli altri parametri sono moltiplicatori lineari dell’effetto. Se il parametro non è inserito, verrà utilizzato 100%. I valori negativi non sono consentiti.

#hue-rotate

filter: hue-rotate( 0deg | 360deg  );

Applica la rotazione della tonalità all’elemento a cui è applicato l’effetto.

L’immagine a cui viene applicato il filtro, viene alterata in base al numero di gradi del cerchio cromatico definito dal valore, in gradi indicati con deg, passato alla funzione.

Un valore di 0deg lascia l’immagine inalterata. Se l’angolo del parametro non è inserito, un valore di 0deg viene applicato. Il valore massimo è 360deg.

#invert

filter: invert( 0% | 100%);

Inverte i campioni all’elemento a cui viene applicato l’effetto.

Il valore accettato dalla funzione definisce la proporzione della conversione. Un valore del 100% significa che l’immagine è completamente invertita. Un valore dello 0% lascia l’immagine inalterata. Parametri tra 0% e 100% sono moltiplicatori lineari dell’effetto. Se il parametro non è inserito, verrà utilizzato 100%. I valori negativi non sono consentiti.

#opacity

filter: opacity( 0% | 100% );

Applica trasparenza ai campioni dell’elemento a cui è applicato il filtro.

Il valore accettato dalla funzione definisce la proporzione della conversione. Con un valore dello 0% significa che l’elemento è completamente trasparente. Con un valore del 100% lascia l’immagine inalterata. Parametri tra 0% e 100% sono moltiplicatori lineari dell’effetto. Se il parametro non è inserito, verrà utilizzato 100%. Questa funzione è molto simile alla proprietà opacity. La differenza è che con i filtri, alcuni browser forniscono l’accelerazione hardware per prestazioni migliori. I valori negativi non sono consentiti.

#brightness

filter: brightness( 0% | 100% );

Applica un moltiplicare lineare all’immagine a cui è applicato il filtro per farla apparire più o meno luminosa.

Un valore dello 0% rende l’immagine completamente nera. Un valore dello 0% lascia l’immagine inalterata. Parametri tra 0% e 100% sono moltiplicatori lineari dell’effetto. Se il parametro non è inserito, verrà utilizzato 100%. I valori negativi non sono consentiti.

#contrast

filter: contrast( 0% | 200% );

Modifica il contrasto dell’immagine a cui è applicato l’effetto.

Un valore dello 0% rende l’immagine completamente nera. Un valore del 100% lascia l’immagine inalterata. Valori superiori al 100% sono consentiti, rendono l’immagine con meno contrasto. Se nessun valore è fornito, viene utilizzato 100%.

#blur

filter: blur( px | ecc... );

Applica l’effetto sfocatura gaussiana (gaussian blur) all’immagine a cui viene applicato l’effetto.

Il valore del “raggio” definisce il valore della deviazione standard della funzione gaussiana, oppure quanti pixel dello schermo miscelare tra essi. Se nessun parametro è fornito, verrà utilizzato 0. Il parametro è specificato come lunghezza CSS, non sono accettati valori percentuali.

#drop-shadow

filter: drop-shadow(18px 18px 20px yellow);

Applica un’ombra esterna (drop shadow) all’elemento a cui è applicato il filtro.

Un’ombra esterna è una versione sfocata e deviata della maschera alpha dell’immagine disegnata in un colore particolare, composita sotto l’immagine.

La funzione accetta i parametri di tipo (definiti nei Backgrounds CSS3), con l’eccezione della keyword “inset”, che non è consentita.

Questa funzione alla proprietà box-shadow. La differenza è che con i filtri, alcuni browser abilitano l’accelerazione hardware, che consente prestazioni migliori.

Le drop-shadow seguono il contorno esterno di un oggetto, a differenza delle box-shadow che trattano qualsiasi oggetto come una scatola.

Come nelle text-shadow, non c’è il parametro spred per creare ombre solide più larghe dell’oggetto.

#url

La funzione url() accetta come parametro il percorso di un file XML che specifica un filtro SVG, può anche includere un collegamento ad un altro elemento filtro specifico.

#Animare i filtri

I filtri possono essere animabili, questo aspetto è molto interessante e consente di creare moltissime cose, ecco un piccolo esempio:

#Note

Come abbiamo visto, è possibile combinare più funzioni per manipolare il risultato finale, ma nel fare ciò l’ordine conta! Se per esempio utilizziamo grayscale() e sepia(), otteniamo un’immagine completamente grigia!

Le specifiche nominano la funzione filter(<url-img>, <funzione filtro>), che consentirebbe di applicare filtri ad ogni immagine utilizzata direttamente nel CSS. Per esempio, puoi sfocare un’immagine di background senza sfocare il testo. Questa funzione però non è ancora supportata dai browser, nel frattempo puoi applicare lo sfondo e il filtro ad un pseudo-elemento per ottenere un effetto simile.

#I filtri in Internet Explorer

La proprietà filter può essere utilizzata anche in questo modo:

.opacita {
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
  filter: alpha(opacity=30);
}

Questa tecnica è utilizzata principalmente per supportare Internet Explorer 8 e inferiori.

#Supporto dei Browser

Il numero indica la versione minima del browser in cui la feature sia supportata. Per ottenere maggiori informazioni, passare con il mouse sopra la versione.

Desktop

chrome
Google Chrome
53
firefox
Mozilla Firefox
35
ie
Internet Explorer
No
edge
Microsoft Edge
79
opera
Opera
40
safari
Apple Safari
9.1

Mobile / Tablet

and_chr
Android Chrome
85
and_ff
Android Firefox
79
android
Android
81
samsung
Samsung Internet
7.2
op_mob
Opera Mobile
59
ios_saf
iOS Safari
9.3

Queste statistiche sul supporto da parte dei browser provengono da Caniuse, che potete visitare per informazioni più dettagliate.

Per i browser che non supportano i filtri, esiste un polyfill.