Créer un menu horizontal déroulant en CSS
Formation
En Semi-présenciel Paris
Description
-
Typologie
Formation
-
Méthodologie
En semi-présentiel
-
Lieu
Paris
Grâce à cette formation vous pourrez acquérir les connaissances nécessaires qui vous permettrons d’ajouter des compétences à votre profil et obtenir de solides aptitude qui vous offriront de nombreuses opportunités professionnelles.
Les sites et dates disponibles
Lieu
Date de début
Date de début
Les Avis
Le programme
Salut les zéros. ;)
Je vais aujourd'hui essayer de vous aider à créer un menu déroulant pour votre site ! :)
Ce menu déroulant est réalisé en xHTML/CSS, et utilise un brin de Javascript pour permettre une compatibilité avec les anciennes versions d'Internet Explorer.
Il a été testé sous Internet Explorer 6, Internet Explorer 7, Internet Explorer 8, Mozilla Firefox 2, Mozilla Firefox 3, Google Chrome ou encore Opéra et Safari !
De plus, il est valide xHTML strict !
Pour pouvoir réaliser ce menu déroulant, vous devez avoir lu le tutoriel de M@teo21 : Site Web !
Le niveau bac + 4 est aussi demandé !
Une fois ce tutoriel terminé, vous serez capables de réaliser un menu comme celui-ci, ou un beaucoup plus beau. :p
Bonne chance à vous... ^^
Le xHTMLVoilà, nous sommes partis ! :zorro:
Pour commencer ce tutoriel, nous allons étudier la structure xHTML à mettre en place.
Pour réaliser le menu déroulant, nous allons utiliser les balises de listes et non les tableaux.
RappelVoici comment se compose une liste en xHTML :
<ul></ul> liste à puces non numérotée ;
<ol></ol> liste à puces numérotée ;
<li></li> élément de liste.
(Je ne parle pas des listes de définitions intentionnellement pour ne pas créer de confusion, mais vous pouvez retrouver la liste de ces balises avec des exemples dans la partie annexe du tuto Site Web sur les balises xHTML.)
Nous n'utiliserons pas les listes à puces numérotées pour une question d'esthétique. ;)
Nous nous retrouvons donc avec les balises <ul></ul> et <li></li>.
Utilisées de cette manière :
Imaginez que l'on désire un menu déroulant en plusieurs parties :
accueil ;
membres ;
images ;
téléchargements ;
plus.
Voilà alors le code xHTML que l'on doit utiliser :
<ul> <li> <a href="#">accueil</a> </li> <li> <a href="#">membres</a> </li> <li> <a href="#">images</a> </li> <li> <a href="#">téléchargements</a> </li> <li> <a href="#">plus</a> </li> </ul>Imaginez maintenant transformer cette liste, en liste contenant des listes. :D
1, 2, 3, :magicien:
<ul id="menu"> <li> <a href="#">accueil</a> </li> <li> <a href="#">membres</a> <ul> <li><a href="#">connexion</a></li> <li><a href="#">inscription</a></li> </ul> </li> <li> <a href="#">images</a> <ul> <li> <a href="#">photos</a> </li> <li> <a href="#">vidéos</a> </li> </ul> </li> <li> <a href="#">téléchargements</a> <ul> <li><a href="#">vidéos</a></li> <li><a href="#">musiques</a></li> </ul> </li> <li> <a href="#">plus</a> <ul> <li><a href="#">forum</a></li> <li><a href="#">liens</a></li> <li><a href="#">nous contacter</a></li> <li><a href="#">team</a></li> <li><a href="#">recherche</a></li> </ul> </li> </ul>Mais si on veut encore plus développer le menu déroulant ^^ :
<ul id="menu"> <li> <a href="#">accueil</a> </li> <li> <a href="#">membres</a> <ul> <li><a href="#">connexion</a></li> <li><a href="#">inscription</a></li> </ul> </li> <li> <a href="#">images</a> <ul> <li> <a href="#">photos</a> <ul> <li><a href="#">catégorie 1</a></li> <li><a href="#">catégorie 2</a></li> </ul> </li> <li> <a href="#">vidéos</a> </li> </ul> </li> <li> <a href="#">téléchargements</a> <ul> <li><a href="#">vidéos</a></li> <li><a href="#">musiques</a></li> </ul> </li> <li> <a href="#">plus</a> <ul> <li><a href="#">forum</a></li> <li><a href="#">liens</a></li> <li><a href="#">nous contacter</a></li> <li><a href="#">team</a></li> <li><a href="#">recherche</a></li> </ul> </li> </ul>Nous allons donc créer un fichier CSS afin que la liste de base soit horizontale, et qu'au passage de la souris sur l'un des éléments de cette liste, la liste contenue dans cet élément soit à son tour affichée... Et ainsi de suite.
(J'ai mis id="menu" afin de travailler uniquement sur cette liste et donc ne pas déformer les autres listes de votre site. De plus ce sera utile pour le CSS.)
En avant, le plus dur facile est derrière nous. :pirate:
Le CSSBon : si vous avez essayé le code xHTML précédent, vous avez alors tout de suite vu que ce n'était qu'une liste qui contient des listes dans ses éléments. C'est pour cela que les CSS doivent intervenir afin de mettre en forme l'ensemble. ;)
(Je vous conseille de revoir vos connaissances en CSS si vous avez des doutes.)
Commençons doucement :-° ...
Adaptons la forme des listes (balises <ul></ul>) ...
#menu, #menu ul /* Liste */ { padding : 0; /* pas de marge intérieure */ margin : 0; /* ni extérieure */ list-style : none; /* on supprime le style par défaut de la liste */ line-height : 21px; /* on définit une hauteur pour chaque élément */ text-align : center; /* on centre le texte qui se trouve dans la liste */ } #menu /* Ensemble du menu */ { font-weight : bold; /* on met le texte en gras */ font-family : Arial; /* on utilise Arial, c'est plus beau ^^ */ font-size : 12px; /* hauteur du texte : 12 pixels */ }... le contenu des listes (balises de liens) ...
#menu a /* Contenu des listes */ { display : block; /* on change le type d'élément, les liens deviennent des balises de type block */ padding : 0; /* aucune marge intérieure */ background : #000; /* couleur de fond */ color : #fff; /* couleur du texte */ text-decoration : none; /* on supprime le style par défaut des liens (la plupart du temps = souligné) */ width : 144px; /* largeur */ }... et les éléments des listes (balises <li></li>) et les listes (balises <ul></ul>).
#menu li /* Éléments des listes */ { float : left; /* pour IE qui ne reconnaît pas "transparent" */ border-right : 1px solid #fff; /* on met une bordure blanche à droite de chaque élément */ } /* IE ne reconnaissant pas le sélecteur ">" */ html>body #menu li { border-right: 1px solid transparent ; /* on met une bordure transparente à droite de chaque élément */ } #menu li ul /* Sous-listes */ { position: absolute; /* Position absolue */ width: 144px; /* Largeur des sous-listes */ left: -999em; /* Hop, on envoie loin du champ de vision */ } #menu li ul li /* Eléments de sous-listes */ { /* pour ie qui ne reconnaît pas "transparent" (comme précédemment) */ border-top : 1px solid #fff; /* on met une bordure blanche en haut de chaque élément d'une sous-liste */ } /* IE ne reconnaissant pas le sélecteur ">" */ html>body #menu li ul li { border-top : 1px solid transparent; /* on met une bordure transparente en haut de chaque élément */ } #menu li ul ul { margin : -22px 0 0 144px ; /* On décale les sous-sous-listes pour qu'elles ne soient pas au dessus des sous-listes */ /* pour IE qui ne reconnaît pas "transparent" (comme précédemment) */ border-left : 1px solid #fff ; /* Petite bordure à gauche pour ne pas coller ... */ } /* IE ne reconnaissant pas le sélecteur ">" ... je me répète ;-) */ html>body #menu li ul ul { border-left : 1px solid transparent ; /* on met une bordure transparente sur la gauche de chaque élément */ }IE : Internet Explorer
Aidez-vous des commentaires pour comprendre ! ;)
Code CSS complet#menu, #menu ul /* Liste */ { padding : 0; /* pas de marge intérieure */ margin : 0; /* ni extérieure */ list-style : none; /* on supprime le style par défaut de la liste */ line-height : 21px; /* on définit une hauteur pour chaque élément */ text-align : center; /* on centre le texte qui se trouve dans la liste */ } #menu /* Ensemble du menu */ { font-weight : bold; /* on met le texte en gras */ font-family : Arial; /* on utilise Arial, c'est plus beau ^^ */ font-size : 12px; /* hauteur du texte : 12 pixels */ } #menu a /* Contenu des listes */ { display : block; /* on change le type d'élément, les liens deviennent des balises de type block */ padding : 0; /* aucune marge intérieure */ background : #000; /* couleur de fond */ color : #fff; /* couleur du texte */ text-decoration : none; /* on supprime le style par défaut des liens (la plupart du temps = souligné) */ width : 144px; /* largeur */ } #menu li /* Elements des listes */ { float : left; /* pour IE qui ne reconnaît pas "transparent" */ border-right : 1px solid #fff; /* on met une bordure blanche à droite de chaque élément */ } /* IE ne reconnaissant pas le sélecteur ">" */ html>body #menu li { border-right: 1px solid transparent ; /* on met une bordure transparente à droite de chaque élément */ } #menu li ul /* Sous-listes */ { position: absolute; /* Position absolue */ width: 144px; /* Largeur des sous-listes */ left: -999em; /* Hop, on envoie loin du champ de vision */ } #menu li ul li /* Éléments de sous-listes */ { /* pour IE qui ne reconnaît pas "transparent" (comme précédemment) */ border-top : 1px solid #fff; /* on met une bordure blanche en haut de chaque élément d'une sous liste */ } /* IE ne reconnaissant pas le sélecteur ">" */ html>body #menu li ul li { border-top : 1px solid transparent; /* on met une bordure transparente en haut de chaque élément */ } #menu li ul ul { margin : -22px 0 0 144px ; /* On décale les sous-sous-listes pour qu'elles ne soient pas au dessus des sous-listes */ /* pour IE qui ne reconnaît pas "transparent" (comme précédemment) */ border-left : 1px solid #fff ; /* Petite bordure à gauche pour ne pas coller ... */ } /* IE ne reconnaissant pas le sélecteur ">" ... je me répète ;-) */ html>body #menu li ul ul { border-left : 1px solid transparent ; /* on met une bordure transparente sur la gauche de chaque élément */ }Fiou ... :-° !!!
(siffle)
Il ne reste donc plus qu'à faire réagir tout ça au passage de la souris ! :D
CSS + JavaScriptBon : c'est bien beau, mais ce que nous avons fait avant n'a rien de déroulant.
Il faut faire réagir le menu au passage de la souris !
Hop ! Au passage de la souris sur l'un des contenus des listes (balises de liens), inversons les couleurs :
#menu a:hover /* Lorsque la souris passe sur un des liens */ { color: #000; /* On passe le texte en noir... */ background: #fff; /* ... et au contraire, le fond en blanc */ }C'est facile : pour faire dérouler le menu au passage de la souris, il suffit d'utiliser à nouveau :hover, non ? :lol:
Oui et non, car les anciennes versions d'Internet Explorer n'acceptent la pseudo-classe :hover que sur les liens ...
Or, un menu déroulant interdit aux anciennes versions d'Internet Explorer... ce n'est pas le mieux que l'on puisse faire.
Nous allons donc devoir utiliser une pincée de Javascript (astuce trouvée dans ce tutoriel).
sfHover = function() { var sfEls = document.getElementById("menu").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);Importez le code ci-dessus sur chaque page où sera installé le menu déroulant.
Pour cela, deux solutions :
Ce code écrit en Javascript va mettre automatiquement une classe (sfHover) aux éléments de nos listes.
Au passage de la souris, cette classe est alors retirée. Cela nous permet donc de faire réagir facilement le menu. ;)
Voilà comment nous allons...
Créer un menu horizontal déroulant en CSS
