Chapitre 7 du RGAA : Scripts – rendre les interfaces dynamiques accessibles

Introduction
Le chapitre 7 du RGAA traite des scripts, c’est-à-dire de tous les contenus et fonctionnalités générés ou modifiés par JavaScript. Aujourd’hui, une grande partie des interfaces web modernes repose sur des composants dynamiques : menus déroulants, modales, carrousels, accordéons, onglets, formulaires interactifs, etc.
Ces éléments peuvent poser des problèmes d’accessibilité s’ils ne sont pas correctement conçus, car ils modifient le contenu sans rechargement de page. L’objectif de ce chapitre est de s’assurer que ces interactions restent compréhensibles, utilisables au clavier et compatibles avec les technologies d’assistance.
Les enjeux des scripts pour l’accessibilité
Contrairement au HTML statique, les scripts peuvent :
Ajouter du contenu dynamiquement
Modifier des états visuels
Afficher ou masquer des éléments
Créer des composants entièrement personnalisés
Sans indications adaptées, un lecteur d’écran peut ne pas détecter ces changements, et un utilisateur clavier peut ne pas pouvoir interagir correctement.
Principe fondamental : une fonctionnalité scriptée doit rester accessible
Le RGAA impose notamment que :
Tous les composants soient utilisables au clavier
Les changements dynamiques soient signalés
Les rôles et états soient correctement exposés
Les composants personnalisés aient un équivalent sémantique
ARIA joue ici un rôle central pour compléter le HTML.
Exemple 1 : menu déroulant (aria-expanded)
Un menu qui s’ouvre et se ferme doit annoncer son état.
<button
aria-expanded="false"
aria-controls="menu1"
onclick="toggleMenu()">
Menu
</button>
<ul id="menu1" hidden>
<li><a href="/profil">Profil</a></li>
<li><a href="/deconnexion">Déconnexion</a></li>
</ul>
Lors de l’ouverture, le script doit modifier l’état :
function toggleMenu() {
const button = document.querySelector('button');
const menu = document.getElementById('menu1');
const isOpen = button.getAttribute('aria-expanded') === 'true';
button.setAttribute('aria-expanded', !isOpen);
menu.hidden = isOpen;
}
Cela permet au lecteur d’écran d’annoncer « développé » ou « réduit ».
Exemple 2 : fenêtre modale (role="dialog")
Une modale doit être identifiée comme telle.
<div
role="dialog"
aria-labelledby="titre-modal"
aria-modal="true">
<h2 id="titre-modal">Confirmation</h2>
<p>Voulez-vous supprimer cet élément ?</p>
<button>Oui</button>
<button>Non</button>
</div>
ARIA permet d’indiquer :
Le type de composant (
role="dialog")Le titre associé (
aria-labelledby)Le contexte modal (
aria-modal="true")
Exemple 3 : contenu mis à jour dynamiquement (aria-live)
Si un script modifie une information importante, elle doit être annoncée.
<p aria-live="polite" id="resultat"></p>
Quand le contenu change :
document.getElementById('resultat').textContent =
"Votre message a été envoyé";
Le lecteur d’écran annonce automatiquement la mise à jour.
Exemple 4 : onglets dynamiques (role="tab")
<div role="tablist">
<button role="tab" aria-selected="true" aria-controls="panel1">
Description
</button>
<button role="tab" aria-selected="false" aria-controls="panel2">
Avis
</button>
</div>
<div id="panel1" role="tabpanel">
Contenu de la description
</div>
<div id="panel2" role="tabpanel" hidden>
Contenu des avis
</div>
Le script doit mettre à jour aria-selected lors du changement d’onglet.
Exemple 5 : bouton personnalisé créé en div (solution de secours)
Si un composant n’utilise pas <button>, il faut recréer son accessibilité.
<div
role="button"
tabindex="0"
onclick="valider()"
onkeydown="if(event.key==='Enter'){valider();}">
Valider
</div>
Mais la meilleure solution reste :
<button onclick="valider()">Valider</button>
Le HTML natif est toujours préférable.
Exemple 6 : indicateur de chargement (aria-busy)
<div aria-busy="true" id="zone">
Chargement en cours...
</div>
Une fois le contenu chargé :
document.getElementById('zone').setAttribute('aria-busy', 'false');
Cela informe que la mise à jour est terminée.
Les critères clés du RGAA pour les scripts
Le chapitre 7 vérifie notamment que :
Les fonctionnalités sont accessibles au clavier
Les événements ne reposent pas uniquement sur la souris
Les changements dynamiques sont annoncés
Les états des composants sont exposés
Les technologies d’assistance peuvent comprendre les interactions
ARIA est souvent nécessaire pour répondre à ces exigences.
Erreurs fréquentes observées en audit
On retrouve souvent :
Menus qui s’ouvrent sans indication d’état
Contenus dynamiques non annoncés
Boutons créés en div non accessibles au clavier
Focus perdu lors d’une action
Modales impossibles à fermer au clavier
Ces problèmes rendent l’interface difficile, voire inutilisable.
Impact concret pour les utilisateurs
Sans gestion correcte des scripts :
Un lecteur d’écran ne sait pas qu’un contenu a changé
Un utilisateur clavier peut rester bloqué
Un composant peut sembler « invisible » malgré sa présence à l’écran
ARIA permet de rendre ces interactions compréhensibles et prévisibles.
Conclusion
Le chapitre 7 du RGAA encadre l’accessibilité des interfaces dynamiques pilotées par JavaScript. Il impose que toute interaction reste utilisable au clavier, compréhensible par les technologies d’assistance et clairement annoncée lorsqu’un changement survient.
Les balises et attributs ARIA jouent ici un rôle majeur pour décrire les rôles, les états et les relations entre les composants. Toutefois, le principe reste le même : privilégier le HTML natif dès que possible, et utiliser ARIA pour compléter lorsque les interfaces deviennent plus complexes.
