RGAA Lab

Composants accessibles

Les listes

Une liste annonce combien d'éléments elle contient — à condition d'en être une. Et retirer les puces peut lui faire perdre ce rôle. Démo, code, critères RGAA.

3 critères RGAA en jeu

Essayez-les

Une vraie liste

  • Relever les images sans alternative
  • Vérifier les intitulés de liens
  • Contrôler les en-têtes de tableau

Une fausse liste

– Relever les images sans alternative
– Vérifier les intitulés de liens
– Contrôler les en-têtes de tableau

Une liste de définitions

Conforme
Tous les tests du critère sont satisfaits.
Non applicable
Le critère ne rencontre aucun contenu concerné ; il sort du calcul.

Les trois blocs se ressemblent à l’écran. Le bouton lit leur balisage réel : c’est la seule différence qui compte, et la seule qu’on ne voit pas.

Cette démo existe aussi en page autonome.

Ce qu’une liste apporte

Un lecteur d’écran annonce une liste avec son nombre d’éléments, puis la position de chacun : « liste de 3 éléments, 1 sur 3… ». Trois informations qu’une suite de paragraphes ne donne jamais.

Ce n’est pas décoratif. Savoir qu’il reste deux éléments décide si on continue ou si on saute ; et la plupart des lecteurs offrent un raccourci pour aller à la liste suivante, ou pour en sortir d’un coup. Une fausse liste n’apparaît dans aucun de ces déplacements.

L’erreur courante

Les tirets et les sauts de ligne.

<!-- À ne pas faire : une liste pour l'œil seulement -->
<p>
	– Relever les images sans alternative<br />
	– Vérifier les intitulés de liens<br />
	– Contrôler les en-têtes de tableau
</p>

Trois variantes de la même faute : les tirets dans un paragraphe, une suite de <div> alignés, et — plus subtil — la liste dont les <li> ne sont pas enfants directs de leur <ul>.

<!-- À ne pas faire : le div rompt la liste -->
<ul>
	<div class="rangee">
		<li>Premier</li>
		<li>Deuxième</li>
	</div>
</ul>

Ce dernier cas est celui que les frameworks produisent le plus souvent, en enveloppant chaque élément d’un conteneur de mise en page. Le balisage reste valide à l’œil, mais la relation liste-élément est rompue : le décompte devient faux, quand il ne disparaît pas.

Le code, pas à pas

1. La bonne liste pour la bonne chose

<!-- Un ordre qui ne compte pas -->
<ul>
	<li>Relever les images sans alternative</li>
	<li>Vérifier les intitulés de liens</li>
</ul>

<!-- Un ordre qui compte : des étapes, un classement -->
<ol>
	<li>Constituer l'échantillon</li>
	<li>Passer les critères</li>
	<li>Rédiger la déclaration</li>
</ol>

<!-- Des paires terme / définition -->
<dl>
	<dt>Non applicable</dt>
	<dd>Le critère ne rencontre aucun contenu concerné ; il sort du calcul.</dd>
</dl>

Le choix se pose une seule question : l’ordre porte-t-il du sens ? S’il en porte, <ol> — le lecteur annonce alors « 2 sur 5 », qui devient une information. Sinon, <ul>.

<dl> est fait pour les paires, et c’est ce qui en fait le bon balisage d’un glossaire, d’une fiche de caractéristiques ou de métadonnées. Un <dt> peut porter plusieurs <dd>, et inversement.

2. Rien entre la liste et ses éléments

<ul>
	<li class="rangee">Premier</li>
	<li class="rangee">Deuxième</li>
</ul>

Les seuls enfants directs d’un <ul> ou <ol> sont des <li>. Si la mise en page réclame un conteneur, il va dans le <li>, jamais autour. Pour un <dl>, un <div> enveloppant une paire <dt>/<dd> est en revanche permis — c’est la seule exception.

3. Le piège des puces retirées

C’est le point qui nous a coûté le plus cher, et il n’est écrit nulle part dans la documentation des frameworks.

/* Ce que font tous les resets CSS, Tailwind compris */
ul {
	list-style: none;
}

Sur Safari avec VoiceOver, une liste dont les puces sont retirées peut perdre son rôle de liste : ni le nombre d’éléments, ni l’appartenance ne sont plus restitués. Le balisage est correct, le rendu est correct, et l’information disparaît quand même.

La parade tient en un attribut :

<ul role="list" class="sans-puces">
	<li></li>
</ul>

Redéclarer le rôle qu’un <ul> possède déjà semble absurde — et c’est précisément ce qui le rétablit dans ce cas. La précaution est répandue, sans effet néfaste ailleurs, et n’a pas de coût.

Ce n’est pas une non-conformité au RGAA : un <ul> sans puces reste correctement balisé au sens du critère 9.3. C’est une précaution de robustesse — et nous la vérifions à la construction du site, parce qu’un oubli est invisible à la relecture. Ce guide en a d’ailleurs fait les frais : la démo ci-dessus a d’abord été refusée par notre propre contrôle.

4. La liste de mise en page

L’excès inverse existe : envelopper en <ul> tout ce qui se répète. Une grille de cartes purement visuelle annonce alors « liste de 12 éléments » sans qu’il y ait rien à énumérer.

La question à se poser : l’utilisateur gagne-t-il à savoir combien il y en a ? Pour une barre de navigation, oui — c’est une vraie liste de liens, et c’est l’usage recommandé. Pour trois blocs décoratifs alignés, non.

Au clavier

Une liste n’est pas interactive : elle n’entre pas dans l’ordre de tabulation, et seuls les liens ou boutons qu’elle contient le font. Sa navigation appartient au lecteur d’écran.

ToucheEffet
LVa à la liste suivante (mode navigation rapide, NVDA et JAWS).
IPasse d’un élément de liste au suivant.
TabNe s’arrête que sur les liens et boutons contenus dans la liste.

Ce que le lecteur d’écran restitue

À l’entrée : la nature et le compte — « liste de 3 éléments » — puis chaque élément avec son rang. Pour une <dl> : « liste de définitions », puis les termes et leurs définitions par paires.

Si vous n’entendez pas le nombre d’éléments, deux causes : ce n’est pas une liste, ou c’en est une dont les puces ont été retirées sur Safari. Le premier cas se corrige au balisage, le second par role="list".

Checklist

  • Toute énumération est une liste : <ul>, <ol> si l’ordre compte, <dl> pour des paires.
  • Rien entre la liste et ses <li> — le conteneur de mise en page va dedans.
  • role="list" dès que les puces sont retirées.
  • Pas de liste pour de la mise en page : demandez-vous si le compte informe.
  • Une hiérarchie de contenu demande des titres, pas des puces imbriquées.

Les critères RGAA en jeu

  • Critère 9.3 — Structure des listes

    Toute énumération doit être balisée en liste — ul, ol ou dl selon sa nature — et cette liste doit être correctement structurée : que des li en enfants directs, et rien d'autre entre eux.

  • Critère 8.9 — Balises utilisées pour la présentation

    L'inverse du précédent : une liste employée pour la seule mise en page annonce une énumération qui n'existe pas. Une barre de navigation est une vraie liste de liens ; une grille de cartes décorative n'en est pas une.

  • Critère 9.1 — Structure par les titres

    Une liste n'est pas un plan : des éléments qui structurent le document demandent des titres, pas des puces imbriquées sur cinq niveaux.

Vérifiez votre composant avec l'extension

Pour aller plus loin

Sources