UN EXEMPLE D'HABILLAGE DE LISTE :
menu vertical, avec image, avec effet de survol

Exemple

Les exemples de cette page remplacent les puces CSS gérées par list-style-type: par des images. Les listes sont entourées par une bordure, ce qui n'est pas très joli, mais facilite la compréhension de l'affichage CSS.

Les exemples ci-dessous ont des habillages assez sommaires. Il visent surtout à bien conprendre les fonctionnements possibles des listes avec images.
Pour avoir des habillages, vous pouvez regarder les autres parties de ce site, en particulier les boutons, ou aller sur listamatic.


LISTE 1 - Cette liste passe très bien sous mozilla, opéra, ou Internet Explorer 5.0 et supérieur. On a pas défini de hauteur de ligne, et on a mis une instruction display:block, pour que l'effet de survol s'applique sur toute la largeur de la ligne.


LISTE 2 - Cette liste est identique à la liste 1. On a juste rajouté une hauteur de ligne de 3em dans la class "liste2".
On a aussi changé l'image, ce qui n'a aucune importance pour la compréhension du script, mais permet d'avoir un autre exemple de puce par image.
Cela passe très bien sous Opéra ou Mozilla / Firefox, mais IE (5.x ou 6.0) a un bug : la puce est centrée verticalement (c'est logique), mais le texte est aligné en haut, donc pas en face de la puce. C'est très laid.
Or il n'y a pas de fonction de centrage vertical du texte qui marche en CSS sous IE (celui-ci ne reconnait pas la fonction display:table-cell qui est alors indispensable).


LISTE 3 - Cette liste est identique à la liste 2. Pour régler le bug de IE, on a remplacé la hauteur de ligne par un padding (marge intérieure) haut et un padding bas. Ce n'est pas un vrai centrage, mais cela en donne l'illusion. Cela passe alors très bien sous tous les navigateurs récents (Opéra, Mozilla / Firefox, IE 5.0 et supérieurs).
Mais cela ne règle pas tout. Si on veut faire un menu dont la hauteur de chaque ligne sera en %, ce "truc" ne marche pas. Compte tenu de l'impossibilité de centrer verticalement sous Internet Explorer, ce problème est insoluble, sauf en utilisant une mise en page ou chaque ligne du menu sera dans une ligne de table. C'est l'exemple suivant.


LISTE 4 - Cette "liste" n'en est pas vraiment une, puisque les balises <ul> et <li> ne sont pas utilisées. Il s'agit d'un menu par table, qui est la seule facon que je connaisse sous IE pour gérer une hauteur de ligne (en %, en pixel, en em,...) ET centrer verticalement.
En HTML / CSS, on ne peut en effet centrer verticalement que dans une table, pas dans une boite CSS.
Il existe donc une fonction CSS display:table qui (couplée avec vertical-align:middle) permet de "forcer" ce comportement dans une boite CSS, donc dans une vrai liste <ul>, mais, compte tenu du mauvais support de CSS d'Internet Explorer, elle ne marche pas sous IE6.0 et inférieur.
Ce système avec table passe par contre sous tous les navigateurs, mais a 3 inconvénients : comme vous le verrez plus bas, le code est plus compliqué ; il est plus lourd (donc plus lent à charger) ; il utilise des tables, qui ne sont normalement pas à utiliser pour la mise en page.
En bref, ne l'utilisez pas si vous n'avez pas impérativement besoin d'une hauteur de ligne définie ET d'un centrage vertical. Privilégiez si possible les exemples 1 et 3.

liste4 - menu1
liste4 - menu1
liste4 - menu1

LISTE 5 - Cette liste est une variante de l'exemple 3. Au lieu d'utiliser la fonction CSS list-style-image:, on utilise la fonction CSS background-image:. Pour en savoir plus sur cette fonction.
Il y a 2 avantages : on peut avoir des effets de répétition de la puce (fonction background-repeat: ), et surtout, on peut plus facilement faire un encadrement autour de chaque <li>, avec la puce à l'intérieur du-dit encadrement. Cela permet essentiellement d'avoir des effets (en utilisant 2 images, une sur le a: et une sur le a:hover) comme celui-ci.

CODE SOURCE CSS ET HTML

<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<style type="text/css">
/* début des styles communs à toutes les listes */
ul.liste, li, a {padding:0px ; margin:0px} /*met à 0 toutes les marges, intérieures et extérieures */

.liste {border:1px solid black ; /* met 1 bordure noir de 1 px autour de chaque ligne */
width:20em ;} /* largeur de la liste - voir les em */

.liste a { /* défini les liens dans les listes, sans survol */
display:block ; /* force le lien à prendre 100% de la largeur de la liste */
text-decoration:none ; /* on suprime le soulignement des liens */
color:black} /* couleur du texte : noir */

.liste a:hover {/* défini les liens dans les listes, lors des survols */
background-color:black ; /* au survol, la couleur de fond du lien passe au noir */
color:white}/*au survol, la couleur de la police du lien passe au blanc */
/* fin des styles communs à toutes les listes */

.liste1 { /* définitions spécifiques à la liste 1 */
margin-left:3em ; /* marge droite en em */
list-style-image:url(../francais2.gif)} /* image faisant le bouton */

.liste2 { /* définitions spécifiques à la liste 2 */
margin-left:3em ; /* idem liste 1 */
list-style-image:url(../bouton.gif)} /* image faisant le bouton */
.liste2 a {height:3em} /* hauteur des liens (donc des lignes) en em */

.liste3 { /* définitions spécifiques à la liste 3 */
margin-left:3em ; /* idem liste 1 */
list-style-image: url(../bouton.gif)} /* idem liste 2 */
.liste3 a {padding:1em 0 1em 0} /* marges intérieures hautes et basses des liens (donc hauteur des lignes) en em */

/* début de la définition des styles propres à la liste (en table) 4 */
table {height:20em ; /* hauteur de la table (donc de la "liste") */
border-collapse: collapse} /* les bordures qui se touchent fusionnent, pour ne faire qu'1 pixel, et non 2 */

table, tr, td {padding:0 ; margin:0} /* marges intérieures et extérieures à 0 pour la table, ses lignes et ses cellules */

td.liste4 {padding-left:2em ; /* chaque ligne a une marge intérieure gauche de 2 em */
height:33% ; /* chaque ligne a une hauteur de 33% de la hauteur de la table */
background:url(../bouton2.gif) no-repeat left} /* image DE FOND faisant le bouton */

td.liste4 a {vertical-align:middle} /* Chaque lien est centré verticalement dans les cellules */
/* fin de la définition des styles propres à la liste (en table) 4 */

.liste5 { /* définitions spécifiques à la liste 3 */
padding-left:40px ; /* marge intérieure gauche pour affichage du bouton */
background:url(../francais2.gif) no-repeat left ; /* image DE FOND faisant le bouton */
list-style-type:none} /* supprime les boutons CSS */
.liste5 a {padding:20px 5px 20px 0px} /* Marges intérieures des liens de la liste */

</style>
</head>

<body>
<ul> <!-- Liste 1-->
<li class="liste liste1"><a href="#">liste1 - menu1</a></li>
<li class="liste liste1"><a href="#">liste1 - menu2</a></li>
<li class="liste liste1"><a href="#">liste1 - menu3</a></li>
</ul>

<ul><!-- Liste 2-->
<li class="liste liste2"><a href="#">liste2 - menu1</a></li>
<li class="liste liste2"><a href="#">liste2 - menu2</a></li>
<li class="liste liste2"><a href="#">liste2 - menu3</a></li>
</ul>

<ul><!-- Liste 3-->
<li class="liste liste3"><a href="#">liste3 - menu1</a></li>
<li class="liste liste3"><a href="#">liste3 - menu2</a></li>
<li class="liste liste3"><a href="#">liste3 - menu3</a></li>
</ul>

<table><!-- Liste 4, sous forme de table -->
<tr><td class="liste liste4"><a href="#">liste4 - menu1</a></td></tr>
<tr><td class="liste liste4"><a href="#">liste4 - menu1</a></td></tr>
<tr><td class="liste liste4"><a href="#">liste4 - menu1</a></td></tr>
</table>

<ul><!-- Liste 5-->
<li class="liste liste5"><a href="#">liste5 - menu1</a></li>
<li class="liste liste5"><a href="#">liste5 - menu2</a></li>
<li class="liste liste5"><a href="#">liste5 - menu3</a></li>
</ul>

</body>
</html>

 

COMMENTAIRES

On voit que les listes avec images sont assez prochent de celles avec puce CSS mais sans images. Elles passent très bien dans les navigateurs Gecko (Firefox, Mozilla,...) et dans Opéra, mais IE a plusieurs bugs génants.

Toutes les listes ci-dessus, sauf la 2, sont utilisables. Il faut juste être conscient de leurs petits défauts sous Internet Explorer, et choisir celle qui colle le mieux à ses besoins.

Vous avez noté qu'on a choisi de définir la hauteur des lignes en stylant les liens <a>, et non les <li>. En fait, les 2 sont possibles. Simplement, choisir de dimmensionner le <a> permet, couplé avec un display:block, d'avoir un effet de survol sur tout le bloc. Si on style <li>, l'effet de survol ne portera que sur une partie du block, celui contenant le lien <a>.

Dans la liste 5, on supprime l'affichage des puces "CSS standard", ce qu'on a pas fait dans les autres listes. En effet, les autres listes utilisaient des puces "images", qui désactivent automatiquement les puces "CSS standard". Mais dans la liste 5, on utilise pas les puces "images", mais des images de fond. Dès lors, il faut penser à désactiver les puces "CSS standard".

On utilise ici à chaque fois une combinaison de 2 classes (pour alléger le code) : une classe de base, et une classe spécifique à chaque liste. Pour en savoir plus sur les combinaisons de classes. Pensez bien que dans votre code définitif, vous devez "coller" le code CSS de la liste qui vous convient avec le code CSS général de la classe de base.