Voici une synthèse claire, structurée et très pratique pour appliquer l’accessibilité directement dans votre code HTML.
L’accessibilité dans le HTML repose sur l’utilisation de balises sémantiques et d’attributs ARIA, essentiels pour respecter les WCAG et le RGAA.
Pour connaitre toutes les nouveautés 2025 sur l’accessibilité web, vous pouvez consulter notre article « L’Accessibilité Numérique : Une Porte Ouverte sur le Web pour Chacun »
1. Structurer correctement les titres (H1 → H6)
Objectif : permettre aux lecteurs d’écran de comprendre la hiérarchie de la page.
✔ Bon exemple
<h1>Accessibilité numérique en 2025</h1>
<h2>Pourquoi l’accessibilité devient obligatoire</h2>
<h3>Les obligations légales</h3>
<h3>Les échéances à respecter</h3>
<h2>Comment rendre un site accessible</h2>
<h3>Audit et analyse</h3>
<h3>Corrections techniques</h3>
❌ Mauvais exemple
<h1>Accessibilité</h1>
<p><strong>Pourquoi l’accessibilité devient obligatoire</strong></p>
2. Ajouter des balises ALT correctes pour les images
✔ Images informatives (doivent être décrites)
<img src="bouton-fermer.svg" alt="Fermer la fenêtre">
<img src="graphique-audit.png" alt="Graphique montrant le score d’accessibilité">
✔ Images décoratives (ne rien décrire)
<img src="fond-decoratif.png" alt="">
❌ Mauvais exemple (bloque le lecteur d’écran)
<img src="icone.png">
3. Assurer une navigation complète au clavier
✔ Ajouter un style pour l’indication du focus
<style>
:focus {
outline: 3px solid #000;
outline-offset: 4px;
}
</style>
✔ Vérifier que tous les éléments interactifs sont des balises correctes
<a href="/contact">Nous contacter</a>
<button type="button">Ouvrir le menu</button>
❌ Mauvais exemple (inaccessible au clavier)
<div onclick="ouvrirMenu()">Menu</div>
4. Utiliser un HTML sémantique
Objectif : permettre aux technologies d’assistance de comprendre la structure.
✔ Exemple complet
<header>
<nav>
<ul>
<li><a href="#intro">Introduction</a></li>
<li><a href="#obligations">Obligations 2025</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
</header>
<main>
<section id="intro">
<h1>Accessibilité numérique : comprendre les enjeux</h1>
<p>Introduction du sujet...</p>
</section>
<section id="obligations">
<h2>Obligations légales 2025</h2>
<p>Explication...</p>
</section>
</main>
<footer>
<p>© 2025 - Déclaration d’accessibilité</p>
</footer>
5. Assurer des contrastes suffisants
Utiliser WCAG AA : ratio minimal 4.5:1.
✔ Exemple de bouton accessible
<button style="background:#0053b3; color:white; padding:12px 20px;">
Envoyer
</button>
❌ Exemple inaccessible
<button style="background:#87cefa; color:white;">
Envoyer
</button>
Couleurs trop claires = illisibles.
6. Construire des formulaires accessibles
✔ Exemple conforme
<form>
<label for="email">Adresse email</label>
<input id="email" type="email" name="email" required>
<label for="message">Votre message</label>
<textarea id="message" name="message"></textarea>
<button type="submit">Envoyer</button>
</form>
❌ Mauvais exemple (placeholder ≠ label)
<input type="email" placeholder="Votre email">
Le placeholder disparaît → illisible pour un lecteur d’écran.
7. Rendre les tableaux accessibles
✔ Exemple conforme
<table>
<caption>Calendrier des obligations d’accessibilité</caption>
<thead>
<tr>
<th scope="col">Type de site</th>
<th scope="col">Date de conformité</th>
</tr>
</thead>
<tbody>
<tr>
<td>Nouveaux sites</td>
<td>28 juin 2025</td>
</tr>
<tr>
<td>Sites existants</td>
<td>28 juin 2030</td>
</tr>
</tbody>
</table>
→ caption, scope et thead améliorent la lecture audio.
8. Prévenir les crises d’épilepsie et les animations dangereuses
✔ Exemple conforme
<div class="banner" style="animation: none;">
Promo spéciale
</div>
❌ Mauvais exemple
<div style="animation: flash 0.1s infinite;">Promo !!!</div>
Animations rapides = interdites.
9. Ajouter des sous-titres aux vidéos
✔ Exemple via <track>
<video controls>
<source src="presentation.mp4" type="video/mp4">
<track src="sous-titres.vtt" kind="subtitles" srclang="fr" label="Français">
</video>
10. Gérer les liens
✔ Liens explicites
<a href="/audit-accessibilite">Consulter l’audit d’accessibilité</a>
❌ Liens ambigus
<a href="#">Cliquez ici</a>
11. Ajouter une “skip link” (passer au contenu)
Indispensable pour les lecteurs d’écran et les utilisateurs clavier.
✔ À mettre juste après <body>
<a href="#contenu" class="skip-link">Aller au contenu</a>
<style>
.skip-link {
position:absolute;
left:-999px;
top:auto;
background:#000;
color:#fff;
padding:10px;
}
.skip-link:focus {
left:10px;
top:10px;
}
</style>
12. Faire des boutons réels (pas des faux liens)
Indispensable pour les lecteurs d’écran et les utilisateurs clavier.
✔ Bon
<button type="button">Ouvrir le menu</button>
❌ Mauvais
<a onclick="ouvrirMenu()">Menu</a>
13. Ajouter ARIA uniquement si nécessaire
Indispensable pour les lecteurs d’écran et les utilisateurs clavier.
✔ Bon
<button aria-expanded="false" aria-controls="menu">Menu</button>
❌ ARIA inutile (pollution)
<p role="heading" aria-level="1">Titre</p>
Toujours privilégier le HTML natif.
| Attribut / Rôle ARIA | Utilité | Exemple correct | Quand l’utiliser |
|---|---|---|---|
| role= »button » | Indique à un lecteur d’écran qu’un élément se comporte comme un bouton | html<br><div role="button" tabindex="0">Ouvrir</div> | Lorsque l’on utilise un élément non interactif comme bouton (déconseillé, mieux vaut <button>) |
| role= »navigation » | Déclare une zone de navigation principale | html<br><nav role="navigation"> ... </nav> | Rarement nécessaire sur <nav> (déjà sémantique), utile sur des divs |
| role= »banner » | Identifie l’en-tête principal du site | html<br><header role="banner"></header> | Si <header> contient le branding principal |
| role= »contentinfo » | Identifie le pied de page du site | html<br><footer role="contentinfo"></footer> | Pour signaler des infos sur le site |
| role= »main » | Indique la zone principale du contenu | html<br><main role="main"></main> | Souvent inutile car <main> est déjà sémantique |
| role= »complementary » | Contenu complémentaire (sidebar, encadrés) | html<br><aside role="complementary"></aside> | Pour les blocs secondaires |
| role= »alert » | Annonce un message important immédiatement | html<br><div role="alert">Erreur lors de l’envoi.</div> | Pour les erreurs formulaires, messages critiques |
| role= »status » | Message non bloquant, lu automatiquement | html<br><div role="status">Sauvegarde réussie.</div> | Notifications discrètes |
| role= »dialog » | Indique une fenêtre modale | html<br><div role="dialog" aria-modal="true"> ... </div> | Pour les pop-ups, modales |
| role= »search » | Indique une zone de recherche | html<br><div role="search"> ... </div> | Pour un formulaire de recherche dans un bloc non sémantique |
| aria-label | Donne un nom accessible à un élément | html<br><button aria-label="Ouvrir le menu">☰</button> | Pour les icônes, boutons sans texte |
| aria-labelledby | Associe un élément à un autre pour son nom | html<br><div aria-labelledby="titre1"><h2 id="titre1">Infos</h2></div> | Pour regrouper plusieurs labels |
| aria-describedby | Fournit une description supplémentaire | html<br><input aria-describedby="help"><span id="help">8 caractères min.</span> | Formulaires, champs complexes |
| aria-hidden= »true » | Cache un élément aux lecteurs d’écran | html<br><span aria-hidden="true">★</span> | Icônes décoratives |
| aria-expanded | Indique si un menu ou accordéon est ouvert | html<br><button aria-expanded="false" aria-controls="menu">Menu</button> | Menus déroulants, accordéons |
| aria-controls | Lien avec l’élément contrôlé | html<br><button aria-controls="menu">Menu</button> | Pour relier un toggle à son contenu |
| aria-live= »polite » / « assertive » | Indique comment les lecteurs d’écran doivent annoncer un changement | html<br><div aria-live="polite">Mise à jour…</div> | Données dynamiques (AJAX, recherche) |
| aria-modal= »true » | Indique qu’une modale empêche l’accès au reste de la page | html<br><div role="dialog" aria-modal="true"> ... </div> | Fenêtres modales |
| aria-checked | État d’une case à cocher ou switch | html<br><div role="checkbox" aria-checked="false"></div> | Composants personnalisés |
| aria-selected | Indique l’élément sélectionné dans une liste | html<br><li role="option" aria-selected="true">Option A</li> | Listes, onglets |
| aria-required= »true » | Indique qu’un champ est obligatoire | html<br><input aria-required="true"> | Champs formulaires |
| aria-invalid= »true » | Indique qu’un champ contient une erreur | html<br><input aria-invalid="true"> | Formulaires invalides |
Notes essentielles pour utiliser ARIA correctement
Toujours privilégier le HTML natif avant ARIA
Exemple : utilisez<button>au lieu de<div role="button">.ARIA ne rend pas un élément interactif
Si vous utilisezrole="button", vous devez ajouter aussi :le focus clavier (
tabindex="0")les événements clavier
Enter/Space
Ne jamais utiliser ARIA si l’équivalent HTML existe déjà
Exemple : inutile d’ajouterrole="navigation"sur<nav>.
FAQ
Les attributs ARIA améliorent l’accessibilité en fournissant des informations supplémentaires aux lecteurs d’écran lorsque les balises HTML ne suffisent pas.
L’accessibilité repose sur les balises sémantiques, les attributs ARIA, un contenu structuré, des labels sur les formulaires et un contraste suffisant.
ARIA n’est pas obligatoire, mais il est recommandé lorsque le HTML ne permet pas de décrire un comportement ou un état d’interface.
On utilise des outils comme Wave, aXe, Lighthouse ou le lecteur d’écran NVDA pour vérifier la conformité WCAG/RGAA.

