Design, CSS : les rollover CSS, un must !
Les feuilles de style CSS (pour Cascading Style Sheets) sont un outil merveilleux pour tout crĂ©ateur web. Leur puissance est (presque) sans limite, dans le respect des standards du moins. J’initie une petite sĂ©rie (vous me direz encore une sĂ©rie !) sur les feuilles de style et leurs fondamentaux.
Plus qu’une dĂ©finition qui n’aurait pas de sens, je tenterais de vous proposer quelques bonnes astuces Ă connaĂ®tre qui pourront :
- Vous faire gagner du temps dans le process de développement. La phase de mise en forme reste toujours la plus longue à finaliser dans un projet web.
- Vous rendre donc plus productif.
- Faire gagner du temps Ă vos visiteurs / vos utilisateurs.
Je vais dĂ©buter par une astuce de mise en forme : le rollover CSS. Il s’agit de faire rĂ©agir une zone en changeant son apparence au survol de la souris, le tout sans Javascript. Les CSS sont lĂ pour nous aider. C’est une technique proposĂ©e depuis maintenant des annĂ©es mais très largement sous-utilisĂ©e.
Exemple #1 : cahier des charges
Dans ce premier exemple nous allons rĂ©aliser un jeu de deux bouton, alignĂ©s verticalement, qui possèderont le mĂŞme Ă©tat au repos mais afficheront une image personnalisĂ©e au survol. PrĂ©cisions : aucun Javascript ne devra ĂŞtre employĂ©. Adieu le onMouseover et autres onBlur…
La base Html
Nous appliquerons le style sur une base html très simple : une liste.
<ul id="menu"> <li id=”item1″><a href=”#”></a></li> <li id=”item2″><a href=”#”></a></li> </ul>
- Par facilité, chaque élément de liste se voit affecté un identifiant Css (Id).
- Cet ID pourrait se gĂ©nĂ©rer de façon automatique si l’on gĂ©nère par exemple le menu de façon dynamique, avec quelque chose du genre :
<li id="item<?php echo $i; ?>">
Le fichier image utilisé
L’originalitĂ© de cette mĂ©thode est que l’on va utiliser un unique fichier image pour gĂ©rer les deux Ă©tats : normal et hover.
Voici le fichier utilisé :

- Dans cette image, le premier logo servira Ă l’affichage au repos,
- Les deux seconds permettront d’afficher les Ă©tats hover.
- Chaque logo a une hauteur de 72 pixels, pour une image d’une hauteur totale de 216px.
La mise en forme CSS
ul#menu li a {
display:block;
width:266px;
height:72px;
background:url(’logo-innovablog-css-rollover.png’) no-repeat 0 0;
border:1px solid #003F64;
}
- Un display:block permet d’affecter une largeur Ă l’Ă©lĂ©ment.
- Le background est appliquĂ© Ă l’Ă©lĂ©ment anchor.
- De plus il est appliqué dans cet exemple à un élément commun aux boutons, puique leur affichage au repos sre identique.
#item1 a:hover, #item2 a:hover {
border:1px solid #F97;
}
- On matérialise une bordure de couleur différente sur le hover.
#item1 a:hover {
background:url('logo-innovablog-css-rollover.png') no-repeat 0 -72px;
}
#item2 a:hover {
background:url(’logo-innovablog-css-rollover.png’) no-repeat 0 -144px;
}
- On applique à chaque élément de liste son comportement sur le survol.
- Pour aller “chercher” le bon logo, on se dĂ©cale dans le fichier vers le bas par une marge nĂ©gative de -72 pixels (la largeur d’un logo).
- De la mĂŞme façon pour l’affichage du second Ă©lĂ©ment, oĂą dans ce cas c’est de 72 x 2 = 144 pixels dont on se dĂ©cale du sommet.
Le résultat est à voir ici.
Exemple #2 : cahier des charges
Nous chercherons toujours à créer un jeu de boutons sans Javascript. La seule différence résidera dans le positionnement des boutons qui sera horizontal.
Fichier image utilisé
- Avec cette seconde image, nous allons réaliser deux boutons différents aussi bien au repos que sur le hover,
- Le premier bouton sera par exemple bleu et rose sur le hover, le second orange et vert sur le hover.
- Chaque bouton a la mĂŞme dimension : 149 x 188 px.
- L’image a une largeur totale de 752 px.
La différence : la feuille de style
ul#menu2 {margin:0;padding:0;list-style-type:none;
position: relative;
}
- Notez ici la position relative du conteneur principal. C’est grâce Ă celĂ que l’on va pouvoir positionner horizontalement nos boutons.
ul#menu2 li {
margin:0 0 5px 0;
padding:0;
position: absolute;
top:0;
}
- Toujours pour notre positionnement horizontal, les éléments de liste auront un positionnement absolut.
#itemA {
left:0;
width:188px;
}
#itemB {
left:208px;
width:188px;
}
- Chaque item est positionnĂ© via l’attribut left, le top Ă©tant implicitement Ă 0.
ul#menu2 li a {
display:block;
width:188px;
height:149px;
}
- Le display:block permet comme dans l’exemple n°1 de dimensionner l’Ă©lĂ©ment.
#itemA a {
background:url('logo-innovablog-crea-css-rollover.png') no-repeat 0 0;
}
#itemA a:hover {
background:url(’logo-innovablog-crea-css-rollover.png’) no-repeat -376px 0;
}
- Pour l’item A, qui sera bleu, la position top:0px left:0px est indiquĂ©e, le picto bleu Ă©tant le premier de l’image.
- Pour récupérer le hover qui sera rose et donc en troisième position, il faudra se décaler de 188 x 2 = 376 px.
#itemB a {
background:url('logo-innovablog-crea-css-rollover.png') no-repeat -188px 0;
}
#itemB a:hover {
background:url('logo-innovablog-crea-css-rollover.png') no-repeat -564px 0;
}
Le résultat est à voir ici.
Les avantages
- AccessibilitĂ© : on rĂ©ussi donc via cette technique Ă se passer de Javascript. C’est le principal avantage. On y gagne donc directement en accessibilitĂ©.
- SimplicitĂ© : pourquoi faire en deux images ce que l’on peut faire en une ?
- PrĂ©chargement inutile : on Ă©vite ainsi tout mĂ©canisme de mise en cache de l’image et de prĂ©chargement. C’est un appel Http d’Ă©conomisĂ©. Quand on sait comment ils sont gĂ©rĂ©s sous Internet Explorer, c’est un avantage indĂ©niable.
- Economie en taille : une grande image sera générallement plus petite (en Ko) que deux petites (voire n petites).
- Moins de code : une seule image sans Javascript c’est aussi moins de code. Et donc moins de ressources utilisĂ©es.
- Mise Ă jour / maintenance simplifiĂ©es : un menu complexe ne nĂ©cessitera la modification que d’une image (idĂ©alement le fichier PSD de base). Imaginez un menu complexe rĂ©alisĂ© dans une technique standard qui pourrait embarquer une vingtaine d’images…
Pourquoi donc s’en passer ? Votre avis m’intĂ©resse !
Ressources :















: Votez !
Découvrez d'autres articles ! >


Cette méthode pose certains problèmes de clignotement sous IE (en particulier avant la v7) dus à un bug de cache : IE tente continuellement de recharger les images.
Ce bug apparaĂ®t si l’Ă©lĂ©ment du rollover a un couleur de fond, ou que l’image de fond n’est pas rĂ©pĂ©tĂ©e dans les deux sens, ou qu’elle est positionnĂ©e. D’autre par, le problème peu survenir si la surface de l’Ă©lĂ©ment (en pixels) est infĂ©rieure Ă 2500.
C’est une “astuce” que j’avais dĂ©jĂ vue mais c’est toujours interessant d’avoir un point de vue diffĂ©rent sur des aspects techniques, cela permet de mieux s’approprier les concepts!
Donc très bon article pour moi :p
Belle initiative, mais si on dĂ©sactive les images, hop plus rien Ă l’Ă©cran… pour l’accessibilitĂ©, on repassera, donc !
Par contre, utiliser
-li- -a- blabla -span- -/span- -/a- -li- par exemple,
(ou les - sont des bien sûr)
permets de placer le span par dessus le texte de lien (pos:absolute, etc), en lui donnant l’image de background (les rĂŞgles de positionnement et de dĂ©placement restent les mĂŞmes bien sĂ»r), et donc quand on dĂ©sactive les images, pouf le texte apparait !
Ce n’est pas parfait non plus, mais c’est bien plus accessible, rĂ©fĂ©rençable, accessible, etc…
Un exemple sur www.neuf.fr (j’ai bossĂ© dessus, c’est pourquoi je me permets de donner cette url, je suis par contre en train de refaire mon site et ce mĂŞme exemple sera bientĂ´t visible dans la partie pro, si vous prĂ©fĂ©rez…), sans forcĂ©ment tenir compte du reste du code de la page car ce n’est pas le sujet.
A bon entendeur…
Merci pour toutes vos remarques toutes plus pertinentes les unes ques les autres.
@François : tu peux être plus précis sur tes 2500 pixels de largeur ?

@serial : merci !
@Marie : bel exemple, merci Ă toi ! J’ai voulu faire le plus simple possible pour Ă©viter de perdre du monde. Evidemment, on peut complexifier la bestiolle
Si j’peux me permettre, cette manière de faire ne permet le roulement que de deux images, position “off” et “over”. La position “on” est dĂ©laissĂ©e… Toujours plus jolie comme effet, lorsque l’on a le bouton “off”, puis “hover” la souris dessus, puis “on” quand on clique
Mais sans javascript activĂ©, c’est cool en effet ^^
j’ai fait un essai et youpi !!! le site de mon frère http://www.echopromotion.com utilise ton tuto et ça fonctionne avec IE8 avec Virtualbox et Ubuntu. Ça devrait le faire sous Windows en vrai…

Le seul dĂ©faut c’est que l’image n’est pas entièrement cliquable sous un seul navigateur: IE !!!
heureusement je suis avec une Ubuntu dans le PC.
Bon article merci !
J’en ai moi-mĂŞme Ă©crit un ici :
2 façons de mettre en cache le JavaScript, CSS et Image simplement (L’utilisation du cache de votre navigateur optimise le temps de chargement des pages d’un site) ici : http://bit.ly/6Y2l3k
Salut et merci !
Super tutos, ils m’aident très souvent !
Mais ici, lorsque j’arrive a changer mon “background” en rollover, le lien disparait ! Enfin, plus de lien Ă cet endroit, ni de pages qui s’ouvre… Que faire ?
Merci d’avance
[PiX]
ta technique semble intĂ©ressante… mais j’ai pas bien compris comment tu la mettais en application.
j’ai essayĂ© de comprendre sur ton site mais je me suis un peu perdu dans la masse des css ;p
tu pourrais dĂ©tailler comment tu appliques l’effet Ă ton span.
merci d’avance
@[PiX] : comment ça plus de lien ? La balise href disparaît ?
@marpa : le plus simple, affiche le source de la page de démo (http://innovablog.com/wp-content/files/2007/12/css-rollover-css-02.html). Le CSS présent est uniquement celui qui concerne notre exemple.
en fait j’avais cliquez sur “rĂ©pondre” du message de Marie ALHOMME.
ton code est très bien et compréhensible, mais la remarque de marie est intéressante.
pour augmenter l’accessibilitĂ©, il est important de penser aux gens naviguant sans images. ceux ayant encore des connexions bas dĂ©bit, notamment dans des pays dits “dĂ©favorisĂ©s”, ont tendance Ă naviguer comme tel vu la lourdeur de la plupart des sites actuels !
hors si on dĂ©sactive les images, les backgrounds disparaissent et c’est très dommageable quand c’est le menu de navigation !
sa technique semble résoudre ce problème : ajouter des span (avec le background appliqué dessus) qui viennent couvrir le texte du lien, qui lui apparait quand les images sont désactivés.
j’ai essayĂ© de le faire mais je n’y arrive pas et le css de Marie (css de pouipouidesign.net) est tellement complexe que je n’arrive pas Ă voir comment elle fait !
si quelqu’un voit comment faire je suis preneur !
en tout cas encore chapeau pour ton tuto il est bien clair et m’a bien servi… merci ;p
Thanks
Merci