Un menu déroulant en CSS
Catégorie : Thèmes et templates

Un menu déroulant en CSS

Une précédente ressource a été adaptée à  XOOPS : le menu DHTML TigraMenu.Si ce menu proposait une réelle solution, il comportait néanmoins quelques défauts :

Les recherches des graphistes et les ressources qui en résultent se portent de plus en plus vers le respect des normes CSS. Nous remercions Pompage.net pour leur traduction des Menus déroulants Suckerfish de Patrick Griffiths et Dan Webb que nous avons adapté à  notre thême XOOPS. Nous en avons pris la version la plus complexe : le menu déroulant à  trois niveaux.

Voici deux arguments en sa faveur qui ont attirés notre attention :

Insertion du javascript

Le javacript du menu déroulant doit être intégré dans la balise HEAD de votre thême. Si vous désirez en fait un script dédié copiez le code suivant dans un fichier menu.js à  placer dans le répertoire de votre thême (/themes/montheme/) :

sfHover = function()
{
var sfEls =
document.getElementById("nav").getElementsByTagName("LI");
for (var i=0;i sfEls.onmouseover=function(){
this.className+="sfhover";
}
sfEls.onmouseout=function(){
this.className=this.className.replace(new RegExp(" sfhover\\b"), "");
}
}
}
if (window.attachEvent) window.attachEvent("onload", sfHover);

Ce script analyse la balise identifiée "nav" et y traite les balises LI. Il en modifie, selon le contexte, le nom de la classe CSS pour la liste en cours.

Dans votre thême, ouvrir le fichier theme.html et y placer le code suivant pour insérer le javascript :
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
xmlns="http://www.w3.org/1999/xhtml"
xml:lang="<{$xoops_langcode}>"
lang="<{$xoops_langcode}>">


...
<{$xoops_sitename}><br />- <{$xoops_pagetitle}>
...
<{$xoops_module_header}>
type="text/javascript">


language="JavaScript"
src="<{$xoops_imageurl}>menu.js">



...

Insertion du contenu du menu

Le menu que nous allon mettre en place propose 3 niveaux :

  • le premier niveau est un menu horizontal
  • le second niveau est un menu certical en dessous de l'option parente.
  • le troisiême niveau est un autre menu vertical à  droite de l'option parente.

Dans une balise DIV conteneur, la liste UL identifiable pas le javascript (donc d'id = "nav"), nous allons donc imbriquer les listes le liens qui constitueront le menu.

Niveau 1 : le menu horizontal.

Il s'agit simplement d'une liste classique à  positionner aprês le header de votre thême :

id="container">


NB : la DIV peut être placée dans une table, bien que l'utilisation des tables soit à  proscrire pour le positionnement.

Niveau 2 et 3 : les sous menus.

Pour ajouter un sous menu, il faut :
- Affecter la classe "daddy" à  l'option parente
- Insérer la liste de niveau inféreur dans la balise LI correspondante.
En noir : le niveau 1
En bleu : le niveau 2 ou la classe qui va l'autoriser
En vert : le niveau 3 ou la classe qui va l'autoriser
En gras, les balises délimitant les options




Mise au point des définitions CSS

Vous pouvez copier les définitions suivante dans vos fichiers Style.css


/* menu */
#container {
width: 100%;
background:
#6699cc;
text-align: left;
}
/* niveau1*/
#nav, #nav ul {
float: left;
width: 100%;
list-style-type:
none;
background:
#6699CC;
font-weight: bold;
}
#nav a {
display: block;
width: 130px;
color: white;
text-decoration:
none;
padding: 2px 0px
2px;
}
#nav a.daddy {
/* pour mettre un
flêche de suivit des sous menus*/
/* background:
url(rightarrow2.gif) center right no-repeat; */
}
#nav li {
list-style-type:
none;
float: left;
padding: 0;
width: 130px;
height:11px:
}
/* niveau2*/
#nav li ul {
position: absolute;
left: -999em;
height: auto;
width: 130px;
font-weight:
normal;
margin: 0;
}
#nav li li {
list-style-type:
none;
padding-right: 2px;
width: 128px;
height:11px:
}
#nav li ul a {
width: 128px;
}
/* niveau3*/
/* Décalé
í  gauche et remonté à  coté de la ligne en
cours */
#nav li ul ul {
margin: -20px 0 0 130px;
}
/* Positions
'invisible' : ne pas toucher */
#nav li:hover ul ul,
#nav li:hover ul ul ul, #nav li.sfhover ul ul, #nav li.sfhover ul ul
ul {
left: -999em;
}
#nav li:hover ul,
#nav li li:hover ul, #nav li li li:hover ul, #nav li.sfhover ul, #nav
li li.sfhover ul, #nav li li li.sfhover ul {
left: auto;
}
/* Couleur bloc
survol */
#nav li:hover, #nav
li.sfhover {
background: #eda;
}
/* padding bloc
survol */
#nav li:hover ul,
#nav li.sfhover ul {
padding-right :
2px;
}

Attention ! il est important de bien tester les modifications relatives à  tout ce qui touche aux positionnements : width, padding, margin, height
En effet, un simple défaut de jointure des blocs peut entraiter la perte de l'affichage du sous menu (hover)
Voici des exemples de résultat :

Firefox 1.0 :



Internet Explorer 6.0 :



(Romu aka R&B de WDForge.org)

<a href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/" title="Licence, certains droits réservés"><img src="http://www.frxoops.org/images/cdr_bouton.gif" alt="Licence, certains droits réservés" /></a>