Developer Tools

Accessibilité Web (a11y) : Guide Pratique pour les Développeurs

Découvrez les principes essentiels de l'accessibilité, les attributs ARIA, les modèles de navigation au clavier et les outils de test pour rendre vos applications web utilisables par tous.

8 min de lecture

Personne utilisant un ordinateur portable avec une technologie d'assistance

Plus d'1,3 milliard de personnes — soit 16 % de la population mondiale — vivent avec une forme de handicap. L'accessibilité web garantit que votre site fonctionne pour les utilisateurs qui dépendent de lecteurs d'écran, de la navigation au clavier, de dispositifs de contrôle par commutation ou d'autres technologies d'assistance. Au-delà de l'inclusion, les sites accessibles sont mieux référencés dans les moteurs de recherche, plus performants sur mobile, et souvent exigés par la loi.

Les quatre principes POUR

Les Règles pour l'Accessibilité des Contenus Web (WCAG) reposent sur quatre principes fondamentaux. Le contenu doit être :

  1. Perceptible — L'information doit pouvoir être présentée de façons que les utilisateurs peuvent percevoir (pas uniquement visuellement).
  2. Utilisable — Toutes les fonctionnalités doivent être accessibles au clavier.
  3. Compréhensible — Le contenu et les interfaces doivent être compréhensibles.
  4. Robuste — Le contenu doit pouvoir être interprété par les technologies d'assistance.

WCAG 2.2 définit trois niveaux de conformité :

  • A — Minimum (indispensable)
  • AA — Cible standard pour la plupart des organisations
  • AAA — Maximum (objectif ambitieux pour certains contenus)

La plupart des exigences légales (ADA, EN 301 549, EAA) imposent une conformité AA.

Le HTML sémantique avant tout

La chose la plus impactante que vous puissiez faire pour l'accessibilité, c'est d'utiliser le bon élément HTML pour chaque usage. Les navigateurs et les lecteurs d'écran savent déjà quoi faire avec les éléments sémantiques :

<!-- ❌ Soupe de divs — aucune sémantique -->
<div class="header">
  <div class="nav">
    <div class="nav-item" onclick="navigate()">Home</div>
  </div>
</div>

<!-- ✅ HTML sémantique — compréhensible par les lecteurs d'écran -->
<header>
  <nav>
    <a href="/">Home</a>
  </nav>
</header>

Éléments sémantiques clés et leurs rôles :

Élément Rôle
<header>, <footer> Régions de repère
<nav> Repère de navigation
<main> Contenu principal (un seul par page)
<aside> Contenu complémentaire
<h1><h6> Hiérarchie des titres
<button> Contrôle interactif
<a href> Lien de navigation
<label> Étiquette de champ de formulaire
<table> Données tabulaires

Images et texte alternatif

Chaque image significative doit avoir un attribut alt décrivant son contenu. Les images décoratives reçoivent un alt="" vide pour que les lecteurs d'écran les ignorent :

<!-- Image significative -->
<img src="chart.png" alt="Graphique en barres montrant une augmentation de 40 % des revenus au T1 2026">

<!-- Image décorative -->
<img src="divider.svg" alt="">

<!-- Bouton avec icône — décrire l'action, pas l'icône -->
<button>
  <img src="trash.svg" alt="Supprimer l'élément">
</button>

<!-- À éviter : "image de" est redondant -->
<!-- ❌ --> <img src="cat.jpg" alt="Image of a cat">
<!-- ✅ --> <img src="cat.jpg" alt="Orange tabby cat sitting on a windowsill">

Contraste des couleurs

Les utilisateurs malvoyants ou daltoniens dépendent d'un contraste suffisant entre le texte et l'arrière-plan.

Exigences WCAG AA :

  • Texte normal (< 18pt) : rapport de contraste minimum de 4,5:1
  • Grand texte (≥ 18pt ou 14pt en gras) : rapport de contraste minimum de 3:1
  • Composants d'interface et éléments graphiques : minimum 3:1

Ne vous fiez pas uniquement à la couleur pour transmettre une information :

<!-- ❌ Indicateur d'état basé uniquement sur la couleur -->
<span class="text-red-500">Error</span>

<!-- ✅ Couleur + icône + texte -->
<span class="text-red-500 flex items-center gap-1">
  <svg aria-hidden="true"><!-- icône d'erreur --></svg>
  Erreur : adresse e-mail invalide
</span>

Formulaires : étiquettes, erreurs et descriptions

Chaque contrôle de formulaire doit avoir une étiquette visible et associée :

<!-- ✅ Association explicite de l'étiquette -->
<label for="email">Adresse e-mail</label>
<input id="email" type="email" aria-describedby="email-hint email-error">
<p id="email-hint" class="text-sm text-gray-500">Nous ne partagerons jamais votre e-mail.</p>
<p id="email-error" role="alert" class="text-sm text-red-600" hidden>
  Veuillez saisir une adresse e-mail valide.
</p>

Bonnes pratiques d'accessibilité pour les formulaires :

  • Utilisez for/id pour associer les étiquettes aux champs
  • Utilisez aria-describedby pour les textes d'aide et les messages d'erreur
  • Utilisez role="alert" ou aria-live="polite" pour les messages d'erreur dynamiques
  • Utilisez aria-required="true" ou l'attribut natif required
  • Regroupez les champs liés avec <fieldset> et <legend>

Tous les éléments interactifs doivent être accessibles et utilisables au clavier :

  • Tab — avancer parmi les éléments pouvant recevoir le focus
  • Shift+Tab — reculer
  • Entrée/Espace — activer les boutons, les cases à cocher
  • Touches fléchées — naviguer à l'intérieur des composants (menus, onglets, curseurs)
  • Échap — fermer les modales, masquer les menus déroulants

Les indicateurs de focus doivent être visibles. Ne faites jamais ceci sans alternative :

/* ❌ Masque totalement l'indicateur de focus */
*:focus { outline: none; }

/* ✅ Style de focus personnalisé, mais toujours visible */
*:focus-visible {
  outline: 2px solid #3b82f6;
  outline-offset: 2px;
}

ARIA : quand et comment l'utiliser

Les attributs ARIA (Accessible Rich Internet Applications) ajoutent une signification sémantique lorsque le HTML seul ne suffit pas. La première règle d'ARIA : ne pas utiliser ARIA si le HTML natif peut faire le travail.

<!-- Étiqueter des éléments sans label visible -->
<button aria-label="Fermer la boîte de dialogue">✕</button>

<!-- Décrire l'état développé -->
<button aria-expanded="false" aria-controls="menu">Menu</button>
<ul id="menu" hidden>...</ul>

<!-- Région dynamique pour le contenu mis à jour -->
<div aria-live="polite" aria-atomic="true">
  <!-- Les lecteurs d'écran annoncent les changements dans cette zone -->
  3 résultats trouvés
</div>

<!-- Rôle de repère quand l'élément sémantique n'est pas disponible -->
<div role="search">
  <input type="search" placeholder="Rechercher...">
</div>

Gestion du focus pour les SPA et les modales

Dans les applications monopage (SPA), la navigation entre pages ne déclenche pas de réinitialisation du focus par le navigateur. Lorsqu'une « page » se charge, déplacez le focus vers un emplacement significatif :

// Après la navigation, mettre le focus sur le titre principal
document.querySelector("h1")?.focus();

Pour les modales :

  1. À l'ouverture de la modale, déplacez le focus sur le premier élément focalisable à l'intérieur
  2. Piégez le focus dans la modale tant qu'elle est ouverte (empêchez Tab d'atteindre le contenu en arrière-plan)
  3. À la fermeture de la modale, renvoyez le focus sur l'élément qui l'a déclenchée

Tester l'accessibilité

Outils automatisés (détectent ~30-40 % des problèmes)

  • Extension navigateur axe DevTools
  • Audit d'accessibilité Lighthouse dans Chrome DevTools
  • Extension navigateur WAVE

Tests manuels (indispensables pour une couverture complète)

  1. Navigation au clavier uniquement — débranchez votre souris et naviguez sur l'intégralité de votre site
  2. Test avec lecteur d'écran — NVDA + Firefox (Windows), VoiceOver + Safari (Mac/iOS)
  3. Zoom à 200 % — vérifiez qu'aucun contenu n'est perdu ni ne se chevauche
  4. Simulation du daltonisme — DevTools navigateur → Rendu → Émuler les déficiences visuelles

Lisibilité

Un langage clair améliore l'accessibilité pour les utilisateurs ayant des troubles cognitifs. Utilisez notre outil Score de lisibilité pour vérifier le niveau de lecture de votre contenu — visez un niveau scolaire de 8 à 10 pour un public général.

Actions rapides à mettre en œuvre dès aujourd'hui

  1. Ajoutez un texte alt à toutes les images
  2. Assurez-vous que tous les champs de formulaire ont un élément <label> associé
  3. Vérifiez que le contraste des couleurs atteint 4,5:1 pour le texte courant
  4. Ajoutez des styles :focus-visible et ne supprimez jamais les contours sans les remplacer
  5. Utilisez <button> pour les actions et <a href> pour la navigation (jamais l'inverse)
  6. Ajoutez lang="fr" (ou la langue appropriée) à votre élément <html>
  7. Utilisez un seul <h1> par page et maintenez une hiérarchie de titres logique

L'accessibilité n'est pas un ajout optionnel — c'est un critère de qualité. Concevoir des produits accessibles dès le départ coûte bien moins cher que de les adapter après coup, et cela les améliore pour tout le monde.