Une barre de navigation avec nav
Entourez votre menu de <nav> et placez les liens dans une liste. Flexbox transforme la liste en barre horizontale :
list-style: none et padding: 0 retirent les puces et le retrait. display: block sur chaque lien permet à son padding d'occuper une vraie place dans la barre, donc toute la boîte avec son padding devient la zone de clic. Supprimez la ligne display: flex et le même menu devient une liste verticale, c'est-à-dire un menu de barre latérale.
<nav> en lui-même ne ressemble à rien. Son rôle est le sens : les lecteurs d'écran l'exposent comme un repère de navigation, pour qu'un utilisateur puisse aller au menu, ou le sauter, d'une seule touche.
Signaler la page actuelle
Ajoutez aria-current="page" au lien de la page affichée. Il dit « vous êtes ici » aux lecteurs d'écran, et il donne au CSS une prise pour mettre le lien en évidence :
Déplacez aria-current="page" sur un autre lien et la mise en évidence le suit. Styliser l'attribut plutôt qu'une classe .active garde l'apparence et l'accessibilité synchronisées : impossible d'avoir l'une sans l'autre.
Plusieurs nav sur une page : labels et fil d'Ariane
Une page peut avoir un menu principal, un fil d'Ariane et une table des matières, chacun dans son propre <nav>. Donnez à chacun un aria-label, pour qu'un lecteur d'écran annonce « navigation Breadcrumb » au lieu de trois entrées « navigation » identiques :
Le fil d'Ariane utilise une liste ordonnée <ol> car l'ordre compte. Les barres obliques viennent du ::before en CSS, donc les lecteurs d'écran ne lisent pas « barre oblique » entre chaque élément. Le dernier élément est la page actuelle et n'est pas un lien.
Une table des matières
Une liste de liens vers des sections de la même page est aussi de la navigation. Les liens #id mènent à l'élément qui a cet id ; essayez-les dans l'aperçu :
Ici, le nom vient d'un titre visible via aria-labelledby, ce qui vaut mieux que aria-label quand le titre est déjà à l'écran.
Un bouton de menu mobile
Sur les écrans étroits, les menus se cachent généralement derrière un bouton. Utilisez un vrai <button> avec aria-expanded, et gardez les liens dans <nav> :
aria-expanded indique à un lecteur d'écran si le menu est ouvert, et l'attribut hidden retire la liste à la fois de l'écran et de l'arbre d'accessibilité tant qu'elle est fermée. Sur les grands écrans, vous afficheriez la liste avec une media query et masqueriez le bouton.
Erreurs fréquentes
- Entourer chaque groupe de liens de
<nav>. Utilisez-le pour le menu principal, le fil d'Ariane, la pagination et les tables des matières. Les liens dans le texte ne sont pas des blocs de navigation. - Un bouton de menu fait avec une
<div>. Il ne peut pas recevoir le focus ni être activé au clavier. Utilisez<button>. - Plusieurs nav sans label. Ajoutez
aria-labelouaria-labelledbyà chacun pour pouvoir les distinguer. - Seulement colorer le lien actuel. Ajoutez
aria-current="page"; la couleur seule n'est pas annoncée et n'est pas forcément visible pour tout le monde. - Des liens avec
href="#"en production. Ils conviennent pour une démo, mais les vrais éléments de menu ont besoin de vraies URL pour marcher quand on les ouvre dans un nouvel onglet. La page lien HTML explique le fonctionnement des valeurs dehref.
Questions fréquentes
Qu'est-ce que la balise nav en HTML ?
<nav> est un élément sémantique qui entoure un bloc de liens de navigation principaux, comme le menu du site, une table des matières ou un fil d'Ariane. Les lecteurs d'écran le listent comme un repère de navigation pour que les utilisateurs puissent y accéder directement.
Les liens dans nav doivent-ils être dans une liste ?
C'est le schéma courant, et il est bon : un <ul> d'éléments <li> permet aux lecteurs d'écran d'annoncer combien de liens compte le menu. Des liens placés directement dans <nav> sont aussi valides, par exemple pour deux ou trois liens en ligne.
Chaque groupe de liens a-t-il besoin d'un élément nav ?
Non. Utilisez <nav> uniquement pour les blocs de navigation principaux. Quelques liens dans un paragraphe ou une courte liste de liens légaux dans le pied de page n'en ont pas besoin, et trop de repères nav rendent chacun plus difficile à trouver.
Comment faire une barre de navigation horizontale ?
Placez les liens dans un <ul> à l'intérieur de <nav>, puis donnez à la liste display: flex; list-style: none; padding: 0; et un gap. Flexbox dispose les éléments en ligne.
Comment signaler la page actuelle dans une barre de navigation ?
Ajoutez aria-current="page" au lien de la page où se trouve l'utilisateur, et stylisez-le avec le sélecteur [aria-current="page"]. Les lecteurs d'écran l'annoncent alors aussi comme la page actuelle.
Une page peut-elle avoir plusieurs nav ?
Oui, par exemple un menu principal, un fil d'Ariane et une table des matières. Donnez à chacun un aria-label différent comme « Main » ou « Breadcrumb » pour que les utilisateurs de lecteurs d'écran puissent les distinguer.