Top-tuto.com : Forum: Faire un menu déroulant en CSS

Aller au contenu

Vous aimez nos tutoriels? Alors inscrivez vous pour participer au forum, afin qu'il puisse démarrer. Je compte sur vous ;-)

Basculer la shoutbox Shoutbox

Toptuto Icône : (20 février 2010 - 07:07 ) Slt
Oui, Bob-77 le forum est mort, pourquoi? parce que j'ai fais le max pour pouvoir y amener du monde ( tu as également participé a cela et je t'en remercie ), seulement ca n'a pas marché, les tutoriaux sont bien vus des milliers de fois, mais personne poste donc voila :/
pour l'instant mon temps est pris par un autre site.

Mais je t'assure que ce forum n'est pas mort définitivement, parce que j'en ai quand même passer du temps à préparer tout ca et ce n'est pas pour l'abandonner.
Toute la structure est prête pour accueillir des visiteurs... Mais il faut bien les trouver ;)

Pour ton problème xaf, poste le dans le forum programmation, car cela peux venir de plein de choses :)
xaf Icône : (20 février 2010 - 04:31 ) Voir le message Bonjour a tous, Alors voila j'ai tout simplement un problème de pour positionner une image et du texte dans le code html
BoB-77 Icône : (19 février 2010 - 07:23 ) Salut , Quel dommage mais Vraiment mort le Forum =S
BoB-77 Icône : (03 janvier 2010 - 10:48 ) °°°° Bonne Année 2 0 1 0 °°°
Toptuto Icône : (03 janvier 2010 - 10:02 ) Bonne année ;)
zerex Icône : (02 janvier 2010 - 01:21 ) Bonne Année ! =)
Toptuto Icône : (26 décembre 2009 - 07:00 ) joyeux noel un peu en retard xD
BoB-77 Icône : (24 décembre 2009 - 06:33 ) Joyeux noël a vous !
BoB-77 Icône : (22 décembre 2009 - 04:09 ) *Chat
BoB-77 Icône : (22 décembre 2009 - 04:09 ) Pour changer un peu car il y a que çà dans le Chyat xD
BoB-77 Icône : (22 décembre 2009 - 04:09 ) Ly ^^
Toptuto Icône : (21 décembre 2009 - 08:03 ) Lu :P
BoB-77 Icône : (21 décembre 2009 - 12:05 ) Lu
zerex Icône : (20 décembre 2009 - 10:10 ) lu all
BoB-77 Icône : (20 décembre 2009 - 03:58 ) Tu ne t'es pas présenter R_one = D
BoB-77 Icône : (20 décembre 2009 - 03:58 ) Il y a du monde ! ^^
Toptuto Icône : (20 décembre 2009 - 03:50 ) slt :P
R_one Icône : (20 décembre 2009 - 03:45 ) bijour tout le monde
BoB-77 Icône : (19 décembre 2009 - 02:18 ) Salut ; )
Toptuto Icône : (16 décembre 2009 - 09:41 ) slt :P
Redimensionner la zone de messages

Page 1 sur 1
  • Commencer un sujet
  • Ajouter une réponse Ajouter une réponse

Faire un menu déroulant en CSS

#1 L'utilisateur est hors-ligne   Toptuto Icône

  • Administrator
  • PipPipPip
  • Groupe : Root Admin
  • Messages : 158
  • Inscrit : 21-juillet 09

Posté 26 novembre 2009 - 16:40

Salut a tous. ;)

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 !


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... B)

Sommaire du tutoriel :

I - Le xHTML

II - Le CSS

III - CSS + Javascript

IV - Adapter


I - Le xHTML

Voilà, nous sommes partis ! :ph34r:

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.


Rappel

Voici 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.

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 :

Code : HTML

<ul>
 <li>Un premier élément de la liste</li>
 <li>Un deuxième élément de la liste</li>
</ul>


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 :
Code : HTML
<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,

Code : HTML
<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 :rolleyes: :

Code : HTML
<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. :lol:


II - Le CSS


Bon : 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. ;)

Commençons doucement :rolleyes: ...

Adaptons la forme des listes (balises <ul></ul>) ...

Code : CSS
#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) ...

Code : CSS
#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>).

Code : CSS
#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


Code : CSS
#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 ... :lol: !!!
(siffle)

Il ne reste donc plus qu'à faire réagir tout ça au passage de la souris !


III - CSS + Javascript


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

Code : CSS
#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 ?
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

Code : Javascript
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 :

Code : HTML
<!-- Faire un fichier .js et mettre entre les balises head : -->
<script type="text/javascript" src="menu.js"></script>

<!-- Ou copier le code ci-dessus dans les balises : -->
<script type="text/javascript">
<!--
METTRE LE Javascript EN COMMENTAIRES
POUR QUE LE SCRIPT SOIT VALIDE W3C
-->
</script>
<!-- Et mettre tout entre les balises head. -->
 

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 procéder :

Code : CSS
#menu li:hover ul ul, #menu li.sfhover ul ul /* Sous-sous-listes lorsque la souris passe sur un élément de liste */
{
 left: -999em; /* On expédie les sous-sous-listes hors du champ de vision */
}

#menu li:hover ul, #menu li li:hover ul, #menu li.sfhover ul, #menu li li.sfhover ul /* Sous-listes lorsque la souris passe sur un élément de liste ET sous-sous-lites lorsque la souris passe sur un élément de sous-liste */
{
 left: auto; /* Repositionnement normal */
 min-height: 0; /* Corrige un bug sous IE */
}


Lisez bien les commentaires. -_-


IV - Adapter


:angry: Ce menu ne marche pas bien avec mon site !
Que puis-je faire pour l'adapter à mon cas ?

Nous allons voir ensemble comment adapter ce menu à vos différents designs...


Largeur


Effectivement, ce menu mesure 725 pixels de large... ce n'est pas bien pratique pour les designs extensibles !

De simples modifications permettent de résoudre ce problème...

Code : CSS
#menu a 
{
 display : block; 
 padding : 0; 
 background : #000; 
 color : #fff; 
 text-decoration : none; 
 width : 144px; /* <<<<<< ICI */
}

...

#menu li ul 
{ 
 position: absolute; 
 width: 144px; /* <<<<<< ET ICI */
 visibility: hidden; 
}

...


#menu li ul ul 
{
 margin : -22px 0 0 144px ; 
 border-left : 1px solid #fff ; /* <<<<<< sans oublier ICI */
}
 

Il suffit de remplacer cette largeur en pixels par un pourcentage. ^_^
N'oubliez pas de prendre en compte la bordure d'un pixel ! Pour la hauteur, c'est la même chose. ;)


Couleur


J'ai choisi de mettre le menu en noir et blanc, mais il ne tient qu'à vous de modifier les couleurs. :P

Code : CSS
#menu a 
{
 display : block; 
 padding : 0; 
 background : #000; /* Couleur du fond, actuellement = noir */
 color : #fff; /* Couleur du texte, actuellement = blanc */
 text-decoration : none; 
 width : 144px; 
}

/* Inversement des couleurs lorsque la souris passe */

#menu a:hover 
{
 color : #000; /* Noir */
 background : #fff; /* Blanc*/
}
 



Images et transparence


Encore plus fort, il est très facile de mettre des images comme fond dans le menu.

De plus, pour donner un effet de transparence, vous pouvez mettre une image en partie transparente et rajouter :

Code : CSS
#menu li ul li a 
{
 background : transparent url("adresse de l'image transparente") repeat ;
}


Essayez, c'est facile à faire et cela peut avoir un bon rendu. ^_^


Optimisation


Vos pages sont déjà très lourdes ? Vous avez peur de ralentir la navigation de vos visiteurs ?

Astuce : utilisez les commentaires conditionnels !

Vous ne connaissez pas ?
Ce tutoriel pourra vous aider : cliquez ici.

Utilisez-les de manière à ce que le Javascript ne soit là que pour les utilisateurs d'Internet Explorer.

Exemple :

Code : HTML
<!--[if lte IE 6]>
Le javascript du menu déroulant ...
<![endif]-->

Ce commentaire conditionnel n'affiche le javascript que pour les versions d'Internet Explorer inférieures ou égales à 6.


Flash


Lorsque le menu se déroule à hauteur d'une application flash, les sous menus passent sous l'application et ne sont pas visibles. Ainsi le menu ne peut pas se dérouler s'il est trop près d'une application Flash.

Pour les dernières versions de Mozilla Firefox, d'Internet Explorer, de Google Chrome etc, il existe une solution qui consiste à rajouter un paramètre à l'application. Il faut utiliser le paramètre wmode avec l'attribut soit transparent : wmode="transparent", soit en opaque en appliquant un z-index à l'object.

Voici un exemple concret avec une vidéo YouTube :



Si vous ne trouvez pas où mettre wmode="transparent", vous pouvez rajouter entre les balises <object></object> :

Code : HTML
<param name="WMODE" value="transparent" ></param>

Ou :

Code : HTML
<param name="WMODE" value="transparent" />


Cette astuce n'est cependant pas compatible avec les anciennes versions des navigateurs. Si c'est possible, je vous conseille donc de ne pas coller d'application Flash sous le menu déroulant.


D'autres problèmes avec le menu déroulant ? Demandez des conseils sur le Forum, lisez les commentaires de ce tutoriel et documentez vous... Voilà, c'est déjà la fin !

J'espère que ce tuto vous aura aidés à réaliser un menu déroulant pour votre site, cela fait toujours très pro. ^_^


@+ B)

Ps : Vous avez apprécié ce tutoriel et vous avez trouvé des astuces d'adaptation, des soucis de compatibilité, des améliorations possibles ... ? N'hésitez pas à me prévenir pour les partager.


Merci

Original par : Toinouz du Site du Zéro

License Creative Commons by-nc-sa

0



Réponse rapide

  

1 utilisateur(s) sur ce sujet
0 invité(s) et 1 utilisateur(s) anonyme(s)