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

Un menu déroulant en CSS

Les menus déroulants sont désomais parties intégrantes des interfaces web réussies. Ils participent à  une navigation simplifiée en proposant une vision complete de l'accès aux contenus. 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 (<xoopsRoot>/themes/montheme/) :

<!--//--><![CDATA[//><!--
sfHover = function()
{
var sfEls = document.getElementById("nav").getElementsByTagName("LI");
for (var i=0;i<sfEls.length; i++) {
sfEls[i].onmouseover=function(){
this.className+="sfhover";
}
sfEls[i].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 :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<{$xoops_langcode}>" lang="<{$xoops_langcode}>">
<head>
<meta ...>
...
<title><{$xoops_sitename}> - <{$xoops_pagetitle}></title>
...
<{$xoops_module_header}>
<script type="text/javascript">
<!--<{$xoops_js}>-->
</script>
<script language="JavaScript" src="<{$xoops_imageurl}>menu.js"></script>
</head>
<body>
...

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 vertical 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 :

<div id="container">
<ul id="nav">
<li><a href='<{$xoops_url}>/'>Accueil</a></li>
<li><a href='<{$xoops_url}>/modules/smartfaq/'>FAQ</a></li>
<li><a href='<{$xoops_url}>/modules/newbb/'>Forum</a></li>
...
</ul>
</div>

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

<div id="container">
<ul id="nav">
<li><a href='<{$xoops_url}>/'>Accueil</a></li>
<li><a href='<{$xoops_url}>/modules/smartfaq/' class="daddy">FAQ</a>
<ul>
<li><a href='<{$xoops_url}>/modules/smartfaq/category.php?categoryid=1'>catégorie 1</a></li>
<li><a href='<{$xoops_url}>/modules/smartfaq/category.php?categoryid=2'>catégorie 2</a></li>
</ul>
</li>

<li><a href='<{$xoops_url}>/modules/newbb/' class="daddy">Forum</a>
<ul>
<li><a href='<{$xoops_url}>/modules/newbb/index.php?cat=1'
class="daddy">catégorie 1</a>
<ul>
<li><a href='<{$xoops_url}>/modules/newbb/viewforum.php?forum=1'">cat 1 forum1</a></li>
<li><a href='<{$xoops_url}>/modules/newbb/viewforum.php?forum=2'">cat 1 forum2</a></li>
</ul>

</li>
<li><a href='<{$xoops_url}>/modules/newbb/index.php?cat=1'
class="daddy">catégorie 2</a>
<ul>
<li><a href='<{$xoops_url}>/modules/newbb/viewforum.php?forum=3'">cat 2 forum1</a></li>
<li><a href='<{$xoops_url}>/modules/newbb/viewforum.php?forum=4'">cat 2 forum2</a></li>
</ul>

</li>
</ul>

</li>
...
</ul>
</div>

Mise au point des définitions CSS

Vous pouvez copier les définitions suivante dans vos fichier 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 :

par Romuald Besset 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>