samedi 20 mars 2010
Je suis certain que la plupart d'entre vous vous rappelerez avoir utilisé Dreamweaver pour générer des images rollover en quelques clicks. Vous savez alors que l'éditeur générait du code JavaScript dans la page pour préparer le bon fonctionnement du rollover et qu'il ajoutait un appel d'initialisation dans l'attribut onload de la balise body. Plus précisément, il s'agissait de ce groupe de fonctions :
- MM_swapImgRestore()
- MM_preloadImages()
- MM_findObj()
- MM_swapImage()
Pour ne pas se casser la tête, le truc est de prendre l'approche CSS, sans même utiliser le JavaScript.
1. Créer une seule image qui comprend plusieurs états
Ici, j'ai juxtaposé verticalement deux états d'images de 16x16 dans une image unique de 16 pixels de large par 32 pixels de haut.
Au niveau du poids du fichier, on peut parfois obtenir un gain :
- connect.png : 748 octets
- disconnect.png : 796 octets
- les 2 combinées en 1 seul fichier : 1,3 ko (0,2 ko en moins)
2. HTML
La balise IMG pour un bouton rollover ? OUT! On préférera un lien sur lequel on appliquera une classe. Le texte du lien sera disponible pour le référencement mais on le fera disparaître hors-champ par CSS.
<a class="connect" href="/page.php">Connexion</a>3. CSS
Du côté de la feuille de style, on définira l'état initial du bouton. Par défaut, un lien possède la propriété d'affichage "inline", on le forcera à être en bloc. On déterminera la zone visible de l'image, soit la pleine largeur (16px) et les 16 premiers pixels en hauteur. Le texte sera repositionné loin à l'extérieur du cadre (petit tour de passe-passe) et on indiquera le chemin de l'image.
.connect{Une fois ces dispositions prises, on peut prendre avantage de la pseudo-classe hover pour indiquer de passer à l'état second en positionnant temporairement la zone visible (16x16) vers le bas. L'état initial sera repris lorsque le curseur ne sera plus au dessus du lien.
display:block;
width:16px;
height:16px;
text-indent: -9999px;
background:url(/images/connect.png) 0 0 no-repeat;
}
.connect:hover{C'est nettement une grande amélioration par rapport ce qu'il y avait de disponible à l'époque. Yahoo! est réputé pour utiliser cette technique intensivement, surtout pour minimiser le nombre de requêtes HTTP vers ses icônes (exemple). Sans surprise, Facebook aussi (exemple).
background-position: left bottom;
}
C'est juste du Sprite CSS en fait. En dehors de l'économie de poids des images (parfois assez faible), ça économise surtout le nombre de requêtes HTTP.
Cependant IE6 n'est pas toujours friand de cette d'astuce, notamment pour les images PNG24 transparentes; il y a tout de même moyen de gérer ça avec la propriété "clip" de CSS.
Concernant le "text-ident" négatif, il ne fonctionne pas sur tous les navigateurs, mais peut-être complété par un "font-size:0". Le mieux reste encore de faire contenir le texte du lien dans un "span", et de faire un "display:none" dessus.
Merci pour les trucs et les bonnes pratiques, ça me sera utile. Je me débrouille en intégration et ça prouve un peu qu'un programmeur devrait laisser le boulot aux spécialistes du front-end. Au moins ça me permet d'apprendre et de m'améliorer.