Accessibilité par éléments
Attention !
- Tous les éléments HTML ne sont pas accessibles ! => https://daverupert.com/2020/02/html-the-inaccessible-parts/
- Certains éléments ne sont pas compatibles avec la lecture à voix haute : input de type nombre/date/search
Focus
- Toujours utiliser
outline
! Passer parbox-shadow
rend le focus inaccessible (l'ombre peut être enlevée dans les thèmes Windows high contrast par exemple) - Si besoin on peut utiliser
:focus-visible
pour rajouter le style au focus uniquement à l’utilisation du clavier et pas au clic souris - Le comportement
:focus-visible
est déjà celui par défaut dans certains navigateurs actuellement - Standardiser les styles au focus sur tous les composants !
Boutons
(En savoir plus : Créer des boutons accessibles et dignes de ce nom en HTML)
- Un bouton = un bouton (pas une div, pas un span, pas un a)
- Pas de
<a>
à l'intérieur d'un bouton ! Si on veut un lien on utilise<a>
, sinon on fait un bouton avec<button>
Boutons icône
(En savoir plus : Accessible Icon Buttons)
- Pour labelliser le bouton icône, plusieurs options :
- Avoir un texte dans le DOM du
<button>
mais le cacher visuellement avec une classe - Labelliser le bouton avec un élément "hidden", et le référencer avec
aria-labelledby
. Attribut "hidden" permet de cacher du lecteur d'écran + visuellement (très bon support navigateur) - Utiliser
aria-label
sur le bouton ou sur le svg (le svg ne doit pas avoir aria-hidden si on met le label dessus) - Utiliser
title
- Avoir un texte dans le DOM du
- Le mieux est d'éviter de labelliser le svg, et de plutôt labelliser le bouton
Exemple :
<button class="menu-trigger" aria-labelledby="button-label">
<span id="button-label" hidden>Menu</span>
<svg aria-hidden="true" focusable="false" width="24" height="28" viewBox="0 0 24 28">
</svg>
</button>
Headings
(En savoir plus : Subheadings, subtitles, alternative titles and taglines in HTML)
<hgroup>
: 0 à x éléments<p>
, suivi d'un heading (h1, h2, ....), suivi de 0 ou x éléments<p>
- pb d'accessibilité :
hgroup
a un rôle générique qui est ignoré dans l'arbre d'accessibilité - Ne pas utiliser h1-h6 pour les sous-titres et titres alternatifs ! Utiliser l'élément
<p>
Images
- Remplir l'attribut alternatif pour toutes les images, vidéo et audio (
alt=""
) - la bonne pratique est de cacher le svg avec
aria-hidden="true"
etfocusable="false"
pour éviter qu'on puisse se focus dans l'icône (même si on a un "bouton icône")
Inputs
Label associé
Un input doit impérativement avoir un label associé ! (ou <legend>
si on est sur un groupe d'inputs). Le placeholder ne fait pas office de label !
Les seuls inputs qui n'ont pas besoin de labels sont : les type="submit"
ou type="button"
.
Soit :
- Association implicite (l'input est à l'intérieur du label)
- Association explicite (attribut "for" et "id") => recommandée car mieux comprise par tous les lecteurs d'écrans
Quelques points d'attention :
- Un label ne doit pas non plus contenir de contenu interactif (un lien par exemple). Il devrait être mis à côté.
- Si on a plus d'infos à mettre (ex une description en plus du label), on va utiliser
aria-describedby
sur l'input qui va référencer l'id du span de description - La convention est :
- Label à droite quand on a des radio boutons / checkbox
- Label à gauche quand on a des inputs
Radio
- L'idéal est d'avoir une target de 44px pour le bouton radio
Landmark
header
, footer
,...
- header et footer sont des landmarks seulement s'ils sont à l'intérieur de
<body>
. S'ils sont à l'intérieur d'un élément de section, ils deviennent le header/footer de cet élément (ex: article, aside, main, nav, section)
Tables
- Utiliser
<th>
pour les headers - Préciser si c'est un header de ligne ou de colonne :
scope="col"
ouscope="row"
sur le<th>
- Eviter de changer le "display"
- Responsive : avoir une scroll horizontale/verticale
Texte
- Aligner le texte à gauche et non justifié (pour les personnes avec dyslexie)
- Utiliser des polices sans serif pour les dyslexiques
Divers
- Ajouter la langue utilisée dans le dom sur l'élément html (
lang="en"
) : cela va changer la prononciation du lecteur - La balise title n'est généralement pas exposée, donc il ne faut pas mettre d'infos supplémentaires uniquement dans le title