Fork me on GitHub

Documentations > Développeurs > Thèmes et templates > Un menu déroulant en CSS

Un menu déroulant en CSS


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 :

  • son poids, avec quelques 10 ko dejavascript, on ne pouvait le prendre en exemple.
  • son positionnement calculédans le navigateur. Ainsi les thêmes devaient obligatoirement prévoir une zone fixe pour son affichage, chose pas trés simple à  obtenir selon les navigateurs.

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 :

  • Le javascript utilisé par ce menu tiens en quelques 10 lignes soit 433 octets. Le contenu sera ensuite constitué d'une sucession de balises UL, LI et A au sein d'une DIV. Le poids total d'un tel menu ne dépends donc pratiquement plus que de son contenu !
  • Le fait de positionner le menu dans une balise DIV l'intêgre natuellement dans la page html. A partir de là , le thême n'a plus à  réserver de la place à  son affichage, le menu se positionne automatiquement dans la page à  l'endroit voulu.

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)

Licence, certains droits réservés
Partager Twitter Partagez cette article sur GG+
  Voir cet article en format PDF Imprimer cet article Envoyer cet article

Naviguer à travers les articles
Menus Xoops compatibles CSS Article suivant
Propulsé avec XOOPS | Graphisme adapté par Tatane, Grosdunord, Montuy337513

71 Personne(s) en ligne (1 Personne(s) connectée(s) sur Documentations) | Utilisateur(s): 0 | Invité(s): 71 | Plus ...