Accessibilité et bonnes pratiques UI
Pourquoi l’accessibilité est-elle cruciale ?
L’accessibilité (ou a11y) vise à garantir que toutes les personnes, y compris celles en situation de handicap, puissent utiliser une application dans des conditions équitables. Elle ne concerne pas uniquement une minorité d’utilisateurs : elle améliore l’expérience de tous, y compris dans des contextes contraints (écran cassé, environnement bruyant, usage clavier ou mobile…).
L’accessibilité repose sur quatre grands principes : perceptible, utilisable, compréhensible et robuste (WCAG). Une interface bien conçue doit être accessible à la voix, au clavier, aux lecteurs d’écran, et offrir un retour d’information clair.
Plusieurs raisons rendent cette exigence incontournable :
-
Inclusion : elle garantit que chacun peut accéder au contenu, quel que soit son handicap (visuel, moteur, cognitif, auditif, etc.).
-
Obligation légale : en France comme dans l’Union européenne, les services publics et une partie des acteurs privés sont tenus par la loi de respecter des critères d’accessibilité (référentiel RGAA, directive européenne 2016/2102).
-
Amélioration de la qualité : une interface accessible est souvent plus robuste, plus cohérente et plus simple à...
Bonnes pratiques fondamentales
L’accessibilité repose sur des principes simples à appliquer dès la conception d’une interface. Ces bonnes pratiques visent à assurer une expérience fluide, compréhensible et utilisable pour tous les profils d’utilisateurs.
|
Élément |
Bonnes pratiques UI / a11y |
|
Titres (<h1>, <h2>, etc.) |
Utiliser une hiérarchie logique. Un seul <h1> par page, suivi de <h2>, <h3>, etc. selon la structure du contenu. |
|
Couleurs |
Vérifier le contraste entre le texte et le fond. Suivre les recommandations WCAG (AA ou AAA). Éviter les textes sur fond d’image sans surcouche. |
|
Liens |
Utiliser le composant <Link /> ou une balise <a> avec un texte explicite. Bannir les intitulés vagues comme « Cliquez ici ». |
|
Formulaires |
Associer chaque champ à un label visible ou à un attribut aria-label. Afficher clairement les messages d’erreur. Utiliser les rôles sémantiques natifs (<input>, <textarea>, etc.). |
|
Images |
Fournir un attribut alt pertinent. Si l’image est purement décorative, ajouter role="presentation" ou alt="". |
|
Focus clavier |
Permettre la navigation complète sans souris. Toutes les interactions doivent être accessibles avec [Tab], [Enter], [Esc], etc. Les éléments doivent être focusables dans un ordre... |
Gestion du focus et navigation clavier
La navigation au clavier est essentielle pour garantir l’accessibilité d’une interface. Elle repose principalement sur la gestion correcte du focus et sur le respect de l’ordre logique de navigation.
1. Ordre naturel
L’ordre de tabulation doit suivre l’ordre logique et visuel des éléments à l’écran.
-
L’ordre de navigation doit correspondre à la structure du DOM. Éviter de désorganiser cette hiérarchie par des manipulations CSS (ex. order en flex ou grid).
-
L’attribut tabIndex doit être utilisé avec parcimonie. L’usage excessif de tabIndex="0" ou de valeurs personnalisées complexifie inutilement la navigation et peut créer des incohérences.
-
Il est déconseillé d’ajouter un focus sur des éléments non interactifs (ex. <div>, <span>) sans raison précise.
2. Focus visible
Il est impératif que les utilisateurs sachent à tout moment où se trouve le focus clavier.
-
Tous les éléments interactifs doivent avoir un état de focus visuel clair (contour, ombre portée, changement de couleur…).
-
Cet indicateur doit être visible sur tous les navigateurs et systèmes.
Exemple avec Tailwind CSS :
<button className="focus:outline-none focus:ring-2
focus:ring-blue-500"> ...Rôle des composants UI : privilégier les libs accessibles
1. Un problème courant dans les projets modernes
De nombreuses bibliothèques d’interface, bien que populaires, sont :
-
mal maintenues,
-
peu ou pas accessibles,
-
ou inadaptées aux exigences modernes (SSR, personnalisation, etc.).
Cela conduit à des interfaces non navigables au clavier, mal interprétées par les lecteurs d’écran, et non conformes aux normes d’accessibilité.
2. Une solution fiable : shadcn/ui + Radix UI
Le duo shadcn/ui et Radix UI constitue une alternative robuste, moderne et accessible.
-
Radix UI fournit les primitives d’accessibilité : gestion du focus, rôles ARIA, clavier, interactions.
-
shadcn/ui assemble ces composants avec une base visuelle cohérente, personnalisable et adaptée à tous les projets Next.js.
Cette approche présente plusieurs atours structurants en matière d’accessibilité, de maintenabilité et d’intégration avec Next.js :
-
composants clavier-navigables par défaut,
-
compatibilité ARIA (modales, menus, accordéons…),
-
design thémable via Tailwind CSS,
-
support complet du Server Side Rendering (SSR),
-
mise à jour facile (composants copiés dans le repo local).
3. Exemple : modale accessible
import { Dialog, DialogContent, DialogTrigger } from ...Responsive et ergonomie mobile
Une interface web moderne doit être parfaitement utilisable sur mobile, y compris pour les personnes âgées, malvoyantes ou en situation de handicap moteur. Le responsive ne se limite pas à l’adaptation visuelle : il concerne aussi l’ergonomie, la densité d’information et la facilité d’interaction.
1. Layouts adaptatifs
La conception d’un layout adaptatif repose sur l’utilisation de techniques CSS modernes permettant une adaptation progressive aux contraintes d’affichage.
-
Utiliser des layouts fluides avec flex, grid, min-width, max-width, gap.
-
Préférer des largeurs en rem, % ou vw plutôt qu’en pixels fixes.
-
Gérer les points de rupture (breakpoints) avec des classes Tailwind (sm :, md :, lg :…).
2. Zones interactives suffisantes
Pour garantir une expérience cohérente sur mobile, tablette et desktop, il est essentiel d’adopter des règles de mise en page adaptatives dès la conception.
-
Les éléments cliquables (boutons, liens, icônes) doivent respecter le critère WCAG 2.2 (SC 2.5.8) relatif à la taille des cibles, soit au minimum 24x24 CSS pixels, sauf exceptions prévues par la norme.
-
Pour les interfaces mobiles ou tactiles, il est toutefois recommandé d’adopter des cibles plus larges (environ 44-48px) afin d’améliorer...
ARIA et HTML sémantique
L’accessibilité commence par un HTML bien structuré. Trop souvent, des éléments non sémantiques comme des <div> ou <span> sont utilisés à tort à des fins interactives, rendant la navigation difficile pour les lecteurs d’écran ou les utilisateurs au clavier.
1. Priorité à la sémantique native
Il est toujours préférable d’utiliser un élément HTML natif sémantique plutôt qu’un rôle ARIA ajouté manuellement.
Bonnes pratiques :
|
Objectif |
Élément recommandé |
|
Bouton d’action |
<button> (plutôt que <div onClick> ou <a href="#">) |
|
Lien de navigation |
<a href="..."> |
|
Formulaire |
<form>, <label>, <input> |
|
Zone de navigation |
<nav> |
|
Contenu principal |
<main> |
|
Liste |
<ul>, <ol>, <li> |
|
Section |
<section>, avec titre explicite (<h2>) |
|
Complément d’information |
<aside> |
Un balisage correct permet aux technologies d’assistance de comprendre la structure de la page sans effort supplémentaire.
2. Utiliser ARIA seulement si nécessaire
ARIA (Accessible Rich Internet Applications) est une spécification permettant d’ajouter des rôles, états et propriétés aux éléments pour améliorer...
Outils de test d’accessibilité
L’audit d’accessibilité ne peut pas être laissé au hasard. Plusieurs outils permettent de vérifier la conformité d’une interface, de détecter les erreurs courantes et d’anticiper les problèmes pour les utilisateurs en situation de handicap.
1. Tests automatisés
|
Outil |
Description |
|
Lighthouse a11y |
Audit intégré à Chrome DevTools, fournit un score d’accessibilité global avec recommandations détaillées. |
|
axe DevTools |
Extension Chrome et Firefox développée par Deque, identifie précisément les problèmes dans le DOM. |
|
jest-axe |
Intégration de la librairie axe dans les tests Jest pour détecter automatiquement les violations WCAG. |
|
@testing-library/ jest-dom |
Permet d’intégrer des tests d’accessibilité dans les suites Jest (ex : vérification de rôles, états ARIA, visibilité, focus). |
|
Playwright + axe |
Permet d’automatiser des audits d’accessibilité en environnement E2E. |
Ces outils permettent de détecter automatiquement de nombreuses erreurs structurelles (hiérarchie des titres, absence d’attribut alt, contrastes insuffisants, rôles ARIA incorrects, etc.). Toutefois, ils ne remplacent par un test humain, notamment pour évaluer la cohérence sémantique...
Cas concret : rendre un composant accessible
Beaucoup de composants visuellement corrects posent de graves problèmes d’accessibilité s’ils ne respectent pas les standards HTML et ARIA. Voici un exemple typique d’erreur, suivi de sa version corrigée.
1. Exemple courant de mauvaise pratique
//
Composant non accessible
<div onClick={() => submit()} className="cursor-pointer">
Envoyer
</div>
Cette implémentation présente plusieurs lacunes majeures en matière d’accessibilité et de sémantique HTML :
-
Le div n’a pas de rôle sémantique (n’est pas reconnu comme bouton).
-
Il n’est pas focusable au clavier (impossible d’y accéder avec Tab).
-
Il ne réagit pas à Enter ou Espace, contrairement à un vrai bouton.
-
Il n’est pas annoncé correctement par un lecteur d’écran.
2. Correction accessible
//
Composant accessible
<button onClick={() => submit()} className="px-4 py-2
focus:ring-2 focus:outline-none">
Envoyer
</button>
Cette version corrige les défauts précédents en s’appuyant sur la sémantique native du HTML et en respectant les standards d’accessibilité.
-
Le button est nativement focusable.
-
Il répond aux interactions clavier...
Checklists d’accessibilité front-end
Ces checklists permettent de s’assurer qu’une interface est utilisable par tous, en couvrant les fondamentaux de l’accessibilité (a11y) du point de vue structurel, visuel et interactionnel.
1. Structure HTML
Une structure HTML rigoureuse constitue le socle d’une accessibilité et d’un référencement efficaces.
-
Un seul <h1> par page, représentatif du contenu principal.
-
Hiérarchie logique des titres (h2 -> h3 -> h4…), sans sauts arbitraires.
-
Sections structurées avec des balises sémantiques : <main>, <header>, <footer>, <nav>, <article>, <section>, etc.
-
Présence d’une langue définie dans le HTML (<html lang="fr">).
2. Texte et couleurs
La lisibilité du contenu repose sur un contraste suffisant, une hiérarchisation claire de l’information et une accessibilité visuelle conforme aux recommandations WCAG.
-
Contraste suffisant entre texte et fond (au moins AA, idéalement AAA selon WCAG).
-
Pas de texte uniquement en image.
-
Le texte peut être redimensionné jusqu’à 200 % sans perte de lisibilité ou de fonctionnalité.
-
Éviter les jeux de couleurs seuls pour transmettre une information (ex. : « en rouge » sans alternative textuelle)....