» CSS Sprite, rollover immagini e menu


Non troppo tempo fa, la grafica di una pagina HTML era costituita da uno sfondo che veniva ritagliato con un programma di grafica in segmenti più piccoli, detti slice, i quali venivano usati come background di celle di una grande tabella per formare il template del sito.
Questa tecnica, comoda per i grafici meno esperti che in un attimo trasformavano la loro opera in una pagina HTML, complicava decisamente la vita a chi doveva poi inserirvi il codice limitandolo ai bordi delle celle predefinite.
Un migliore utilizzo del CSS ha risolto questo problema dando la possibilità di inserire queste immagini grafiche come sfondo degli elementi HTML, rendendo il codice della pagina più leggero e semplice da leggere ai motori di ricerca, semplificando quindi anche il lavoro dell’esperto di SEO e liberando lo sviluppatore dai confini delle celle della tabella grafica.
I CSS Sprite rappresentano un’evoluzione naturale di questo concetto, migliorando ulteriormente la leggibilità del codice e una sua eventuale modifica, oltre a velocizzare il lavoro del webdesigner.

COS’E’

Per capire come funziona e cos’è un CSS Sprite facciamo riferimento ad un tutorial precedente dove si spiegava come utilizzare un’unica immagine per creare dei bottoni con effetto di rollover.
In quel caso lo Sprite era lo sfondo dell’elemento HTML A che al passaggio del mouse, seguendo la regola CSS specificata, veniva spostato in fondo, visualizzando la diversa porzione di grafica.
Il CSS Sprite è questo, un’unica immagine di cui ne viene visualizzata la porzione specificata come proprietà nel foglio di stile.
Vediamo come utilizzarlo per trarne i maggiori vantaggi.

COME FUNZIONA

Prendiamo il caso di un semplice menu con un’ icona diversa per ogni link.
La soluzione più logica sarebbe ritagliare ogni icona con il suo effetto di rollover e inserirla come background di ogni ancora del menù: un modo semplice per lasciare il codice pulito e facile da leggere.
Ma è facile capire che per ogni immagine diversa che viene caricata ci sarà una nuova HTTP request che rallenterà la visualizzazione della pagina.
Utilizzando la tecnica del CSS Sprite riduciamo il numero delle richieste da 10 (5 per lo stato di default più 5 per il relativo stato di rollover) a 1, caricando un’unica immagine con tutte le icone che ci servono.

Vediamo prima di tutto il codice HTML, in cui creo una Unordered List (UL) con un collegamento ipertestuale A su ogni List Item (LI):

<ul class="css_sprite">
<li><a class="l1" href="#">LINK1</a></LI>
<li><a class="l2" href="#">LINK2</a></LI>
<li><a class="l3" href="#">LINK3</a></LI>
<li><a class="l4" href="#">LINK4</a></LI>
<li><a class="l5" href="#">LINK5</a></LI>
</ul>

e ora nel nostro foglio di stile CSS settiamo le proprietà per l’unica immagine di sfondo caricata su ogni A presente nei vari LI:

ul.css_sprite {
font-family: Verdana;
font-size: 12px;
list-style: none;
}
/* imposto larghezza e altezza fissa per ogni LI */
ul.css_sprite li {
width: 100px;
height: 40px;
}
/* imposto la stessa immagine di sfondo (icone.gif) per tutti i collegamenti ipertestuali A dichiarandoli come blocco, settando larghezza, altezza e margine sinistro interno (padding-left) di 50px, lo spazio in cui viene visualizzata l'immagine di sfondo di A */

ul.css_sprite li a {
display: block;
background:url('./icone.gif') no-repeat;
width: 100px;
height: 40px;
padding-left: 50px;
line-height: 15px;
}
/* per ogni classe diversa imposto una diversa posizione dello sfondo unico, sull'asse Y */
ul.css_sprite li a.l1 {background-position: 0px 0px;}
ul.css_sprite li a.l2 {background-position: 0px -40px;}
ul.css_sprite li a.l3 {background-position: 0px -75px;}
ul.css_sprite li a.l4 {background-position: 0px -115px;}
ul.css_sprite li a.l5 {background-position: 0px -155px;}
ul.css_sprite li a.l1:hover {background-position: 0px -224px;}
ul.css_sprite li a.l2:hover {background-position: 0px -264px;}
ul.css_sprite li a.l3:hover {background-position: 0px -299px;}
ul.css_sprite li a.l4:hover {background-position: 0px -339px;}
ul.css_sprite li a.l5:hover {background-position: 0px -379px;}

Come vedete l’immagine viene richiamata un’unica volta per caricarla come background del tag A per poi esserne definita la posizione in base alla classe.
Per calcolare la posizione sull’asse Y possiamo utilizzare qualsiasi programma di grafica in grado di visualizzare le coordinate X e Y e poi inserire la posizione Y in negativo, data dalla somma 0 – posizione asse Y dell’icona in questione: l’immagine che fa da sfondo al collegamento verrà alzata di tanti pixel quanto specificato nella regola CSS.

Come possiamo vedere il risultato non cambia rispetto all’inserire una diversa immagine per ogni collegamento del nostro menù.


Oltre a diminuire drasticamente il numero di HTTP request, diminuisce anche il peso complessivo delle immagini caricate, allegerendo la pagina e velocizzandone la visualizzazione, per non parlare del foglio di stile CSS che avrà meno proprietà da aggiungere e file di background da gestire.
Nel nostro caso, trattandosi di poche e piccole icone, la differenza è minima sia in kb che in velocità di caricamento ma pensate ad interi siti che utilizzano questa tecnica, i risultati si vedrebbero ad occhio nudo e ogni eventuale modifica sarebbe molto più semplice da fare.

Ritieni questo post utile o interessante?
Condividi e Segnala

, , , , ,

Leggi anche:

Feed dei commenti dei commenti - lascia un commento - trackback

4 commenti per “CSS Sprite, rollover immagini e menu”

  1. Orange

    è un pò oscuro.. come si sitema l’immagine?

  2. Simone

    Mi piace il tuo sito, e quelli che inseriscono guide per i meno esperti, però in questo esempio non hai spiegato bene le posizioni dell’immagine (ome calcolare i pixel ecc.)
    Simone

  3. R.A.M.Page

    Già, era necessaria una spiegazione meno sbrigativa e più approfondita.

    Ho illustrato meglio i passaggi e inserito dei commenti nel codice, spero che ora sia più comprensibile.

  4. brikki

    …grandissimo! veramente una soluzione ottima… GRAZIE MILLE.

Rispondi al post