Julien Crego
Menu déroulant horizontal 100 % CSS
Cet article présente la création d’un menu horizontal avec des sous-menus qui s’affichent au survol, uniquement en HTML et CSS. Les couleurs et les dimensions du menu sont personnalisables.
Voici un aperçu du résultat final.
Démonstration
https://juliencrego.com/demo.html
Création de la structure HTML du menu
La première chose à faire est de construire la structure HTML du menu.
Création du premier niveau
La structure du menu repose sur une liste non ordonnée <ul>. La classe dropdownmenu permet de cibler cette liste pour la mettre en forme en CSS. Chaque lien de premier niveau est placé dans un élément <li>.
Les liens de premier niveau du menu sont ensuite insérés dans les lignes <li></li> de la liste.
HTML
<ul class="dropdownmenu"> <li><a href="#">Accueil</a></li> <li><a href="#">Menu 1</a></li> <li><a href="#">Menu 2</a></li> <li><a href="#">Menu 3</a></li></ul>Pourquoi utiliser href= »# » ?
Les liens utilisent ici href="#" pour les besoins de la démonstration. Remplacez cette valeur par l’adresse de la page correspondante dans votre site. Attention : un clic sur un lien avec href="#" peut ramener en haut de la page.
Le premier niveau du menu est en place. Vous pouvez maintenant ajouter les sous-menus.
Création des sous-menus
Pour créer un sous-menu, ajoutez une nouvelle liste <ul> à l’intérieur de l’élément <li> concerné, après son lien. Placez ensuite chaque lien du sous-menu dans un élément <li> de cette liste imbriquée.
Veillez à respecter l’imbrication et la fermeture des balises. Une indentation régulière facilite la lecture du code et le repérage des différents niveaux de liste.
HTML
<li><a href="#">Menu 2</a> <ul> <li><a href="#">Sous-Menu 2.1</a></li> <li><a href="#">Sous-Menu 2.2</a></li> <li><a href="#">Sous-Menu 2.3</a></li> <li><a href="#">Sous-Menu 2.4</a></li> </ul></li>Attention à la position de la sous-liste !
La sous-liste doit être placée à l’intérieur de l’élément <li> qui la contient, après la fermeture du lien <a>. Elle doit donc apparaître avant la balise de fermeture </li>, et non après.
Voici un exemple de menu avec deux sous-menus :
HTML
<ul class="dropdownmenu"> <li><a href="#">Accueil</a></li> <li><a href="#">Menu 1</a> <ul> <li><a href="#">Sous-Menu 1.1</a></li> <li><a href="#">Sous-Menu 1.2</a></li> <li><a href="#">Sous-Menu 1.3</a></li> <li><a href="#">Sous-Menu 1.4</a></li> </ul> </li> <li><a href="#">Menu 2</a> <ul> <li><a href="#">Sous-Menu 2.1</a></li> <li><a href="#">Sous-Menu 2.2</a></li> <li><a href="#">Sous-Menu 2.3</a></li> <li><a href="#">Sous-Menu 2.4</a></li> </ul> </li> <li><a href="#">Menu 3</a></li></ul>
La structure HTML est terminée, nous pouvons passer à la mise en forme en CSS.
Mise en forme du menu en CSS
Masquage des sous-menus
Masquez les sous-menus avec le sélecteur .dropdownmenu ul. Il cible les listes <ul> situées à l’intérieur de l’élément portant la classe dropdownmenu. La liste principale, qui porte elle-même cette classe, n’est pas concernée.
CSS
.dropdownmenu ul { display: none;}
Coloration du menu principal
Nous allons ajouter une couleur d’arrière-plan au menu principal pour le rendre visible.
CSS
.dropdownmenu { background-color: #80bdcc;}
Alignement du menu principal
Utilisez Flexbox pour disposer côte à côte les éléments du menu principal. Ce mode de disposition permet également d’ajuster leur répartition dans le menu.
CSS
.dropdownmenu { background-color: #80bdcc; display: flex; }
Suppression des puces et des marges des listes
Supprimez les puces ainsi que les marges extérieures et intérieures de la liste principale et des sous-menus.
Le sélecteur .dropdownmenu cible la liste principale, tandis que .dropdownmenu ul cible les listes des sous-menus.
Voici les règles correspondantes :
CSS
/* Pour le menu principal */.dropdownmenu { list-style-type: none; margin: 0px; padding: 0px;}/* Pour les sous-menus */.dropdownmenu ul { list-style-type: none; margin: 0px; padding: 0px;}Les propriétés étant identiques, les deux règles peuvent être regroupées en séparant les sélecteurs par une virgule.
CSS
.dropdownmenu, .dropdownmenu ul { list-style-type: none; margin: 0px; padding: 0px;}
Mise en forme des liens du menu
Définissez ensuite l’affichage, les dimensions et l’alignement des liens du menu.
display: flex: facilite le centrage du texte dans chaque lien.justify-content: center: centre le contenu horizontalement.align-items: center: centre le contenu verticalement.box-sizing: border-box: inclut les marges intérieures et les bordures dans les dimensions définies.width: var(--largeur-lien): utilise la largeur définie sur le menu principal.min-height: 40px: garantit une hauteur minimale tout en autorisant les libellés sur plusieurs lignes.padding: 8px 10px: ajoute des marges intérieures autour du texte.color: #fff: définit la couleur du texte.background-color: #317f92: définit la couleur d’arrière-plan.text-align: center: centre les lignes du libellé.text-decoration: none: supprime le soulignement.
CSS
.dropdownmenu a { display: flex; justify-content: center; align-items: center; box-sizing: border-box; width: 120px; min-height: 40px; padding: 8px 10px; color: #fff; background-color: #317f92; text-align: center; text-decoration: none;}
Nombreuses possibilités de mise en forme
Ces réglages constituent un point de départ. Vous pouvez modifier les couleurs, les dimensions et les espacements pour adapter le menu à votre site.
Sélectionner uniquement les liens du menu principal
Le sélecteur .dropdownmenu a cible tous les liens du menu, y compris ceux des sous-menus. Pour cibler uniquement les liens du premier niveau, utilisez .dropdownmenu > li > a.
Affichage des sous-menus au survol de la souris
Le sélecteur .dropdownmenu li:hover ul cible les sous-menus lorsqu’un élément qui les contient est survolé. La déclaration display: block permet de les rendre visibles.
CSS
.dropdownmenu li:hover ul { display: block;}
Vous constatez que les sous-menus s’affichent bien, mais pour cela, ils étirent l’élément principal. Il faut donc les positionner correctement.
Positionnement des sous-menus
Nous allons maintenant positionner les sous-menus de manière absolue. Ce type de positionnement va permettre de retirer les sous-menus du flux normal de la page.
CSS
.dropdownmenu li:hover ul { display: block; position: absolute;}
Affinage de la position des sous-menus
Appliquez position: relative aux éléments <li>. Ils serviront de repères pour positionner leurs sous-menus avec position: absolute. Sans décalage supplémentaire, ce réglage ne déplace pas les éléments du menu principal.
CSS
.dropdownmenu li { position: relative;}Nous pouvons maintenant ajuster le positionnement des sous-menus via le sélecteur .dropdownmenu li:hover ul
top: 100%: place le sous-menu immédiatement sous l’élément qui le contient, quelle que soit sa hauteur.left: 0: aligne son bord gauche avec celui de cet élément.z-index: 100: permet au sous-menu de passer au-dessus des éléments dont le niveau de superposition est inférieur, dans le contexte concerné.
CSS
.dropdownmenu li:hover ul { display: block; position: absolute; top: 100%; left: 0px; z-index: 100;}Personnalisation des liens des sous-menus au survol
Le sélecteur .dropdownmenu ul a:hover cible les liens des sous-menus lorsqu’ils sont survolés. Il permet ici de modifier leur couleur d’arrière-plan.
CSS
.dropdownmenu ul a:hover { background-color: #ac9933;}
.
Code complet
Voici le code HTML du menu et les règles CSS correspondantes.
Code HTML
HTML
<ul class="dropdownmenu"> <li><a href="#">Accueil</a></li> <li><a href="#">Menu 1</a> <ul> <li><a href="#">Sous-Menu 1.1</a></li> <li><a href="#">Sous-Menu 1.2</a></li> <li><a href="#">Sous-Menu 1.3</a></li> <li><a href="#">Sous-Menu 1.4</a></li> </ul> </li> <li><a href="#">Menu 2</a> <ul> <li><a href="#">Sous-Menu 2.1</a></li> <li><a href="#">Sous-Menu 2.2</a></li> <li><a href="#">Sous-Menu 2.3</a></li> <li><a href="#">Sous-Menu 2.4</a></li> </ul> </li> <li><a href="#">Menu 3</a></li></ul>Code CSS
Vous pouvez personnaliser les dimensions et les couleurs du menu en modifiant les propriétés ci-dessous.
CSS
.dropdownmenu { background-color: #80bdcc; display: flex;}.dropdownmenu ul { display: none;}.dropdownmenu,.dropdownmenu ul { list-style-type: none; margin: 0; padding: 0;}.dropdownmenu a { display: flex; justify-content: center; align-items: center; box-sizing: border-box; width: 140px; min-height: 40px; padding: 8px 10px; color: #fff; background-color: #317f92; text-decoration: none; text-align: center;}.dropdownmenu li { position: relative;}.dropdownmenu li:hover ul { display: block; position: absolute; top: 100%; left: 0; z-index: 100;}.dropdownmenu ul a:hover { background-color: #ac9933;}Exemple de personnalisation
Démonstration
https://juliencrego.com/demo.html
Sauf mention contraire*, l’article Menu déroulant horizontal 100 % CSS et son contenu par Julien Crego sont mis à disposition selon les termes de la licence Creative Commons
Attribution – Pas d’Utilisation Commerciale – Partage dans les Mêmes Conditions 4.0 International
Cette licence vous permet de remixer, arranger, et adapter cette œuvre à des fins non commerciales tant que vous créditez la source en citant le nom des auteurs et que les nouvelles œuvres sont diffusées selon les mêmes conditions.
* Cette notice est intégrée automatiquement à la fin de chaque article de ce site.

Bonjour,
Est ce normal que les fichiers code html et code css ne soient pas là? Ou c’est moi qui ne les trouve pas..?
D’avance merci pour votre réponse
Bonjour Clémence,
Oui il s’agissait bien d’un problème d’affichage qui est maintenant résolu. Merci de me l’avoir signalé !
Bonjour,
Tout d’abord, merci beaucoup pour ce tutoriel très utile !
Ma question : pour un menu déroulant avec deux niveaux de sous-menus, c’est le même principe ou il y a une subtilité supplémentaire ?
Merci par avance de votre réponse.
Oui nao,
Il est en effet possible d’appliquer le même principe sur un deuxième niveau. Voici un exemple improvisé à peaufiner : https://codepen.io/crego/pen/rNMwRjx
Bonjour, je viens de m’intéresser au menu et votre page m’a bien aidé, merci beaucoup.
Par contre, je n’arrive pas à comprendre comment faire pour que le background du menu horizontal change, merci de votre aide
Bonjour,
Désolé pour ma réponse tardive… pour modifier le background du menu, il suffit de modifier le code suivant :
.dropdownmenu {background-color: #80bdcc;
display: flex;
}
Bonjour,
Votre explication ma beaucoup aider ! En revanche, je ne sais pas comment faire quand les textes entré dans un sous-menu sont plus long.. Par exemple, j’ai un sous-menu dont le nom est « Les armes / outils et armures », mais seul « Les armes / » s’affiche dans la case du sous menu, comment réparer cela ?
Bonjour,
Si le texte est trop long et ne s’affiche pas, vous devez ajuster la largeur des menus. Il faut donc vérifier la propriété width.
Vous pouvez également la transformer en min-width pour autoriser l’élargissement en lui donnant une largeur minimal.