Créer un menu horizontal simplissime en CSS

L’objectif de ce tutoriel est de créer un menu horizontal en CSS, le plus simplement possible.

Ci-dessous un exemple de ce que nous allons faire… Vous aurez évidemment la possibilité de choisir vos propres couleurs…

Démonstration
http://exemple.com/index.html

Construction pas à pas

Mise en place du code HTML

La première chose à faire est de construire le code HTML de notre menu. Pour cela, nous allons tout simplement créer une liste à puces avec un lien par ligne.

Nous ajoutons ensuite une class="menu" qui va nous permettre de cibler le menu ainsi que les éléments qui le composent avec CSS.

<ul class="menu">
    <li>
        <a href="accueil.html">Accueil</a>
    </li>
    <li>
        <a href="films.html">Films</a>
    </li>
    <li>
        <a href="musiques.html">Musiques</a>
    </li>
</ul>
Mise en place du HTML
Mise en place du HTML

Positionnement horizontal des liens

Dans une précédente version de ce tutoriel, je construisais cet exemple avec la propriété CSS display: inline-block;. Dans cette mise à jour, je vais plutôt utiliser un positionnement flexible, ce sera légèrement plus compliqué, mais offrira beaucoup plus de possibilités d’alignement.

Nous allons donc faire en sorte de positionner les différents liens les uns à côté des autres. Pour cela, nous utiliserons le sélecteur .menu pour manipuler l’élément <ul>.

Commençons donc par transformer notre liste en boîte flexible avec flexbox avec la propriété display: flex;.

Nous en profitons ensuite pour supprimer les marges internes qui sont présentes par défaut dans les listes à puces padding: 0 ;.

Et nous finissons en ajoutant une couleur d’arrière-plan avec background-color: #ccc;. Si vous souhaitez en savoir plus sur les couleurs, vous pouvez consulter l’article dédié les couleurs en CSS.

.menu {
    display: flex;              /* Transformation en flexbox */
    padding:0;                  /* Suppression des marges internes */
    background-color: #ccc;     /* Ajout de la couleur d'arrière-plan */
}
Transformation en boîte flexible
Transformation en boîte flexible

Suppression des puces

Comme vous pouvez le voir, les liens se positionnent bien les uns à côté des autres, mais les puces sont toujours là, il faut donc les enlever.

Pour cela, nous allons utiliser le sélecteur .menu li pour manipuler les différentes lignes de la liste. Ce sélecteur correspond à tous les éléments HTML <li> qui se trouvent à l’intérieur de l’élément avec la classe .menu.

.menu li {
    list-style-type: none ;       /* Suppression des puces */
}
Suppression des puces
Suppression des puces

Dimensions des liens

Nous allons maintenant travailler directement sur les liens avec le sélecteur .menu a. Ce sélecteur correspond à tous les éléments HTML <a> qui se trouvent à l’intérieur de l’élément avec la classe .menu.

Nous commençons par transformer les liens en éléments de type block (cf. Les niveaux ou types d’éléments en HTML) pour pouvoir les dimensionner facilement.

Je vous recommande la propriété min-width pour dimensionner les liens. L’avantage de min-width par rapport à width est que le bouton pourra être plus large si un des liens contient trop de texte. Vous pouvez également choisir de ne pas mettre de dimensions et de laisser le contenu définir la largeur des boutons.

.menu a {
    display:block;                /* Transformation en block */
    min-width: 120px;             /* Largeur minimale des liens */
}
Dimensionnement des liens
Dimensionnement des liens

Mise en forme des boutons

Les liens sont dimensionnés, il faut maintenant gérer leurs paramètres d’affichage afin de les faire ressembler à des boutons.

Les options de personnalisation sont nombreuses. Voici donc un exemple de personnalisation, faites varier les valeurs pour bien voir ce qui se passe.

.menu a {
    display:block;                /* Transformation en block */
    min-width: 120px;             /* Largeur minimale des liens */   
    
    margin: 0.5rem;               /* Marges externes (1 valeurs = 4 directions) */
    padding: 0.4rem 0;            /* Marges internes (2 valeurs = haut/bas et gauche/droite)*/
    text-align: center;           /* Centrage du texte */   
    background-color: #1ABC9C;    /* Couleur d'arrière-plan */
    color: #fff;                  /* Couleur du texte */
    text-decoration: none;        /* Suppression du soulignement */
    border: 1px solid #fff;       /* Ajout d'une bordure */
    border-radius: 4px;           /* Arrondis des bordures */
}
Personnalisation des boutons

Alignement horizontal des liens

L’avantage d’avoir créé une boîte flexible est que l’on va pouvoir choisir facilement comment positionner les différents liens sur la ligne. Il suffit d’ajouter une propriété d’alignement flexible avec la valeur de notre choix : center, flex-end, space-around, space-between, space-evenly.

.menu {
    display: flex;              /* Transformation en flexbox */
    padding:0;                  /* Suppression des marges internes */
    background-color: #ccc;     /* Ajout de la couleur d'arrière-plan */
    justify-content: center     /* Alignements des liens dans le menu */
}
Alignement center
Alignement flex-end
alignement flex-around
Différents alignements

Ajout d’un effet de survol des liens

Pour ajouter un effet au survol des boutons, on utilise le pseudo-sélecteur :hover. Il suffit alors d’effectuer toutes les variations de mise en forme que l’on souhaite. Celle-ci s’appliqueront seulement au survol de la souris.

.menu a:hover {
  background-color: #ed2794;
  color: #ffe843;
  border-color: #ffe843;
}
Effet de survol
Effet de survol

Ajout d’une transition pour avoir des effets de survol progressifs

Pour que les effets au survol s’appliquent progressivement, il suffit d’ajouter une transition.

Nous utilisons donc la propriété transition avec les valeurs all et 1s. La propriété all signifie que toutes les propriétés qui changent avec le survol seront animées et 1s correspond à la durée d’animation.

.menu a {
    display:block;                /* Transformation en block */
    min-width: 120px;             /* Largeur minimale des liens */   
    
    margin: 0.5rem;               /* Marges externes (1 valeurs = 4 directions) */
    padding: 0.4rem 0;            /* Marges internes (2 valeurs = haut/bas et gauche/droite)*/
    text-align: center;           /* Centrage du texte */   
    background-color: #1ABC9C;    /* Arrière-plan */
    color: #fff;                  /* Couleur du texte */
    text-decoration: none;        /* Suppression du soulignement */
    border: 1px solid #fff;       /* Ajout d'une bordure */
    border-radius: 4px;           /* Arrondis des bordures */

    transition: all 1s ;          /* Ajout des effets de transition */
}
Ajout d'une transition
Ajout d’une transition

Ajout de variation pour la page courante

Nous pouvons maintenant ajouter une classe CSS permettant de visualiser le bouton correspondant à la page courante comme dans l’exemple suivant. Nous ajoutons donc une classe pour identifier un des liens et nous ajoutons le CSS pour distinguer la classe en question.

<ul class="menu">
    <li>
        <a href="accueil.html" class="actif">Accueil</a>    
    </li>
    <li>
        <a href="films.html">Films</a>
    </li>
    <li>
        <a href="musiques.html">Musiques</a>
    </li>
</ul>
.menu a.actif {    
    background-color: #000 ; 
    color: #1ABC9C ;
    border-color: #1ABC9C ;
}
.menu a:hover,
.menu a:hover.actif{
  background-color: #ed2794;
  color: #ffe843;
  border-color: #ffe843;
}
Ajout d'un lien actif
Ajout d’un lien actif

Code complet

Voici la totalité du code HTML et CSS, vous pouvez maintenant personnaliser les couleurs, les dimensions, etc.

Page HTML :

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Menu horizontal simplissime</title>
        <link rel="stylesheet" href="styles.css">
    </head>
    <body>
		<ul class="menu">
  			<li>
    			<a href="index.html" class="actif">Accueil</a>
  			</li>
  			<li>
    			<a href="#">Films</a>
  			</li>
  			<li>
    			<a href="#">Musiques</a>
  			</li>
		</ul>
    </body>
</html>

Feuille de styles CSS :

body {
    font-family: "Trebuchet MS";
}
.menu {
    display: flex;                /* Transformation en flexbox */
    padding:0;                    /* Suppression des marges internes */
    background-color: #ccc;       /* Ajout de la couleur d'arrière-plan */
    justify-content: space-around;/* Alignements des liens dans le menu */
}
.menu li {
    list-style-type: none ;       /* Suppression des puces */
  
}
.menu a {
    display:block;                /* Transformation en block */
    min-width: 120px;             /* Largeur minimale des liens */   
    
    margin: 0.5rem;               /* Marges externes */
    padding: 0.4rem 0;            /* Marges internes */
    text-align: center;           /* Centrage du texte */   
    background-color: #1ABC9C;    /* Arrière-plan */
    color: #fff;                  /* Couleur du texte */
    text-decoration: none;        /* Suppression du soulignement */
    border: 1px solid #fff;       /* Ajout d'une bordure */
    border-radius: 4px;           /* Arrondis des bordures */
    
    transition: all 1s ;          /* Ajout des effets de transition */
}
.menu a.actif {    
    background-color: #000 ; 
    color: #1ABC9C ;
    border-color: #1ABC9C ;
}
.menu a:hover,
.menu a:hover.actif{
    background-color: #ed2794;
    color: #ffe843;
    border-color: #ffe843;
}

Sauf mention contraire*, l'article Créer un menu horizontal simplissime en 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. En savoir plus sur comment les données de vos commentaires sont utilisées.

25 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Richard Coudrais
3 années il y a

Bonjour,
Je me permet de signaler une toute petite erreur dans votre tuto : vous suggérez d’utiliser ‘ class= »menu » ‘ mais dans votre exemple vous utilisez ‘ id= »menu » ‘. Du coup le css ne fonctionne pas.
Je pense que beaucoup de codeurs auront corrigé d’eux même.
Richard

illustrate manz
illustrate manz
Répondre à  Richard Coudrais
1 mois il y a

merci

sylvian
3 années il y a

mille fois merci… ton tuto était super clair et super simple à mettre en place surtout quand on est pas codeur… j’ai galéré avant de trouver le tien !! tu es top et il fonctionne super bien…! Sylvian paris

SOH Stanislas Alix
SOH Stanislas Alix
2 années il y a

Salut c’est vraiment édifiant et demande beaucoup d’attention. Merci les commentaires me permettent de mieux comprendre les fonctions de chaque mot clé.

Hachim
Hachim
2 années il y a

Merci! Vraiment ton tuto est très clair et édifiant

Florian
Florian
2 années il y a

Bonjour avec VS Code

Voici mon code HTML
dans le head
<link rel=« stylesheet » href=« css/menu.css »>

dans le body
   <nav class=« menu »>
 <!– Barre de recherche –>
        <ul>
            <li><a href=« accueil.html »>Accueil</a></li>
            <li><a href=« universe.html »>L’Univers</a></li>
            <li><a href=« rules.html »>Les Règles</a></li>
            <li><a href=« artworks »>Artworks</a></li>
            <li><a href=« autors »>Les Auteurs</a></li>
        </ul>
    </nav>

ET mon code CSS
.menu
{
display: flex;
padding: 0%;
background-color: #ccc;
}

Malheureusement ça ne fonctionne pas, pourquoi ?

Merci d’avance !

djimy
djimy
2 années il y a

Bonjour;

Merci beaucoup , le cours est très clair.

Mathiue
Mathiue
2 années il y a

Merci beaucoup, c’est très rare de trouver une ressource aussi bien expliquée. Bravo

christian
christian
1 année il y a

Bonjour, un grand merci pour ce tutoriel très bien expliqué et très simple à comprendre, depuis le temps que je galère pour faire un menu.

Par contre j’aurai une petite question. Ce que j’aimerai faire, c’est que quand on a cliqué sur un lien (qui a renvoyé sur la page concernée), le fond du rectangle change de couleur (par exemple gris) pour indiquer que le lien est visité. Et ainsi de suite pour les autres liens; comme cela existe sur les menus traditionnels, pourrais-tu me fournir le code permettant ceci ? Merci par avance.

ATTRON
ATTRON
1 année il y a

Super cool. C’est tellement bien expliqué que j’ai parfaitement compris chaque fonction utilisée ici et j’ ai enfin réussi à réaliser mon menu personnel. Merci c’est simplement génial.

Bastoune
1 année il y a

Merci beaucoup ! ça m’a beaucoup servi on apprend à coder dans mon école et vous m’avez donné une longueur d’avance 😉

barbarin
1 année il y a

je comprend pas comment remplir le menu quelqu’un peu m’aider ?

bouras
bouras
1 année il y a

Bonjour, je comprends pas comment faire : lorsqu’on clique sur un sous menu (ou menu), cela nous renvoie ver celui ci

Coco
Coco
2 mois il y a

Bonjour

Je ne comprends pas comment faire pour rendre la menue Fonctionnelle j’ai rempli les balises href mais sa ne fonction par je veux bien de l’aide svp.

Merci à vous au revoir

illustrate manz
illustrate manz
1 mois il y a

c’est vraiment tres cool,

Viriginie
Viriginie
1 mois il y a

Bonjour,
merci beaucoup pour cette explication très claire. Je ne comprends pas comment faire pour que le menu reste affiché sur chaque page du site.
Merci d’avance et bonne journée