Chapitre 5.3 — Nom, rôle, valeur
⏱️ TL;DR — Chaque nœud de l’arbre d’accessibilité expose trois choses, et c’est le critère 4.1.2 Nom, rôle, valeur : le rôle (ce que c’est — bouton, lien, case…), le nom accessible (comment on l’appelle — « Envoyer ») et la valeur/état (coché, développé, désactivé…). Le rôle vient surtout de la balise. Le nom se calcule selon un ordre de priorité strict :
aria-labelledby>aria-label> contenu/<label>natif >title/placeholderen tout dernier recours. Une description (aria-describedby) peut s’ajouter. Maîtriser ce triptyque, c’est maîtriser ce qu’annonce le lecteur d’écran.
🎯 Objectifs
- Énoncer le modèle nom / rôle / valeur et le rattacher au critère 4.1.2.
- Comprendre d’où vient le rôle et pourquoi le natif est prioritaire.
- Maîtriser l’ordre de priorité du calcul du nom accessible.
- Distinguer nom et description (
aria-describedby). - Écrire des noms accessibles corrects (exemples mauvais → bon).
Le modèle nom / rôle / valeur (4.1.2)
Le critère WCAG 4.1.2 « Nom, rôle, valeur » exige que, pour tout composant d’interface, ces trois informations soient programmatiquement déterminables — c’est-à-dire présentes dans l’arbre d’accessibilité. C’est la colonne vertébrale de l’a11y technique : un lecteur d’écran n’annonce jamais rien d’autre que ça.
- Rôle : ce que c’est. Un bouton, un lien, une case à cocher, un titre, une région de navigation.
- Nom : comment ça s’appelle. Le libellé qui identifie l’élément : « Envoyer », « Accueil », « Se souvenir de moi ».
- Valeur / état : dans quel état c’est. Coché ou non, développé ou replié, désactivé, requis, la position dans une liste, le texte saisi dans un champ.
Quand un lecteur d’écran annonce « Se souvenir de moi, case à cocher, non cochée », il lit exactement nom + rôle + valeur.
Le rôle : ce que c’est
Le rôle dit à la technologie d’assistance comment traiter l’élément et quels raccourcis s’appliquent. Il vient, par ordre de préférence :
- De la balise native — c’est la règle d’or.
<button>→ rôlebutton,<a href>→link,<input type="checkbox">→checkbox,<nav>→navigation,<h2>→headingniveau 2. Gratuit, robuste, correct. - D’un attribut
roleARIA — seulement quand aucun élément natif ne convient (role="tablist",role="dialog"…). L’ARIA remplace le rôle mais n’ajoute ni comportement clavier, ni focus : à toi de les recoder. D’où la première règle d’ARIA — ne pas utiliser ARIA quand un natif existe (voir Partie 6).
<!-- ❌ Rôle "generic" : la div n'est pas un bouton dans l'arbre -->
<div class="btn" onclick="envoyer()">Envoyer</div>
<!-- ✅ Rôle "button", focusable et activable au clavier, gratuitement -->
<button type="button" onclick="envoyer()">Envoyer</button>Le nom accessible : comment ça s’appelle
C’est la partie la plus subtile — et la plus mal comprise. Le nom accessible (accessible name) n’est pas « le texte à l’écran » : c’est le résultat d’un calcul défini par la spec (l’Accessible Name Computation). Plusieurs sources peuvent fournir le nom ; le navigateur les départage selon un ordre de priorité. Simplifié, du plus fort au plus faible :
aria-labelledby— pointe vers l’idd’un ou plusieurs éléments dont le texte devient le nom. Gagne sur tout le reste.aria-label— une chaîne fournie directement. Gagne sur le contenu et le label natif.- Le contenu textuel de l’élément (pour un
<button>, un lien) ou le<label>associé (pour un champ de formulaire). title, puisplaceholder— en tout dernier recours, si rien d’autre n’est fourni.
Autrement dit : si tu mets à la fois un aria-label et du texte visible, c’est l’aria-label qui gagne et le texte visible est ignoré comme nom. Cette règle explique beaucoup de bugs (« le bouton s’annonce autrement que ce qui est écrit dessus »).
<!-- Nom = "Fermer la fenêtre" (aria-label gagne sur le contenu "✕") -->
<button aria-label="Fermer la fenêtre">✕</button>
<!-- Nom = "Menu principal" (aria-labelledby gagne, pointe vers le titre) -->
<h2 id="titre-nav">Menu principal</h2>
<nav aria-labelledby="titre-nav"> ... </nav>
<!-- Nom = "Email" (le <label> associé fournit le nom du champ) -->
<label for="email">Email</label>
<input id="email" type="email">⚠️ Piège — Le
placeholdern’est pas un label. Un champ dont le seul « libellé » est unplaceholdera un nom accessible fragile (dernier recours dans le calcul), et surtout le placeholder disparaît dès que l’utilisateur commence à taper : il ne peut plus vérifier ce qu’on lui demande. Certains lecteurs ne l’annoncent même pas comme nom. Toujours un vrai<label>(ouaria-label/aria-labelledby) ; leplaceholderreste un simple exemple de saisie, en plus, jamais à la place.
<!-- ❌ Nom fragile : seul le placeholder "sert" de label, et il s'efface à la saisie -->
<input type="text" placeholder="Votre email">
<!-- ✅ Vrai label associé ; le placeholder reste un exemple facultatif -->
<label for="mail">Votre email</label>
<input id="mail" type="email" placeholder="prenom@exemple.fr">La valeur et l’état
Le troisième pilier décrit la situation de l’élément. Pour les contrôles natifs, le navigateur la gère seul :
- une case cochée → état
checkedannoncé « cochée » ; - un champ requis (
required) → « requis » ; - un contrôle
disabled→ « indisponible » ; - la valeur saisie dans un
<input>→ lue à la relecture.
Pour un composant custom, c’est à toi de tenir ces états à jour via ARIA : aria-checked, aria-expanded (« développé »/« replié »), aria-selected, aria-disabled, aria-current. Un menu déroulant qui ne bascule pas aria-expanded s’annonce toujours « replié », même ouvert — l’utilisateur est perdu.
<!-- Le bouton reflète l'état d'ouverture du panneau qu'il contrôle -->
<button aria-expanded="false" aria-controls="panneau">Détails</button>
<!-- En JS, on passe aria-expanded à "true" quand on ouvre #panneau -->Nom ≠ description
Le nom identifie ; la description informe en plus. aria-describedby pointe vers un texte lu après le nom et le rôle, souvent pour une aide ou une contrainte :
<label for="pwd">Mot de passe</label>
<input id="pwd" type="password" aria-describedby="aide-pwd">
<p id="aide-pwd">12 caractères minimum, une majuscule et un chiffre.</p>Annoncé : « Mot de passe, zone d’édition protégée » puis « 12 caractères minimum… ». N’entasse pas tout dans le nom : le nom reste court et identifiant, la description porte le détail.
♿ Côté utilisateur — Le nom accessible, c’est le mot par lequel l’utilisateur cherche un élément dans la liste des liens ou des boutons de sa page. Dix boutons nommés « Voir » sont inutilisables : sa liste affiche « Voir, Voir, Voir… ». Nommés « Voir le cours React », « Voir le cours Symfony »…, ils deviennent repérables d’un coup. Le nom n’est pas un détail cosmétique : c’est son moyen de navigation.
🧭 Sur A11yLearn — Le tableau de bord d’A11yLearn alignait des cartes de cours, chacune avec un bouton « Continuer ». Dans la liste des boutons du lecteur d’écran : « Continuer, Continuer, Continuer… » — impossible de savoir quel cours. On a donné à chaque bouton un nom accessible explicite via
aria-label, par exemple « Continuer : Introduction à React ». Même bouton visuel « Continuer » (le design ne bouge pas), mais un nom accessible unique et parlant. La liste des boutons devient une table des matières.
✏️ Exercices
Exercice 1 — Qui gagne ? Pour chaque élément, donne le nom accessible calculé : (a) <button aria-label="Rechercher">🔍</button>, (b) <button title="Envoyer">Valider</button>, (c) un champ avec <label for="x">Nom</label> et aria-label="Prénom" sur l’<input id="x">.
✅ Solution
(a) « Rechercher » : aria-label gagne sur le contenu (l’emoji loupe). (b) « Valider » : le contenu textuel gagne sur title (qui n’est qu’un dernier recours) ; le title ne servirait de nom que si le bouton était vide. (c) « Prénom » : aria-label gagne sur le <label> natif — piège classique, le nom annoncé (« Prénom ») contredit le libellé visible (« Nom »). À éviter absolument : nom accessible et libellé visible doivent concorder.
Exercice 2 — Répare le champ. Corrige ce code pour qu’il ait un nom accessible robuste et un état correct : <input type="checkbox" placeholder="Newsletter">.
✅ Solution
Un placeholder sur une case à cocher ne fournit pas de nom fiable (et n’a pas de sens sur une checkbox). Il faut un vrai <label> associé :
<input id="news" type="checkbox">
<label for="news">Recevoir la newsletter</label>Le nom accessible devient « Recevoir la newsletter » (rôle checkbox), et l’état « cochée / non cochée » est géré nativement par le navigateur. Clic sur le label coche la case en prime.
🧠 Quiz de révision
1. Que couvre le critère 4.1.2 ?
Le triptyque nom / rôle / valeur : pour chaque composant d’interface, le rôle (ce que c’est), le nom accessible (comment on l’appelle) et la valeur/état (coché, développé, désactivé…) doivent être déterminables programmatiquement, c’est-à-dire présents dans l’arbre d’accessibilité.
2. Quel est l’ordre de priorité du calcul du nom accessible ?
aria-labelledby > aria-label > contenu textuel / <label> associé > title puis placeholder en dernier recours. Le premier fourni « gagne » : un aria-label masque donc le texte visible comme nom.
3. Pourquoi ne pas se reposer sur le placeholder comme label ?
placeholder comme label ?Parce qu’il n’arrive qu’en dernier recours dans le calcul du nom, qu’il disparaît à la saisie (l’utilisateur perd le repère), et qu’il n’est pas toujours annoncé comme nom. Il faut un vrai <label>, un aria-label ou un aria-labelledby ; le placeholder n’est qu’un exemple de saisie.
4. Quelle est la différence entre aria-label et aria-describedby ?
aria-label et aria-describedby ?aria-label fournit le nom (l’identité, court). aria-describedby fournit une description additionnelle, lue après nom et rôle (aide, contrainte, format attendu). Le nom sert à identifier et rechercher l’élément ; la description apporte le détail.
5. D’où vient le rôle d’un <button>, et pourquoi le préférer à role="button" sur une <div> ?
<button>, et pourquoi le préférer à role="button" sur une <div> ?Le rôle button vient de la balise native. Le préférer parce qu’un <button> apporte gratuitement le rôle et le focus clavier et l’activation par Entrée/Espace et la gestion de disabled. role="button" sur une <div> ne donne que le rôle : il faut recoder le focus (tabindex) et tout le clavier à la main.
Chapitre suivant : Utiliser un lecteur d’écran — prendre en main NVDA ou VoiceOver pour vérifier de tes oreilles ce que ton arbre annonce.