RGAA Lab

RGAA 4.1.2 · Tableaux · Critère 5.7

Pour chaque tableau de données, la technique appropriée permettant d’associer chaque cellule avec ses en-têtes est-elle utilisée (hors cas particuliers) ?

Déclarer un en-tête ne suffit pas : encore faut-il dire ce qu'il gouverne, faute de quoi le lecteur d'écran ne peut pas annoncer « Chiffre d'affaires, 2024, 1 240 » en arrivant sur la cellule.

Ce que dit le référentiel

Transcription du RGAA 4.1.2, sans interprétation. C’est ce texte qui fait foi, et celui que vous citez dans un rapport.

  1. 5.7.1
    Pour chaque contenu de balise <th> s’appliquant à la totalité de la ligne ou de la colonne, la balise <th> respecte-t-elle une de ces conditions (hors cas particuliers) ?
    • La balise <th> possède un attribut id unique ;
    • La balise <th> possède un attribut scope ;
    • La balise <th> possède un attribut WAI-ARIA role="rowheader" ou role="columnheader".
  2. 5.7.2
    Pour chaque contenu de balise <th> s’appliquant à la totalité de la ligne ou de la colonne et possédant un attribut scope, la balise <th> vérifie-t-elle une de ces conditions ?
    • La balise <th> possède un attribut scope avec la valeur "row" pour les en-têtes de ligne ;
    • La balise <th> possède un attribut scope avec la valeur "col" pour les en-têtes de colonne.
  3. 5.7.3
    Pour chaque contenu de balise <th> ne s’appliquant pas à la totalité de la ligne ou de la colonne, la balise <th> vérifie-t-elle ces conditions ?
    • La balise <th> ne possède pas d’attribut scope ;
    • La balise <th> ne possède pas d’attribut WAI-ARIA role="rowheader" ou role="columnheader" ;
    • La balise <th> possède un attribut id unique.
  4. 5.7.4
    Pour chaque contenu de balise <td> ou <th> associée à un ou plusieurs en-têtes possédant un attribut id, la balise vérifie-t-elle ces conditions ?
    • La balise possède un attribut headers ;
    • L’attribut headers possède la liste des valeurs d’attribut id des en-têtes associés.
  5. 5.7.5
    Pour chaque balise pourvue d’un attribut WAI-ARIA role="rowheader" ou role="columnheader" dont le contenu s’applique à la totalité de la ligne ou de la colonne, la balise vérifie-t-elle une de ces conditions ?
    • La balise possède un attribut WAI-ARIA role="rowheader" pour les en-têtes de ligne ;
    • La balise possède un attribut WAI-ARIA role="columnheader" pour les en-têtes de colonne.

Comment le vérifier

  1. Pour les en-têtes qui couvrent toute une ligne ou toute une colonne, vérifier que le <th> porte au moins l'une des trois marques acceptées : un scope, un id unique, ou un rôle columnheader/rowheader. Aucune n'est obligatoire en propre — c'est leur absence à toutes les trois qui fait échouer, et déclarer non conforme un tableau qui emploie le rôle sans scope est une fausse non-conformité.
  2. Quand la marque employée porte un sens de lecture — scope ou le rôle — vérifier qu'elle désigne le bon : col ou columnheader pour un en-tête de colonne, row ou rowheader pour un en-tête de ligne.
  3. Pour un tableau complexe — en-têtes sur plusieurs niveaux, cellules fusionnées — scope ne suffit plus : chaque <th> doit porter un id unique, et chaque cellule un headers listant les id de ses en-têtes.
  4. Vérifier que chaque id cité dans un headers existe bien, et dans le même tableau : une faute de frappe casse l'association en silence.
  5. Vérifier qu'aucun <th> n'est laissé sans cellule à gouverner — c'est le signe d'un scope inversé ou d'une structure qui a dérivé.

Ce que notre outil fait

Assisté

Le moteur repère les éléments concernés et vous pose la question. Il ne conclut pas à votre place.

Le moteur tranche deux fautes vérifiables, et deux seulement : un headers qui pointe hors du tableau ou vers un id inexistant, et un en-tête auquel aucune cellule n'est rattachée. La première règle ne regarde que les cellules portant déjà un headers, la seconde que les éléments exposant déjà un rôle d'en-tête : un <th> nu — ni scope, ni id, ni rôle — n'entre dans le champ d'aucune des deux. L'assistant prend le relais sur ce point et tranche quatre manquements qui ne demandent aucun jugement : un headers désignant un identifiant qu'aucune cellule ne porte, un même id partagé par plusieurs en-têtes alors que le référentiel le veut unique, une valeur de scope hors row, col, rowgroup et colgroup, et des en-têtes répartis sur deux axes sans aucune technique d'association déclarée — le manquement le plus courant du critère. Ce qu'il vous laisse : savoir si la position suffit, ce que le référentiel admet quand les en-têtes tiennent sur une seule ligne ou une seule colonne. Le moteur ne dit pas non plus si scope="col" a été mis là où il fallait scope="row" quand les deux produisent une structure cohérente — cela demande de savoir ce que le tableau raconte.

Règles ACT du W3C mises en œuvre : a25f45, d0f69e

Comment nous mesurons ce que l'outil sait faire · ce critère s'audite dans l'extension RGAA Lab.

Les pièges

Les erreurs qu’on rencontre vraiment, relevées au fil des audits.

  • scope et headers sur le même tableau ne se cumulent pas utilement : choisir l'un des deux, et le tenir.
  • headers sur un tableau simple est du zèle inutile, et une source de fautes : scope suffit.
  • Un id dupliqué dans la page — deux tableaux copiés-collés avec les mêmes id d'en-tête — associe les cellules du second aux en-têtes du premier.
  • axis est obsolète et n'associe plus rien : le voir dans un tableau signale du code ancien à reprendre.

À lire avec