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

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.

S’abonner
Notification pour
guest

Ce site utilise Akismet pour réduire les indésirables. Découvrez comment les données de vos commentaires sont traitées.

8 Commentaires
Le plus ancien
Le plus récent Le plus populaire
clémence
clémence
7 années il y a

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

Nao
Nao
5 années il y a

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.

Ducale
3 années il y a

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

Alex
Alex
2 années il y a

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 ?

Dernière modification le 2 années il y a par Alex