31mar.2009
[CSS] Menu horizontal sous forme de liste
Qu’on se le dise, le moyen le plus logique de présenter un menu sur un site Internet, est de le structurer sous forme de liste. C’est effectivement la représentation la plus proche de ce que représente un menu : une liste de catégories, une liste de services, etc.
Habituellement en HTML, une liste est représentée verticalement, les éléments les uns en dessous des autres.
Si comme moi, il vous vient l’envie de faire un menu horizontal, voici comment procéder de manière à ce qu’il ait le même rendu sur les navigateurs Internet les plus répandus.
Tout d’abord, créons une liste classique :
<ul id="maListe"> <li><a href="#" title="Premier élément">Premier élément</li> <li><a href="#" title="Deuxième élément">Deuxième élément</li> <li><a href="#" title="Troisième élément">Troisième élément</li> <li><a href="#" title="Quatrième élément">Quatrième élément</li> </ul>

Le reste, ce n’est que tu CSS. On enlève d’abord les styles appliqués automatiquement par les navigateurs (marges, etc.) :
#maListe
{
margin:0;
padding:0;
list-style-type:none;
}
#maListe li
{
margin:0;
padding:0;
}

Pour l’instant, la liste est toujours verticale. Pour compliquer légèrement, on va supposer que notre menu aura une largeur maximale fixe, et que les éléments seront centrés à l’intérieur (lorsqu’il sera horizontal) :
#maListe
{
margin:0;
padding:0;
list-style-type:none;
text-align:center;
width:300px;
}
#maListe li
{
margin:0;
padding:0;
}

La propriété magique pour faire passer le menu à l’horizontale est “display”, qu’il faut mettre à “inline” pour chaque élément de la ligne. Comme ceci :
#maListe
{
margin:0;
padding:0;
list-style-type:none;
text-align:center;
width:300px;
}
#maListe li
{
margin:0;
padding:0;
display:inline;
}

On peut ensuite décorer comme on souhaite notre menu. Par exemple, en ajoutant une bordure à chaque élément du menu, une marge, ainsi qu’une couleur de fond :
#maListe
{
margin:0;
padding:0;
list-style-type:none;
text-align:center;
width:300px;
}
#maListe li
{
margin:0;
padding:0;
display:inline;
margin:5px;
background-color:red;
border:1px solid black;
}

Le menu est presque parfait. SAUF QUE …
Sauf que le fait de limiter la largeur de notre menu, peut entrainer un retour à la ligne suivante de certains éléments (on aura donc un menu sur 2 lignes). Ce n’est pas gênant. Mais le problème vient du fait que la propriété “margin-top” (que l’on a implicitement définie dans “margin”) n’est pas prise en compte sur un élément dont la propriété “display” est “inline” (précisément le cas de nos éléments du menu).
Ce phénomène n’est pas dérangeant lorsque le menu tient sur une seule ligne (on peut s’arranger à mettre une marge inférieure plus grande à l’élément qui précède le menu). Mais lorsqu’il est sur plusieurs lignes, on se retrouve avec des éléments qui, au mieux se touchent, voire se chevauchent.
Pour corriger ce problème, et faire en sorte que la propriété “margin-top” soit prise en compte, il faut afficher les éléments non plus en “inline”, mais en “inline-block”. Malheureusement, cette propriété n’est pas prise en charge par Firefox 2, et dans notre cas précis (pour ce menu), pas non plus par Internet Explorer 7.
J’ai réussi à trouver une astuce sur le net, sur le blog d’Isaac Schlueter (”Foo Hack”) plus précisément : Cross Browser Support for inline-block Styling. Il s’agit d’utiliser la combinaison de ces 4 propriétés CSS, pour arriver au résultat souhaité :
display:-moz-inline-stack; display:inline-block; zoom:1; *display:inline;
La première ligne est spécifique à Firefox 2 (attention à bien mettre cette ligne avant “display:inline-block;”). La seconde ligne est la propriété display classique. Les deux dernières lignes ne sont là que pour simuler un bon fonctionnement global. Prises une par une, elle ne réagissent pas de la même façon qu’ensemble.
Le CSS corrigé serait donc :
#maListe
{
margin:0;
padding:0;
list-style-type:none;
text-align:center;
width:300px;
}
#maListe li
{
margin:0;
padding:0;
margin:5px;
background-color:red;
border:1px solid black;
display:-moz-inline-stack;
display:inline-block;
zoom:1;
*display:inline;
}

Et voilà c’est terminé !






Commentaires
20/08/2009 | 22:41
Bon tuto, merci =)