@function può essere considerata una generalizzazione di @mixin, ma mentre quest'ultimo viene utilizzato principalmente per arricchire un selettore con un set di proprietà, @function
può essere utilizzata anche per fini differenti, come ad esempio calcolare il valore di una proprietà.
Una @function
accetta dei parametri in ingresso, effettua una elaborazione e ritorna un valore utilizzando la direttiva @return
.
Un caso d'uso abbastanza comune è la composizioni di valori lunghi o complessi, comuni in alcune nuove proprietà CSS3, come box-shadow
o gradienti: ad esempio potremmo costruire una @function
che sovrapponga un numero, definibile dall'utente, di bande colorate ad una immagine sempre scelta dall'utente; per fare questo dobbiamo creare un linear-gradient che, sapientemente, risponda all'input producendo un numero di bande consistenti con quanto richiesto.
Ecco la funzione (provalo online):
@function stripes($nr,$url) {
$start: hsla(0,100%,50%,0.4);
$step_1: 100% / $nr;
$step_2: 360 / $nr;
$stripe: "linear-gradient(to bottom, " + $start + " 0% ";
@for $i from 0 through $nr {
$stripe: $stripe + ", " + hsla($step_2 * $i, 100%, 50%,0.4) + ($step_1 * $i) + ", " + hsla($step_2 * ($i + 1), 100%, 50%, 0.4) + ($step_1 * $i) ;
}
$stripe: $stripe + ")";
@return unquote($stripe + ", url(" + $url + ")");
}
div {
width: 400px;
height: 400px;
background-image: stripes(15,"http://sandropaganotti.com/wp-content/goodies/misc/official_me.jpg");
}
ed ecco alcuni delle combinazioni ottenibili, modificando il valore delle bande si possono ottenere diversi interessanti risultati:

Ma come funziona? Per prima cosa calcoliamo i due incrementi che ci serviranno nel corso della funzione ($step_1
e $step_2
), sappiamo che SASS può effettuare le operazioni mantenendo le giuste unità di misura, quindi dividendo 100% per il numero di bande otterremo un valore percentuale, mentre facendo lo stesso con 360 otterremo un valore intero.
$step_1
ci aiuta nello stabilire il punto da cui deve partire una specifica banda di colore;$step_2
indica la distanza tra due colori adiacenti che useremo nella notazione di colore hsla (hue - saturation - lightness - alpha) per definire i colori tra le varie bande.
Una volta preparati questi due incrementi con un ciclo for generiamo tante iterazioni quante il numero di bande volute e per ognuna di essere facciamo combaciare, alla stessa distanza nell'immagine, la fine di una banda con l'inizio della successiva generando il linear-gradient
voluto.
Ecco il CSS risultante dall'invocazione con 3 sole bande di colore:
div {
width: 400px;
height: 400px;
background-image: linear-gradient(to bottom, rgba(255, 0, 0, 0.4) 0% , rgba(255, 0, 0, 0.4)0%, rgba(0, 255, 0, 0.4)0%, rgba(0, 255, 0, 0.4)33.33333%, rgba(0, 0, 255, 0.4)33.33333%, rgba(0, 0, 255, 0.4)66.66667%, rgba(255, 0, 0, 0.4)66.66667%, rgba(255, 0, 0, 0.4)100%, rgba(0, 255, 0, 0.4)100%), url(http://sandropaganotti.com/wp-content/goodies/misc/official_me.jpg);
}
Notiamo come, nonostante la @function utilizzi la notazione hsla, parte delle specifiche CSS3 e supportata dai browser più moderni, il CSS risultante contenga la più comune notazione rgba, questo perché hsla è anche una delle funzioni di manipolazione di colore offerte da SASS e quindi viene interpretata dal preprocessore.
Ma mentre hsla esiste anche all'interno delle specifiche CSS3 altre interessanti funzioni SASS per la manipolazione del colore sono uniche di questo preprocessore e possono portare ad interessanti risultati, ecco un esempio con darken, lighten e complement, tre funzioni che rendono il colore passato in ingresso rispettivamente più chiaro, più scuro o calcolano il complementare del colore dato (provalo online)
<!-- HTML -->
<a href="#">Submit</a>
/* SCSS */
@mixin colors($color) {
background-color: $color;
color: complement($color);
&:hover {
background-color: lighten($color,20%);
}
&:active {
background-color: darken($color,20%);
}
}
a {
display: inline-block;
padding: 10px;
text-decoration: none;
text-transform: uppercase;
font-size: 14px;
font-family: sans-serif;
@include colors(#9d24ea);
}
Conclusioni
In questo capitolo abbiamo scoperto come trarre il massimo da SASS, creando @function
personalizzate e approfittando delle funzioni di variazione colore offerte dal preprocessore. Tutto questo senza contare l'incredibile potenza che possiamo ottenere dalle nuove modalità di utilizzo delle media queries.
Se vuoi aggiornamenti su CSS inserisci la tua email nel box qui sotto: