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

Après un menu horizontal simple, un menu horizontal sticky, un menu horizontal déroulant et un menu utilisant le flexbox, nous arrivons finalement à notre dernier exercice de création de menu dans lequel nous allons cette fois-ci essayer de créer un menu responsive, c’est-à-dire un menu dont la disposition va s’adapter en fonction de l’écran de chaque visiteur.

Nous n’allons pas ici pouvoir créer quelque chose de parfait. En effet, idéalement, nous voudrons utiliser du JavaScript afin de déclencher l’ouverture et la fermeture du menu mobile. Cependant, nous allons pouvoir déjà faire de belles choses en n’utilisant que du HTML et du CSS !

Ici, nous allons à nouveau nous inspirer de la dernière version de notre menu utilisant le flexbox et modifier certains styles en se concentrant cette fois-ci sur la partie mobile qu’on va vouloir définir comme version standard du menu.

Pour rappel, le code de notre dernier menu flexible était le suivant :

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

 

Choix esthétiques pour la version mobile

Lorsqu’on se lance dans un projet de développement, il est important de commencer par définir les « spéc » (spécifications techniques) du projet en question avant de commencer à coder.

En effet, le fait de savoir précisément ce qu’on souhaite obtenir et de définir les différentes choses qu’on va pouvoir utiliser pour l’obtenir évite de faire des allers-retours dans son code, d’en supprimer des parties, d’en modifier d’autres et etc. et fait au final gagner beaucoup de temps.

Pour notre menu mobile, nous avons deux spécifications majeures : nous voulons que les éléments de menu s’affichent en colonne et voulons également que le menu soit replié par défaut pour éviter qu’il ne consomme trop de place sur l’écran.

 

Squelette HTML du menu responsive

Ici, nous allons récupérer le squelette HTML de notre menu déroulant utilisant le flexbox.

Nous allons toutefois ajouter deux choses à ce code HTML : une balise meta name="viewport" que nous avons découvert dans cette partie ainsi qu’un label avec un élément input type="checkbox" associé qui vont nous servir de « hack » pour nous permettre de déplier et de replier le menu.

L’idée ici va être de n’afficher le menu que si la case a été cochée et de le cacher à nouveau dès que celle-ci est décochée.

Squelette menu HTML CSS responsive flexbox

 

Styles CSS du menu responsive

Nous allons donc ici commencer par définir la version de mobile de notre menu qui sera sa version standard. Nous utiliserons ensuite les Media Queries pour définir une version pour grands écrans.

La première chose que l’on va faire ici va être d’appliquer un display : none à notre élément de liste représentant notre menu puisqu’on veut que celui-ci soit caché par défaut.

Nous allons vouloir afficher le menu seulement lorsque notre case à cocher a été effectivement cochée. Dans ce cas-là, nous lui appliquerons un display : flex et un flex-flow : column wrap pour que les éléments s’affichent bien en colonne. Nous allons également déjà en profiter pour appliquer une couleur de fond à tout notre menu.

Pour faire cela en CSS, nous allons utiliser la pseudo-classe :checked qui va nous permettre d’appliquer des styles seulement lorsqu’un élément a été coché. Ici, on veut afficher notre menu lorsque notre case à cocher a été cochée. On va donc appliquer notre pseudo-classe au sélecteur nav input[type=checkbox] et allons pouvoir utiliser le symbole + pour appliquer les styles à notre menu puisque l’élément ul suit directement notre élément input.

Ajout d'un display flex au menu mobile

Nous avons lié notre input à un label en HTML grâce aux attributs for et id. Cela signifie qu’il suffit à un utilisateur de cliquer sur le label pour cocher et décocher la case. Cela va donc nous permettre de ne pas afficher la case mais d’afficher uniquement le label.

On va vouloir que le label occupe toute la largeur disponible à l’écran. Pour cela, on lui appliquer un display : inline-block et on lui passe une largeur égale à 100% de son élément conteneur. Par ailleurs, nous conservons les styles liés à l’élément nav de notre précédent menu qui nous conviennent très bien.

On utilise le CSS pour que la case à cocher servant à déplier le menu mobile occupe tout l'espace du menu

Voilà pour la première partie du menu. Ensuite, nous allons supprimer tout ce qui dépend de la pseudo classe :hover. En effet, les mobiles ne disposent pas de curseur puisque les écrans sont tactiles et donc cette pseudo classe ne fait aucun sens pour la navigation sur mobile.

De gros changements vont être faits ici par rapport à notre version de menu précédente. Nous allons ici vouloir afficher l’intégralité du contenu de nos sous menus en toute circonstance.

On va donc en profiter pour supprimer ce qui était lié aux propriétés position. Pour ne pas que l’affichage de notre menu pousse les autres éléments vers le bas, nous allons plutôt appliquer une position : absolute au div class="conteneur-nav" créé pour cela ainsi qu’une largeur égale à 100%.

On va également en profiter pour supprimer les styles liés au pseudo-élément ::after.

On applique une position absolute à l'élément nav pour le menu

On définit les styles des sous menus HTML et CSS

Voilà tout pour notre version mobile. Il n’y a plus qu’à s’occuper de la version bureau qu’on avait déjà concrètement créée lors du dernier exercice.

Nous allons utiliser ici les Media Queries et cibler en particulier les appareils qui ont un écran de taille supérieure à 980px. Pour ces écrans, on va vouloir que notre menu s’affiche de la même manière que lors de l’exercice précédent.

Utilisation des media queries pour définir des styles différents pour le menu HTML et CSS en fonction de l'écran

Pour minimiser la taille de notre code et économiser un maximum nos ressources, nous n’allons pas faire de copier-coller du menu précédent ici (ce qui dans tous les cas ne fonctionnerait pas bien car nous avons modifié la structure HTML du menu) mais ne préciser que les styles qui doivent changer.

Ici, nous allons déjà nous occuper des éléments qui ont été rajoutés pour le menu mobile. Nous allons passer une position : static à notre div class="conteneur-nav" afin qu’il n’interfère pas avec notre menu et un display : none à notre label et à notre input. On ne peut pas donner de display : none à notre div ici car celui-ci contient tout notre menu.

On ajoute une position static à notre menu responsive HTML et CSS

Nous allons ensuite rendre à notre menu principal sa disposition en ligne. Ici, il faut également faire bien attention à gérer le cas où un utilisateur s’amuse à jouer avec la taille de la fenêtre et où la case à cocher a été cochée avant que le menu ne se transforme en sa version bureau. On va donc également appliquer un flex-flow : row wrap lorsque c’est le cas pour que notre menu s’affiche bien dans tous les cas.

On modifie les propriétés CSS du menu HTML pour le rendre responsive avec les media queries

Aucun piège pour le reste du menu principal : on se contente de rétablir les styles utilisés dans l’exercice précédent avec notamment l’utilisation de la propriété position :

On applique les styles aux éléments du menu responsive HTML et CSS

Le dernier petit « piège » va se trouver dans le sélecteur qui cible nos sous-menus pour les afficher en colonne lorsque l’utilisateur passe sur un élément du menu principal : on utilise le symbole > dans ce sélecteur qui va cibler les enfants directs.

Ici, il faut bien se souvenir qu’on a imbriqué un élément div entre notre nav et notre menu principal ul. Il faudra donc le mentionner au milieu de ce sélecteur.

On applique les styles CSS aux éléments des sous menus du menu responsive HTML et CSS

Voilà, notre menu est cette fois-ci définitivement terminé et il va être compliqué d’aller plus loin avec le HTML et le CSS.

Si cet exercice vous a semblé compliqué, encore une fois, ne vous inquiétez pas : c’est tout à fait normal ! Ce menu utilise plusieurs fonctionnalités parmi les plus avancées du HTML et du CSS et il est normal que vous n’ayez pas encore tout à fait assimilé comment toutes ces fonctionnalités peuvent fonctionner ensemble.

Encore une fois, l’assimilation et la compréhension ne pourra se faire complétement qu’en pratiquant régulièrement et en se confrontant aux difficultés et en cherchant toujours à comprendre les différents comportements obtenus.

Vous pourrez trouver le code complet du menu ci-dessous :

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

Laisser un commentaire