On pourra parcourir les notices AcceDe Web d'Atalan, en particulier celles destinées aux dévelopeuses et développeurs :
Ces notices se lisent en une heure ou deux et, même en les survolant, on apprend beaucoup de choses.
Pour être deux développeurs à l'avoir suivie (@newick et @logic-fabric), nous pouvons recommander la formation Développer des sites web accessibles et conformes au RGAA d'Access42.
Cette liste de recommandations est issue des audits RGAA et des corrections apportées par @newick et @logic-fabric.
- Toujours privilégier le HTML pur à l'utilisation d'attributs ARIA (cf. No ARIA is better than bad ARIA) : les sites utilisant l'API ARIA sont en moyenne moins accessibles que les autres, celle-ci étant souvent mal utilisée.
- Pour utiliser correctement les attributs ARIA au sein de composants complexes (et savoir quelles interactions clavier sont nécessaires), se référer aux patterns ARIA APG.
- Ne pas contrarier le rôle natif d'une balise : utiliser la bonne balise plutôt qu'ajouter un
role(ex:<fieldset>a déjà le rôlegroup,<button>a déjà le rôlebutton). En corollaire, ne pas mettre derole="link"sur un<button>ou derole="button"sur un<a>. C'est vraiment une erreur fréquente de contrarier le rôle d'un bouton ou d'une ancre, en général parce qu'on raisonne en terme d'apparence alors qu'il faut d'abord le faire en terme de sémantique. - Les hooks et composants de React Aria gèrent correctement les attributs ARIA : les utiliser plutôt que de gérer manuellement ces attributs. Attention toutefois à suivre précisément la documentation et à vérifier le résultat dans l'inspecteur d'accessibilité du navigateur : une mauvaise utilisation peut produire des rôles incorrects.
- L'
aria-labeld'un composant interactif doit toujours contenir l'intitulé visible, pour être déclenchable avec une commande vocale. - Plus un
aria-labelest concis, plus les utilisateurs de lecteur d'écran vous remercieront. - Plus on peut se passer d'
aria-label(comme de tout autre attribut ARIA), mieux c'est. - Ne pas combiner
aria-labeletaria-labelledby: c'est redondant. - Préférer un vrai
<label>avechtmlForplutôt qu'unaria-labelquand c'est possible. - On peut combiner
aria-labelavec un<label>HTML pour préciser le contexte (ex:aria-label="Envoyer mon signalement"sur un bouton "Envoyer"). - On peut utiliser
titlepour afficher une infobulle, maistitlen'est pas bien interprété par tous les lecteurs d'écran : il est plus sûr d'ajouter aussi unaria-label.
- Si une image est décorative, mettre un
alt=""pour qu'elle soit ignorée des lecteurs d'écran. - Si une image n'est pas décorative, éviter de préciser "image" ou "logo" dans son alternative textuelle : les lecteurs d'écran vocalisent déjà la nature du composant.
- Les emojis utilisés comme icônes significatives doivent avoir une alternative textuelle (via
aria-labelou texte caché.sr-only). - Les emojis décoratifs doivent avoir
aria-hidden="true"pour être ignorés des lecteurs d'écran.
- Toujours associer un
labelà chaqueinput(un placeholder ne suffit pas et n'est pas restitué par un lecteur d'écran). - Toujours mettre une liaison
for/identre uninputet sonlabel, même lorsqu'ils sont imbriqués. - Les groupes de boutons radio ou de checkboxes doivent être contenus dans un
<fieldset>avec une<legend>. - Indiquer le format de saisie attendu dans le label ou dans une description connectée à l'input via
aria-describedby.
- Les liens qui ouvrent une nouvelle fenêtre doivent l'indiquer dans leur
aria-labelou leur intitulé visible (ex: "GitHub, nouvelle fenêtre"). - Les liens doivent être explicites : éviter "En savoir plus" seul, préférer "En savoir plus sur le statut SASU" ou utiliser un
aria-labelcontextuel.
- Assurer un contraste suffisant entre le texte et son arrière-plan : au minimum 4,5:1 pour le corps de texte et 3:1 pour les titres (vérifier avec le Contrast Checker de WebAIM).
- Assurer un contraste suffisant entre les éléments interactifs (bouton, champs de formulaire, ...) et leur arrière-plan : au minimum 3:1. Les bordures doivent aussi avoir un contraste suffisant. Utiliser les couleurs du thème existant plutôt que d'en chercher de nouvelles (le Contrast Finder de Tanaguru est surtout utile aux designers lors de la création d'un thème).
- Ne jamais indiquer une information uniquement par la couleur (ex: la page courante doit avoir un autre indicateur visuel en plus de la couleur).
- Utiliser le HTML sémantique :
<ul>/<ol>/<li>pour les listes,<nav>pour la navigation. - Préférer
<ul>/<li>àrole="list"/role="listitem". - Respecter la hiérarchie des titres (ex: ne pas utiliser un
<h4>à la suite d'un<h2>). Ressource utile : le plugin HeadingsMap. - Ne pas imbriquer d'éléments de titre (
<h3>, etc.) dans des boutons ou liens d'accordion : utiliser des<span>stylisés à la place. - Le titre d'une modale doit généralement être un
<h1>car la modale devient le contexte principal lors de son affichage.
- Tous les tableaux de données doivent avoir un
<caption>pour les décrire. - Utiliser
<th scope="col">pour les en-têtes de colonnes et<th scope="row">pour les en-têtes de lignes.
- Tous les éléments interactifs doivent être accessibles au clavier et avoir un indicateur de focus visible. Utiliser des éléments HTML natifs (
<button>,<a>,<input>...) qui le sont par défaut, ou consulter les patterns APG pour les composants complexes (ils indiquent les interactions clavier à implémenter). - Ajouter un
tabindex="-1"pour pouvoir donner le focus avec JS (via.focus()) à un élément qui ne le prend pas naturellement et qu'on ne veut pas rendre atteignable au clavier.
- Implémenter le pattern Dialog complet (attributs ARIA, touche Échap, focus trap). Utiliser le composant Modal de
react-aria-components.
- Utiliser un
role="alert/status/log"plutôt que les attributsaria-liveetaria-atomic, beaucoup moins bien supportés (cf. https://a11ysupport.io). - Ne pas créer dynamiquement cette "live region" au moment d'y injecter du contenu : cette "live region" sera plus fiable si elle est présente dans le DOM avant cette injection de contenu.
- Pour les valeurs numériques avec espaces comme séparateurs de milliers (ex: "1 234 €"), supprimer les espaces dans l'
aria-labelpour que les lecteurs d'écran les lisent correctement comme un nombre unique.
- Utiliser
remau lieu depxpour les tailles de police (permet le respect du paramètre "Taille de police" du navigateur).
Pour les composants complexes, se référer aux patterns officiels du W3C qui détaillent les attributs ARIA nécessaires et les interactions clavier à implémenter :
- Accordion (Accordéon)
- Alert (Alerte)
- Breadcrumb (Fil d'Ariane)
- Checkbox (Case à cocher)
- Combobox (Autocomplétion)
- Dialog (Modale)
- Disclosure (Afficher/Masquer)
- Landmarks (Régions de page)
- Radio Group (Boutons radio)
- Slider (Curseur)
- Switch (Interrupteur)
- Tabs (Onglets)
- Tooltip (Infobulle)
- Patterns ARIA APG - Référence officielle pour les composants complexes
- a11ysupport.io - Support des fonctionnalités ARIA par les lecteurs d'écran (seule source en la matière, à prendre avec réserve car projet maintenu par une seule personne)
- RGAA - Référentiel Général d'Amélioration de l'Accessibilité
- WCAG 2.1 - Web Content Accessibility Guidelines