Création d’un menu déroulant en HTML et CSS

Dans l’exercice précédent, nous avons réussi à créer un menu horizontal simple en HTML et en CSS. Je vous propose maintenant de transformer ce menu pour créer un menu déroulant, c’est-à-dire un menu comportant plusieurs niveaux.

Créer un menu déroulant en HTML et en CSS va s’avérer un peu plus complexe que de créer un menu simple à cause notamment des questions de positionnement qu’il va falloir régler.

Dans cet exercice, nous allons rester simple et nous contenter seulement d’un deuxième niveau de menu. Notez que de manière générale il est déconseillé d’aller plus loin que cela pour des raisons d’ergonomie de votre site.

L’idée ici va donc être de créer des sous-menus. Chaque sous-menu va être lié à un onglet du menu principal et ne va devoir apparaitre que lorsqu’un utilisateur passe sa souris sur l’onglet en question.

 

Squelette HTML du menu déroulant

Nous allons commencer par récupérer le code HTML de notre menu simple vu à la leçon précédente et lui rajouter des sous-menus.

Pour représenter nos sous-menus, nous allons simplement imbriquer une nouvelle liste dans les différents éléments de notre liste principale.

Squelette HTML menu déroulant HTML et CSS liste et sous liste imbriquée

Ici, nous créons un deuxième niveau de menu sous nos deux premiers onglets de menu.

Notez que j’ai rajouté des attributs class et des entités HTML   dans le code (qui servent à créer un espace double). Cela va nous être utile plus tard en CSS.

 

Mise en forme du menu déroulant en CSS

Ici, nous allons essayer de nous appuyer un maximum sur les styles du menu horizontal simple créé dans l’exercice précédent en les complétant. Vous pouvez donc déjà commencer par récupérer les styles CSS du menu créé précédemment :

Styles menu principal menu déroulant HTML et CSS

On va donc déjà vouloir par défaut cacher les sous menus et ne les afficher que lorsqu’un utilisateur passe sa souris par-dessus l’onglet de menu correspondant. Nous allons donc appliquer un display : none par défaut à nos sous-menus et un display : block lorsqu’un utilisateur passe sa souris sur l’onglet du menu principal correspondant.

On va également en profiter pour ajouter une couleur de fond aux sous-menus ainsi qu’une ombre légère autour des sous-menus pour qu’ils se distinguent du reste de la page avec box-shadow.

Définition ffichage display sous menu menu déroulant HTML et CSS

Ici, notez qu’on peut placer les styles généraux de mes sous-menus soit dans le sélecteur nav > ul li:hover .sous , soit dans le sélecteur .sous. Par défaut, on préfèrera placer les styles dans le sélecteur le plus simple et général.

Le sélecteur nav > ul li:hover .sous peut sembler complexe à première vue. Il sert à cibler un sous menu .sous lorsqu’un utilisateur passe sa souris sur un éléments li de la liste représentant notre menu principal.

Ensuite, on va vouloir que les éléments de nos sous-menus s’affichent cette fois-ci les uns en dessous des autres, occupent tout l’espace disponible dans leur conteneur et que le texte soit aligné à gauche. On va donc annuler le flottement hérité des onglets du menu principal.

Ajout float none sur nos sous menu menu déroulant HTML et CSS

On va également déjà en profiter pour mettre en forme les onglets de nos sous-menus et s’appuyant une nouvelle fois sur les styles déjà créées. Ici, on va se contenter de supprimer la bordure basse héritée du menu principal, d’ajouter une marge interne et une couleur de fond lorsqu’on passe la souris sur un élément.

Application styles CSS sous menu menu déroulant HTML et CSS

On va aussi montrer aux utilisateurs que notre menu est déroulant en ajoutant une petite flèche à côté des textes des onglets de menu qui contiennent des sous-menus. Pour cela, on va insérer le symbole ▼après le texte en utilisant le pseudo-élément ::after, ce qui va également nous permettre de définir la taille du symbole.

Ajout flèche menu déroulant HTML et CSS

Une fois arrivé ici, il nous reste un détail technique à régler qui est la partie complexe de ce menu : pour le moment, lorsqu’on affiche un sous-menu, le contenu situé sous le menu est poussé vers le bas ce qui n’est pas le comportement souhaité.

On va pouvoir régler cela en appliquant une position : absolute à nos sous-menus, ce qui va avoir pour effet de les retirer du flux normal de la page. Les sous-menus n’impacteront plus le contenu suivant le menu.

Pour que les sous-menus ne passent pas derrière le contenu qui suit le menu, nous allons également définir un z-index élevé. Nous allons également définir la taille des sous-menus à 100%.

Position absolute sur nos sous menus dans un menu déroulant HTML et CSS

Ensuite, pour replacer les sous-menus correctement sous leur onglet correspondant et pour qu’ils fassent bien la même taille, on va également appliquer une position : relative aux éléments du menu principal.

Position relative sur le menu principal pour centrer les sous menu d'un menu déroulant HTML et CSS

Voilà tout pour cet exercice ! Nous disposons maintenant d’un menu déroulant totalement fonctionnel. Vous pouvez retrouver le code complet de ce menu ci-dessous :

See the Pen Cours HTML CSS 10.5.1 by Pierre (@pierregiraud) on CodePen.

Laisser un commentaire