Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
3 octobre 2007 3 03 /10 /octobre /2007 16:08

détail du 'Dragon' de Max Escher

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.

commentaires

A
Un vrai pervers ce Bren :P :)
Répondre
A
<br /> Meuh non... pourquoi tu dis ça ? Méssssante ! :-D<br /> <br /> <br />
O
Ha voilà! Je me disais bien que dans toutes les solutions compilées dans mon marque-page, certaines étaient obsolètes!<br /> Pourtant, celle de suckerfish (http://peutetreunereponse.over-blog.com/article-6167796.html) m'avaient paru des plus ancienne...<br /> <br /> Et que dire de celles-ci:<br /> http://www.jejavascript.net/menu.php<br /> http://francisek.over-blog.com/article-800522.html<br /> http://annak.over-blog.com/article-10149090.html<br /> http://photo.graph.over-blog.com/article-30589505.html<br /> http://photo.graph.over-blog.com/article-29749243.html<br /> <br /> Dépassées aussi?<br /> <br /> Je suis en privilège, et je ne voudrais pas me tromper et casser tout mon blog... Raison pour laquelle je tergiverse...<br /> <br /> Merci de cette réponse rapide!
Répondre
A
<br /> L'article de Pêur est un peu ancien, mais le menu suckerfish a progressé depuis, ainsi que les explications - je vous conseille d'aller lire directement le site de suckerfish. J'ai donné un coup de<br /> main à Djac Baweur en son temps pour implanter un tel menu, allez donc voir. Je vous conseille vraiment ce<br /> menu.<br /> <br /> Pas lu tous les articles... Les soucis sont les mêmes pour tout le monde, de toute manière.<br /> Les menus en CSS reposent tous sur le même principe : le menu principal est une liste, un sous-menu est une liste dans un item de la liste principale et ainsi de suite. Le reste est affaire de CSS<br /> pour placer tout ça, de :hover pour faire apparaître et disparaître.<br /> Là aussi il faut s'accommoder d'IE (au moins jusqu'à 7) qui ne comprend pas le ">" dans les sélecteurs. Ce ">" (exemple : .menu>li) signifie "père de". Mon exemple désigne ainsi, sans<br /> ambiguïté, un article du menu principal. IE (à confirmer pour IE8) ne comprend que "menu li". Et alors ? Alors ce sélecteur désigne TOUS les li du menu, y compris ceux des sous-menus. Si on ne veut<br /> pas multiplier les classes et si l'on veut éviter les redondances il faut donc ruser puissamment.<br /> La solution de jejavascript est simple et robuste mais demande beaucoup de clics à mon goût.<br /> Peur de casser ? Supposons que vous vouliez insérer un menu suckerfish dans l'en-tête. D'abord commencez par sauvegarder CSS et source HTML du module avant toute intervention, ça vous donnera une<br /> sortie de secours.<br /> Ensuite : vous constaterez certainement que le menu ne se déroule pas convenablement, que les sous menus "passent sous" les articles. Gardez votre calme : c'est lié aux réglages par défaut du blog.<br /> Il rogne tout ce qui dépasse, histoire de protéger les maladroits contre leur maladresse. Je postule que vous n'êtes pas maladroit, ou du moins que vous ne prenez pas votre maladresse pour un bug<br /> du blog (ce que font beaucoup de râleurs).<br /> La parade anti-rognage est<br /> #cl_0_0 {overflow:visible}et roulez jeunesse.<br /> <br /> La réponse rapide est un coup de bol, mais merci pour le mot gentil :)<br /> <br /> <br />
O
Bonjour!<br /> <br /> Je lis et relis tout ce qui concerne le menu déroulant avant de me lancer.<br /> Mais ce qui me manque dans les blogs d'aide, c'est un exemple visuel du résultat final...<br /> <br /> J'espère me lancer un jour!
Répondre
A
<br /> ..histoire de prouver que c'est faisable ? ;-) Petit résumé :<br /> <br /> Les menus déroulants devraient être simples à fabriquer.<br /> <br /> D'ailleurs ils le sont en pur CSS et sans JavaScript, mais IE7 et antérieur ne sait pas traiter le CSS requis, alors qu'IE8 en semble enfin capable.<br /> <br /> Seulement IE7, et même 6, n'est pas encore mort. De là, floraison de solutions de contournement à base de JavaScript. La plus simple, élégante et efficace est, je crois, celle de Suckerfish<br /> que présente PêUR. Autrement dit : si on est autorisé à mettre du JS (blog privilège ou premium) et si on suppose que les utilisateurs d'IE autorisent Js (ou ne savent pas le désactiver...), ce<br /> qui est vrai le plus souvent, on s'en tire encore à bon compte.<br /> <br /> Les vrais pépins surgissent lorsqu'on est en confiance, donc sans JS : un menu en pur HTML/CSS et sans JS et pour tous les navigateurs ne peut être qu'un bricolage<br /> acrobatique et précaire.<br /> <br /> La solution de PêUR (cf lien en début d'article) a le mérite de marcher en dépit de sa lourdeur<br /> <br /> La mienne, ici présentée, est valide aussi (je l'ai testée) et un peu plus économique (pas de redondance) mais repose sur une technique (les commentaires conditionnels) que ne digère pas<br /> (plus...) l'éditeur OB.<br /> <br /> Conclusions :<br /> <br /> ma jolie solution est inapplicable aujourd'hui chez OB (voir la "note désolée" en début d'article),<br /> <br /> celle de PêUR est valide mais compliquée,<br /> <br /> le choix le plus raisonnable demeure à mes yeux le menu suckerfish,<br /> <br /> le jour (un an ? deux ?) où il n'y aura plus d'utilisateurs d'IE ante-version8 on pourra enfin laisser tomber le recours au JS, et faire du pur CSS.<br /> <br /> Je sais, tout ça est agaçant : merci Microsoft....<br /> <br /> <br />
J
Alors ce sera un commentaire juste pour dire que je suis là, je passe voir s'il y a du nouveau. Mais je ne vais pas m'aventurer plus loin sur cet article là parce que j'y comprends que pouic.<br /> Bon week-end ! :)
Répondre
A
Rhooo...que pouic, vraiment ? Je suis malheureuuuuuuux ! :'-(M'enfin bon, on se fera une raison .... ;-)

Archives