Le menu déroulant sans JS et marchant partout, ce Graal du bloggeur.
Il y en a un exemple chez PêUR dans cet article. C'est un beau boulot, complexe, qui a suscité de nombreuses questions (plus de 300 commentaires !), qui marche bien mais semble demander beaucoup de doigté quand on veut l'adapter chez soi, en particulier parce qu'une grande partie du menu doit être décrite en double : pour IE d'une part, pour les autres d'autre part.
Peut-on faire aussi bien et plus simple ? Tentative de réponse, dissection admirative du travail de PêUR et reprise du problème à la base.
Note désolée : cet article repose entièrement sur les commentaires conditionnels que propose IE. Hélas l'éditeur en ligne d'OB traite très mal ces commentaires (juin 2009) et la technique proposée est donc inutilisable sur un blog OB. Sur d'autres sites, peut-être ?
Analyse de la question
HTML carpo-lapinesque
<div id="menu"> <!--[if IE]> <a class="choix" href="#nogo"> <![endif]--> <!--[if !IE]><--> <div class="choix"> <!--><![endif]--> <div class="libchoix">bonbons</div> <!--[if IE]> <table cellspacing="0" cellpadding="0" border="0"><tr><td> <![endif]--> <a class="sschoix" href="citron.html">Citron</a> <a class="sschoix" href="fraise.html">Fraise</a> <!--[if IE]> </td></tr></table></a> <![endif]--> <!--[if !IE]><--> </div> <!--><![endif]--> <!--[if IE]> <a class="choix" href="#nogo"> <![endif]--> <!--[if !IE]><--> <div class="choix"> <!--><![endif]--> <div class="libchoix">chocolats</div> <!--[if IE]> <table cellspacing="0" cellpadding="0" border="0"><tr><td> <![endif]--> <a class="sschoix" href="noir.html">Noir</a> <a class="sschoix" href="lait.html">Lait</a> <!--[if IE]> </td></tr></table></a> <![endif]--> <!--[if !IE]><--> </div> <!--><![endif]--> </div>
Selon que le navigateur est IE ou pas, le premier niveau se compose de liens ou de div, le deuxième niveau est emballé dans une table ou pas.
J'ai aussi emballé les choix de premier niveau dans des div class="libchoix" dans le seul but de mieux contrôler la mise en page.
Modifier l'hybride carpo-lapinesque
Pour modifier un choix de premier niveau, intervenir sur le div class="libchoix".
Pour rajouter un choix de premier niveau, copier/coller l'un des deux blocs avec tout son harnachement de commentaires.
Pour ajouter un article dans un sous-menu, copier/coller l'un des a class="sschoix".
Décorer l'hybride carpo-lapinesque
Voici un exemple de CSS pour que l'usine à gaz tienne debout. En gras, ce qui ne doit pas être touché – il y en a peu mais c'est sacré ! Les valeurs numériques sont à votre guise, il faut seulement veiller à respecter certaines relations mentionnées en commentaire.
/* 1 - Emplacement de la barre de menu*/ .menu {position:absolute; top: 20px; left:50px; width:184px; } /* Explications plus bas */ /* Dimensions des articles */ .libchoix, .sschoix {width:90px; height:18px; line-height:18px; }/* indiquer les deux, et identiques */ /* 2 - Boutons de la barre de menu */ .choix { float:left; text-decoration:none; margin:0px; padding:0px; } .choix:hover { cursor:pointer; } /* complément non-IE */ /* Mise en forme des boutons de la barre */ .libchoix {color:black; background:cyan; font-family: verdana; font-size:10px; text-align:center; border:1px solid black; } .choix:hover .libchoix {color:white; background:gray; border-bottom-color: red;} /* 3 - Lignes des sous-menus */ a.sschoix {display:none; } .choix:hover a.sschoix {display:block;} /* Mise en forme des menus déroulants */ a.sschoix { text-decoration:none; border-style: solid;border-color:red; border-width:0 1px 1px; color:black; background:#eee; font-family: verdana; font-size:10px; text-align:center;} a.sschoix:hover {background:#bcccd2;}
Dissection de l'hybride carpo-lapinesque
La barre est en position:absolute, comme ça : et d'une, elle s'affiche par-dessus la page, et de deux, les menus se dérouleront sans perturber la page.
On lui donne une largeur (ici, c'est le minimum : 184 = 2 * (1+90+1) ) pour être certain qu'elle ne se replie
pas si on rétrécit la fenêtre.
Les div ou les a de classe choix emballent un choix principal et le sous-menu associé. En faire des flottants permet de disposer la barre de menu à l'horizontale.
La mise en forme des choix principaux se fait par les deux lignes où il est question de libchoix.
Mécanique d'apparition : au repos, les articles des sous-menus sont en display:none donc pas affichés. Lorsqu'on survole un bouton de la barre .choix:hover, il repassent en display:block et réapparaissent donc.
Note : j'ai voulu que la bordure du sous-menu, lorsqu'il apparaît, soit la même sur les quatre côtés, d'où une petite complication sur les border de .choix:hover .libchoix et a.sschoix. Si cela vous est égal, supprimez le border-bottom-color: red; dans le premier et simplifiez le second en border-width:1px; – mais là, on coupe les cheveux en fines lamelles.
Précaution anti-disparition
Selon l'endroit où vous greffez le menu, il faut aussi penser à prévenir le risque de rognage
du menu. Si par exemple le menu figure dans le bandeau supérieur, ajoutez cette ligne :
#ln_0 {overflow:visible}
Ouverture de parapluie
Normalement, tout ça marche sans accroc. Normalement
… soyez tout de même indulgent envers l'artiste ;-) et signalez-moi vos difficultés, vos suggestions, vos critiques… en commentaire.