Nous avons vu le menu tout simple à un niveau et le menu à deux niveaux qui se déplie vers le bas, nous allons étudier aujourd'hui le menu à trois niveaux (et plus si affinités

) qui se déplie vers la droite.
Côté html, rien de changé. Notre menu est toujours une liste. Avec des sous-niveaux et des sous-sous-niveaux. Des <ul> qui sont dans les <li> qui sont dans les <ul>
qui sont dans les <li> qui...
Je reprends mon menu à sous-niveaux, et j'ajoute en html quelques choix de viandes, de poissons et de pâtisseries... tant que j'y suis, je range le tout dans une balise <div>,
dans laquelle je note le petit nom choisi pour mon menu...
<div class="menu3">
<ul>
<li>Entrée
<ul>
<li>Crudités</li>
<li>Crustacés</li>
</ul>
</li>
<li>Plat
<ul>
<li>Viande
<ul>
<li>Poulet</li>
<li>Mouton</li>
</ul>
</li>
<li>Poisson
<ul>
<li>Avec arêtes</li>
<li>Sans arêtes</li>
</ul>
</li>
</ul>
</li>
<li>Fromage</li>
<li>Dessert
<ul>
<li>Fruit</li>
<li>Pâtisserie
<ul>
<li>Forêt noire</li>
<li>Tarte Tatin</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
Je valide, et voilà ce que je dois avoir. Si j'ai autre chose, c'est que je me suis planté quelque part.
La suite de la recette, vous la connaissez : clic sur chaque élément présent au dernier niveau de son <ul> et ajout du lien... (rien ne m'empêche d'associer un lien à d'autres
niveaux, par exemple « Viande » ou même « Dessert », si j'en ai l'usage)
Oh que c'est joli toutes ces couleurs et ces petites nétoiles qui défilent
Euh non en vrai c'est très laid, mais ça a au moins le mérite de nous aider à repérer quelle ligne fait quoi dans le gros bout de css que voici que voilà :
/* common styling */
.menu3 {font-family: "Courier New", sans-serif; width:106px; height:84px; position:relative; font-size:14px; margin:10px 0; border: 1px solid #FF0000; border-width: 1px 1px 0px 1px;}
.menu3 ul {padding:0; margin:0;list-style-type: none; }
.menu3 ul li {float:left; margin-right:0px; position:relative;display:block; width:106px; text-decoration:none; color:#fff;height:20px; text-align:center; background:#000; line-height:20px; cursor:
url(http://img525.imageshack.us/img525/2606/pencilpc5.gif), auto; border: 1px solid #FF0000; border-width: 0 0 1px 0;}
.menu3 ul li a, .menu3 ul li a:visited {display:block; text-decoration:none; width:106px; font-style: normal; color:#ffff00; height:20px; text-align:center; background:#0000FF;
line-height:20px;}
.menu3 ul li ul {display: none;}
.menu3 ul li:hover { background-color: #fff; color: #000; }
.menu3 ul li:hover a {color:#fff; background:#ff00ff;}
.menu3 ul li:hover ul {display:block; position:absolute; top:-1px; left:106px; width:106px; border: 1px solid #000; border-width: 1px 1px 0 1px;}
.menu3 ul li:hover ul li { background-color: #00FF00; border: 1px solid #000; border-width: 0 0 1px 0; }
.menu3 ul li:hover ul li:hover { background-color: #fff; background-image: url(http://idata.over-blog.com/1/99/25/61/stars2.gif); color: #FF0000; font-weight: bold; }
.menu3 ul li:hover ul li ul {display: none;}
.menu3 ul li:hover ul li a {display:block; background:#FF0000; color:#00FF00; width:106px;}
.menu3 ul li:hover ul li a:hover {background:#00FF00; color:#FF0000;}
.menu3 ul li:hover ul li:hover ul {display:block; position:absolute; left:106px; top:-1px; }
.menu3 ul li:hover ul li:hover ul li a {display:block; width:106px; background:#00FFFF; color:#DDA0DD;}
.menu3 ul li:hover ul li:hover ul li a:hover {background:#ffff00; color:#000;}
Dépiautage de la bête :
- ligne .menu3 : l'ensemble de notre menu. Des marges pour le positionner, police et taille d'icelle fixées une bonne fois pour toutes, une largeur, une hauteur (égale au nombre de
cellules x leur hauteur, spécifiée dans la ligne .menu3 ul li, + la somme des épaisseurs des bordures mentionnées dans la même ligne et ici), bordures rouges (#FF0000) en haut, à droite et à
gauche et une position: relative qui doit bien servir à quelque chose.
- ligne .menu3 ul : à laisser en l'état, elle assure le bon positionnement de l'ensemble (et l'éradication des puces).
- ligne .menu3 ul li : ligne qui définit l'apparence des li du ul, des éléments du premier niveau, quoi. A mon avis, mieux vaut ne pas toucher au début (jusqu'à la width, assez
logiquement égale à celle de la ligne .menu3), mais on peut s'amuser avec le reste. J'ai fait sobre
Cellules de 20
px de haut, bordées de rouge (#FF0000) en bas, texte blanc (#FFF) centré sur fond noir (#000), à peine me suis-je autorisé à forcer mon curseur personnalisé à s'afficher.
- ligne .menu3 ul li a, .menu3 ul li a:visited : et si l'un des éléments du premier niveau est un lien (comme ici « Fromages ») ? Une fois assuré que la width est toujours égale à celle
spécifiée dans la ligne .menu3 (et la height égale à celle des autres cellules du niveau, soit 20 px), et après avoir demandé que les liens, qui sont en italiques dans mon css, s'affichent
normalement (font-style: normal;), je peux m'amuser. En mettant par exemple mon texte en jaune (#FFFF00) sur fond bleu (#0000FF).
- ligne .menu3 ul li ul : un display: none; afin que les niveaux inférieurs restent sagement cachés jusqu'à ce qu'on leur demande d'apparaître.
- ligne menu3 ul li:hover : comportement des cellules qui ne sont pas des liens (« Entrée », « Plat » et « Dessert ») au survol. Sobre encore : texte noir (#000) sur fond blanc (#FFF). A
noter qu'IE6 ne comprend pas la commande li:hover, pour lui, on ne peut hoverer que sur un lien, un a. Pas sur un élément de liste, un li. Donc avec IE6, ben ça marche pas. En même temps, sur
IE6, y'a pas grand-chose qui marche. Que personne ne me parle d'IE6
.
- ligne .menu3 ul li:hover a : je survole ma cellule « Fromage », qui se trouve également être un lien. Et, ô miracle, apparaît une espèce d'horreur, texte blanc (#FFF) sur fond magenta
(#FF00FF).
- ligne .menu3 ul li:hover ul et .menu3 ul li:hover ul li : remontez de quelques lignes... ces deux lignes-ci servent à définir le placement et l'apparence de chaque sous-menu et
des éléments qui le composent, si ceux-ci ne sont pas des liens (mes « Viandes », « Poissons » et « Pâtisseries », donc). J'ai choisi une largeur égale à celle de mon menu principal (106px), une
bordure noire (#000) et un délicieux fond d'un vert très printanier (#00FF00). Comme je n'ai pas spécifié de couleur, elle est par défaut la même que celle du niveau précédent, blanc (#FFF). Les
commandes "top" et "left" déterminent le positionnement de ce sous-menu par rapport à celui du niveau supérieur : top: -1px; pour rattraper le décalage provoqué par la bordure, left: 106px; parce
que telle est la largeur des cellules du niveau supérieur
- ligne .menu3 ul li:hover ul li:hover : devinez quoi ? Ben c'est ce qu'il se passe quand je survole un élément (non-lien) du deuxième niveau. Fond blanc (#FFF), jolies nétoiles qui
défilent parce que pourquoi se priver de coller une background-image si on peut, texte rouge (#FF0000) en gras.
- ligne .menu3 ul li:hover ul li ul : vous ne trouvez pas qu'elle ressemble furieusement à la ligne .menu3 ul li ul ? Hmmm ?
- ligne .menu3 ul li:hover ul li a et .menu3 ul li:hover ul li a:hover : mais, et mes « Crudités », « Crustacés » et « Fruits » ? Ce sont des liens ! Qu'à cela ne tienne,
faisons-les jolis aussi. Texte vert (#00FF00) sur fond rouge (#FF0000)... ça tue bien les yeux, hein ?
Si j'inverse
les couleurs au survol, c'est mieux ?
- lignes .menu3 ul li:hover ul li:hover ul et .menu3 ul li:hover ul li:hover ul li a et .menu3 ul li:hover ul li:hover ul li a:hover : et hop, on passe au niveau
inférieur... left, top, width, texte mauve (#DDA0DD) sur fond bleu tellement piscine que ça sent le chlore (#00FFFF), qui deviennent au survol noirs (#000) sur fond jaune (#FFFF00). A noter que
les bordures reprennent automatiquement les valeurs spécifiées au niveau supérieur.
Et on peut continuer longtemps comme ça ! Jusqu'à avoir des lignes .menu3 ul li:hover ul li:hover ul li:hover ul li:hover ul li:hover ul li:hover ul li:hover ul li:hover ul li
a:hover... C'est marrant, mais ça me fait penser à du tricot, la construction de ce menu. Peut-être parce que je n'en ai jamais fait. Mais quand-même.
Bon, suffit pour les menus... quoique les menus accordéons sont rigolos aussi, possible donc que je me laisse aller à en décortiquer un quand vous aurez digéré celui-ci
Derniers Commentaires