Navigation principale
La navigation principale est le système central de navigation au sein d’un site. Elle permet d’orienter l’usager à travers les rubriques principales et secondaires du site.
HTML
Structure du composant
Le composant Navigation principale est l'élément central de la navigation au sein du site, il oriente l’utilisateur à travers les grandes sections du site et sur éventuellement plusieurs niveaux de profondeur.
Sa structure est conçue pour s’adapter aux écrans mobiles et comprend les éléments suivants :
-
Le conteneur principal, obligatoire, de la navigation est un
élément HTML
<nav>
avec le rôlenavigation
défini par la classefr-nav
.-
Il dispose d'attribut
aria-label
, dont la valeur doit décrit la fonction de la navigation (ex: "Menu principal").
-
Il dispose d'attribut
-
La liste de liens ou de sous-sections, obligatoire, de la
navigation est un élément HTML
<ul>
défini par la classefr-nav__list
.-
Chaque élément
<li>
défini par la classefr-nav__item
de la liste peut contenir un lien direct, un menu déroulant ou un mega-menu.
-
Chaque élément
-
Un Lien direct est un élément HTML
<a>
de typelink
défini par la classefr-nav__link
.-
Le lien actif dispose d'un attribut
aria-current="page"
.
-
Le lien actif dispose d'un attribut
-
Un Menu déroulant est composé :
-
D'un Bouton d'ouverture, obligatoire, du menu déroulant, un
élément HTML
<button>
de typebutton
défini par la classefr-nav__btn
.-
Le bouton dispose d'un attribut
aria-expanded
, sa valeur [true|false] défini si le bloc refermable de la navigation est ouvert ou fermé. -
Le bouton est lié au bloc refermable via l'attribut
aria-controls
, sa valeur doit correspondre à l'attributid
du bloc refermable. -
Le bouton actif dispose d'un attribut
aria-current="true"
.
-
Le bouton dispose d'un attribut
-
D'un bloc refermable, obligatoire, défini par les classes
fr-collapse
etfr-menu
, est un élément HTML<div>
placé après le bouton d'ouverture. Il s'agit d'un élément générique du core utilisé par d'autres composants tels que le menu latéral ou l'accordéon.-
Le bloc refermable contient une liste de liens directs,
un élément HTML
<ul>
défini par la classefr-menu__list
.-
Chaque élément
<li>
de la liste contient un lien direct défini par la classefr-nav__link
.
-
Chaque élément
-
Le bloc refermable contient une liste de liens directs,
un élément HTML
-
D'un Bouton d'ouverture, obligatoire, du menu déroulant, un
élément HTML
-
Un Mega-menu est composé :
-
D'un bouton d'ouverture, obligatoire, est un élément HTML
<button>
de typebutton
défini par la classefr-nav__btn
.-
Le bouton dispose d'un attribut
aria-expanded
, sa valeur [true|false] défini si le bloc refermable de la navigation est ouvert ou fermé. -
Le bouton est lié au bloc refermable via l'attribut
aria-controls
, sa valeur doit correspondre à l'attributid
du bloc refermable. -
Le bouton actif dispose d'un attribut
aria-current="true"
.
-
Le bouton dispose d'un attribut
-
D'un bloc refermable, obligatoire, défini par les classes
fr-collapse
etfr-mega-menu
, est un élément HTML<div>
placé après le bouton d'ouverture. Il s'agit d'un élément générique du core utilisé par d'autres composants tels que le menu latéral ou l'accordéon.-
Le bloc refermable contient le conteneur du mega-menu,
un élément HTML
<div>
défini par les classesfr-container
,fr-container--fluid
etfr-container-lg
et contenant :-
Le bouton de fermeture du mega-menu, obligatoire,
est un élément HTML
<button>
de typebutton
défini par les classesfr-btn
etfr-btn--close
.-
Le bouton est lié au bloc refermable via
l'attribut
aria-controls
, sa valeur doit correspondre à l'attributid
du bloc refermable. -
Le bouton dispose d'un attribut
title
et un texte explicite pour indiquer son action.
-
Le bouton est lié au bloc refermable via
l'attribut
-
La grille du mega-menu, dont la documentation est
disponible dans les fondamentaux (voir
grille
) composée d'une ou plusieurs colonnes comprenant :
-
Des éléments de contexte (nom de la rubrique,
texte de présentation, lien vers la home de
rubrique), optionnels, définis par la classe
fr-mega-menu__leader
. -
Des noms des sous catégories, optionnels,
pouvant être cliquables, dans un niveau de titre
hx et définis par la classe
fr-mega-menu__category
. -
Une liste de liens directs, obligatoire, dans un
élément HTML
<ul>
défini par la classefr-mega-menu__list
.-
Chaque élément
<li>
de la liste contient un lien direct défini par la classefr-nav__link
. -
Le lien actif dispose d'un attribut
aria-current="page"
.
-
Chaque élément
-
Des éléments de contexte (nom de la rubrique,
texte de présentation, lien vers la home de
rubrique), optionnels, définis par la classe
-
Le bouton de fermeture du mega-menu, obligatoire,
est un élément HTML
-
Le bloc refermable contient le conteneur du mega-menu,
un élément HTML
-
D'un bouton d'ouverture, obligatoire, est un élément HTML
Exemple de structure HTML complet
Exemple de structure HTML avec Liens directs
Exemple de structure HTML avec Menu déroulant
Exemple de structure HTML avec Mega menu
CSS
Installation du CSS
Pour fonctionner correctement le style CSS de la navigation et du
core doivent être importés. L'import doit se faire avant le
contenu de la page dans la partie
<head>
, et de
préférence avec le fichier minifié, car plus léger.
<link href="dist/core/core.min.css" rel="stylesheet">
<link href="dist/component/navigation/navigation.min.css" rel="stylesheet">
NB: Il est aussi possible d'importer le CSS global du DSFR
dsfr.min.css
Pour fonctionner sur Internet Explorer 11, un fichier legacy, peut aussi être importé :
<link href="dist/core/core.legacy.min.css" rel="stylesheet">
<link href="dist/component/navigation/navigation.legacy.min.css" rel="stylesheet">
JavaScript
Installation du JavaScript
Pour fonctionner le composant navigation nécessite l'utilisation de JavaScript. Chaque composant utilisant javascript possède un fichier Js spécifique et requiert le fichier Js du core.
Il est donc nécessaire d'importer ces fichiers à la fin de la page
(avant </body>
) :
<script type="module" src="dist/core/core.module.min.js"></script>
<script type="module" src="dist/component/navigation/navigation.module.min.js"></script>
NB: Il est aussi possible d'importer le Js global du DSFR
dsfr.module.js
Pour fonctionner sur Internet Explorer 11, un fichier legacy, en version nomodule ES5, peut aussi être importé :
<script type="text/javascript" nomodule href="dist/legacy/legacy.nomodule.min.js"></script>
<script type="text/javascript" nomodule src="dist/core/core.nomodule.min.js"></script>
<script type="text/javascript" nomodule src="dist/component/navigation/navigation.nomodule.min.js"></script>
Une fois le JavaScript chargé, le composant fonctionne automatiquement.
Instances
Sur la navigation, les éléments suivants sont instanciés :
-
Le conteneur principal, via la classe :
fr-nav
. -
Les éléments de la liste, via la classe :
fr-nav__item
. -
Le bouton d'ouverture, via la classe
fr-nav__btn
. -
La sous-section, via la classe
fr-collapse
.
Une fois chargé, le Js ajoute un attribut
data-fr-js-NOM_INSTANCE="true"
sur chacun des éléments instanciés.
API
Il est possible d'interagir avec les instances du composants en JavaScript via une API.
Cette API est disponible depuis la méthode
window.dsfr(instance)
du
core.
Exemple :
const elem = document.getElementById('ID_SOUS_SECTION');
dsfr(elem).collapse.disclose();
L'ensemble des propriétés et méthodes disponibles sont définies ci-après :
navigation
Description |
Retourne l'API de la sous-section ouverte. Si aucune sous-section n'est ouverte, ou si plusieurs sous-sections sont ouvertes, renvoie null .
|
---|---|
Type | property |
Retour | object | null |
Exemple |
dsfr(elem).navigation.current
|
Description | Renvoie vrai si le focus est sur un des éléments du groupe. |
---|---|
Type | property |
Retour | Boolean |
Exemple |
dsfr(elem).navigation.hasFocus
|
Description |
Retourne ou modifie l'index de la sous-section
courante. Si aucune sous-section n'est ouverte, l'index vaut 0. |
---|---|
Type | property |
Retour | Number |
Exemple |
dsfr(elem).navigation.index
dsfr(elem).navigation.index = 2
|
Description |
Défini si les sous-sections du groupe sont liées en
eux ou non. Si true ,
lorsqu'une sous-section est ouverte les autres se
referment. Si
false ,
il est possible d'en ouvrir plusieurs. Si
l'attribut n'est pas défini les sous-sections sont
groupées par défaut.
|
---|---|
Type | property |
Retour | Boolean |
Exemple |
dsfr(elem).navigation.isGrouped
dsfr(elem).navigation.isGrouped = true
|
Description | Retourne le nombre de sous-sections dans le groupe. |
---|---|
Type | property |
Retour | Number |
Exemple |
dsfr(elem).navigation.length
|
Description | Renvoie un tableau d'objets correspondant aux sous-sections du groupe. |
---|---|
Type | property |
Retour | Array |
Exemple |
dsfr(elem).navigation.members
|
Description | Renvoie le noeud HTML de l'élément. |
---|---|
Type | property |
Retour | DOMElement |
Exemple |
dsfr(elem).navigation.node
|
navigationItem
Description | Défini si le fonctionnement de la navigation est activé ou non |
---|---|
Type | property |
Retour | Boolean |
Exemple |
dsfr(elem).navigationItem.isEnabled = false
|
Description | Renvoie le noeud HTML de l'élément. |
---|---|
Type | property |
Retour | DOMElement |
Exemple |
dsfr(elem).navigationItem.node
|
collapseButton
Description | Replace le focus sur le bouton |
---|---|
Type | function |
Arguments | none |
Retour | Boolean |
Exemple |
dsfr(elem).collapseButton.focus()
|
Description | Défini si le fonctionnement du bouton de la navigation est activé ou non |
---|---|
Type | property |
Retour | Boolean |
Exemple |
dsfr(elem).collapseButton.isEnabled = false
|
Description | Renvoie le noeud HTML de l'élément. |
---|---|
Type | property |
Retour | DOMElement |
Exemple |
dsfr(elem).collapseButton.node
|
collapse
Description | Ferme la sous-section |
---|---|
Type | function |
Arguments | none |
Retour | none |
Exemple |
dsfr(elem).collapse.conceal()
|
Description | Ouvre la sous-section |
---|---|
Type | function |
Arguments | none |
Retour | none |
Exemple |
dsfr(elem).collapse.disclose()
|
Description | Retourne vrai si la sous-section est ouverte |
---|---|
Type | property |
Retour | Boolean |
Exemple |
dsfr(elem).collapse.isDisclosed
|
Description | Défini si le fonctionnement de la navigation est activé ou non |
---|---|
Type | property |
Retour | Boolean |
Exemple |
dsfr(elem).collapse.isEnabled = false
|
Description | Retourne l'API du groupe, ou null s'il n'y a pas de groupe |
---|---|
Type | property |
Retour | object | null |
Exemple |
dsfr(elem).collapse.group
|
Description | Retourne un tableau de boutons d'ouverture de la sous-section |
---|---|
Type | property |
Retour | Array |
Exemple |
dsfr(elem).collapse.buttons
|
Description | Replace le focus sur le bouton de la sous-section |
---|---|
Type | function |
Arguments | none |
Retour | Boolean |
Exemple |
dsfr(elem).collapse.focus()
|
Description | Retourne l'instance du dsfr parent, ici la navigation |
---|---|
Type | property |
Retour | object | null |
Exemple |
dsfr(elem).parent
|
Description | Renvoie un tableau d'instances enfants |
---|---|
Type | property |
Retour | Array |
Exemple |
dsfr(elem).children
|
Description | Renvoie le noeud HTML de l'élément. |
---|---|
Type | property |
Retour | DOMElement |
Exemple |
dsfr(elem).collapse.node
|
Événements
Le Système de Design fournit des événements personnalisés pour les actions uniques de la part de certains composants réactifs listés sur la page de l' API Javascript .
Sur chaque menu déroulant de la navigation principale, les événements suivants sont disponibles :
Événement | Action | Élément | Attribut |
---|---|---|---|
dsfr.conceal
|
Fermeture de l'élément | Collapse |
data-fr-js-collapse
|
dsfr.disclose
|
Ouverture de l'élément | Collapse |
data-fr-js-collapse
|
dsfr.click
|
Click sur le bouton d'ouverture | CollapseButton |
data-fr-js-collapse-button
|
Note de version
Voir les évolutions sur github
v1.13.1 - 26 mars 2025
ajout de la fermeture des menus au clavier
- La touche échap ferme le menu ouvert
- Lorsque le focus sort du menu au TAB, ferme le menu ouvert
#1091
v1.13.0 - 4 décembre 2024
retrait des sélecteur css ">"
- Retrait des selecteurs d'enfants directs pour éviter les problèmes lors de l'ajout de balises intermediaires (cas de création de sous composants)
#1049
v1.11.1 - 31 janvier 2024
v1.11.0 - 11 décembre 2023
correctifs de style mega-menu
- ajoute un margin-top: -1.25rem (-20px) sur le fr-mega-menu__leader
- passe le texte de description et le lien du fr-mega-menu__leader en taille sm
- supprime la classe fr-mb-4v de la colonne entourant le fr-mega-menu__leader
- le texte du bouton de navigation passe en $text-action-high-blue-france à l'ouverture
#785
v1.10.0 - 19 juillet 2023
homogénéisation des espacements et indentation
-
Uniformisation du menu latéral, navigation, et
accordéon
- ajout d'un fond open-blue-france et du texte en blue-france sur les boutons d'ouverture en état ouvert
- ajout de marge pour indenter les sous menus
- ajustement des espacements
- Ajustement de la navigation du header en mobile
- Ajustement de la taille max de la navigation dans le header en desktop
#678
focus des nav-items mobile & ajustements
- L'outline de focus est maintenant entièrement visible sur les liens des sous menu en mobile
- Ajustement de l'alignement du bouton fermé en desktop
- Retrait du mega-menu__leader vide dans les examples
#609
v1.9.1 - 11 avril 2023
fermeture de la navigation au clic sur lien ou bouton
Actuellement, la navigation reste présente en mobile
et en desktop lorsque l'on clique sur un lien ou un
bouton qu'elle contient, ce qui pose problème dans
le cas des Single-page application. La
fonctionnalité est maintenant modifiée pour que tout
clic sur un élément
<button>
ou
<a>
entraîne la fermeture de la navigation (modale et/ou
menu). L'ajout de l'attribut
data-fr-prevent-conceal
permet de préserver un lien ou un bouton particulier
de ce nouveau comportement.
#583