SPA (React, Vue) et Accessibilité : Le piège de la gestion du focus
En Bref : L'essentiel à retenir
- Les Single Page Applications (SPA) posent des problèmes d'accessibilité pour les utilisateurs de lecteurs d'écran car les changements de contenu ne déclenchent pas automatiquement d'annonces.
- La solution consiste à gérer manuellement le focus : mettre à jour le `<title>` de la page et déplacer le focus vers un élément clé (par exemple, le titre principal `<h1>`) à chaque changement d'URL.
- Pour des changements de contenu plus subtils, tels que le filtrage d'une liste, il est recommandé d'utiliser des régions `aria-live` pour annoncer les mises à jour sans interrompre l'utilisateur.
- La gestion de l'accessibilité des SPA est une responsabilité technique cruciale, notamment pour les développeurs utilisant des frameworks JavaScript modernes.
Les Single Page Applications (SPA) ont révolutionné le web. Mais elles ont cassé un mécanisme fondamental du navigateur : le rechargement de page. Pour un aveugle utilisant un lecteur d'écran, quand une page se recharge, le logiciel annonce le nouveau titre. Sur une SPA, rien ne se passe. L'utilisateur clique sur un lien, le contenu change visuellement, mais le focus reste sur le lien cliqué (ou pire, est perdu dans le vide).
Le problème du "Silence Radio"
Imaginez : vous cliquez sur "Page suivante". Visuellement, la page change. Mais votre lecteur d'écran reste muet. Vous ne savez pas si l'action a fonctionné. C'est l'expérience par défaut sur React Router ou Vue Router si vous ne faites rien.
La solution : Gérer le focus manuellement
À chaque changement de route (changement d'URL), vous devez forcer le navigateur à annoncer le changement.
La méthode recommandée :
- Changer le
<title>: C'est la première chose à faire. Utilisezdocument.title = "Nouvelle Page - Mon App". - Déplacer le focus : Envoyez le focus sur le titre principal
<h1>de la nouvelle page (ou sur un conteneur principal).- Astuce : Ajoutez
tabindex="-1"au<h1>pour pouvoir lui donner le focus programmatiquement sans qu'il soit tabulable au clavier.
- Astuce : Ajoutez
Exemple en React (Hook)
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
export const usePageTracking = () => {
const location = useLocation();
useEffect(() => {
// 1. Mettre à jour le titre
document.title = getTitleFromRoute(location.pathname);
// 2. Déplacer le focus vers le H1 ou le Main
const mainHeader = document.querySelector('h1');
if (mainHeader) {
mainHeader.setAttribute('tabindex', '-1');
mainHeader.focus();
}
}, [location]);
};
Les Live Regions (aria-live)
Pour des changements plus subtils (ex: filtrer une liste sans changer d'URL), utilisez une région aria-live="polite".
<div aria-live="polite">
3 résultats trouvés.
</div>
Le lecteur d'écran lira ce texte dès qu'il changera, sans interrompre l'utilisateur.
Conclusion
L'accessibilité des SPA ne "vient pas toute seule". C'est une responsabilité technique. Si vous utilisez un framework JS moderne, la gestion du focus doit être dans votre checklist de définition de fini (DoD).
Guides RGAA associés
Pour aller plus loin sur les sujets abordés dans cet article, consultez nos fiches techniques :
L'intitulé de chaque lien doit être explicite et permettre de comprendre la destination ou la fonction du lien, même hors contexte.
Chaque image porteuse d'information doit avoir une alternative textuelle pertinente via l'attribut alt. Les images décoratives doivent avoir un attribut alt vide.
Le contraste entre la couleur du texte et la couleur de son arrière-plan doit être suffisamment élevé (4.5:1 pour le texte normal, 3:1 pour le grand texte).
Articles similaires
Votre site est-il conforme ?
Ne prenez pas de risques avec l'accessibilité. Lancez un audit complet de votre site en quelques minutes et obtenez un rapport détaillé des corrections à apporter.