Public cible
Débutants, étudiants et professionnels qui souhaitent acquérir une pratique structurée dans ce domaine.
Concevoir et corriger des interfaces accessibles selon la WCAG 2.2 et le RGAA : textes alternatifs, structure et sémantique, contraste, navigation clavier, focus, ARIA, formulaires, audit reproductible et déclaration d'accessibilité. L'objectif n'est pas de rendre le site « pour les handicapés » mais de corriger les défauts de conception qui pénalisent tout le monde.
Débutants, étudiants et professionnels qui souhaitent acquérir une pratique structurée dans ce domaine.
Comprendre les notions essentielles et les appliquer dans un projet vérifiable.
Aucune connaissance préalable n’est strictement obligatoire ; les prérequis détaillés sont précisés dans les ateliers.
Tous niveaux
La validation repose sur les évaluations actives et les livrables pratiques du cours.
Un ordinateur, un navigateur et les outils indiqués dans le premier atelier sont suffisants pour commencer.
Auditer une page réelle, corriger les écarts bloquants et rédiger la déclaration.
Obligatoire ConsulterTraiter les écarts de niveau A et B d'un parcours complet, avec rapport de conformité et déclaration.
Livrables :
Auditer une page réelle, corriger les écarts bloquants et rédiger la déclaration.
Obligatoire ConsulterTraiter les écarts de niveau A et B d'un parcours complet, avec rapport de conformité et déclaration.
Livrables :
Auditer une page réelle, corriger les écarts bloquants et rédiger la déclaration.
Obligatoire ConsulterTraiter les écarts de niveau A et B d'un parcours complet, avec rapport de conformité et déclaration.
Livrables :
Auditer une page réelle, corriger les écarts bloquants et rédiger la déclaration.
Obligatoire ConsulterTraiter les écarts de niveau A et B d'un parcours complet, avec rapport de conformité et déclaration.
Livrables :
On entend généralement par accessibilité « la possibilité pour les personnes en situation de handicap d'utiliser un service ». La définition est exacte et elle est boite, parce qu'elle présente l'accessibilité comme une concession : on rendrait service à une catégorie de personnes, et le produit resterait ce qu'il est.
On corrige ce qui gêne visiblement : on ajoute des textes alternatifs sur les images, on agrandit les zones de clic, on met une couleur plus contrastée sur les boutons. On laisse le reste, parce que le reste ne se voit pas quand on n'est pas concerné : les incohérences de navigation, les champs de formulaire sans étiquette, les messages d'erreur qui disparaissent avant d'avoir pu être lus.
L'accessibilité est une qualité du produit, au même titre que la vitesse ou la sécurité. Elle ne s'adresse pas « aux handicapés » mais à qui que ce soit, dans une situation donnée : un écran de formulaire lu sous la pluie, dans un train, avec 2 % de batterie, par quelqu'un qui a mal au poignet, sur un téléphone qu'il n'a pas choisi, avec un lecteur d'écran activé par erreur et jamais éteint depuis.
Le mobile corrige les deux tiers des problèmes d'accessibilité d'un site. Non pas parce qu'il est « pour les handicapés », mais parce qu'un écran tactile de 6 pouces et une connexion dégradée sont la condition normale de millions de personnes qui se disent perfectly capable de regarder une page web.
Un budget « conformité RGAA » produit une checklist cochée et un site médiocre. Un budget « qualité produit » produit des tests sur des tâches réelles, et découvre des bugs que personne n'avait vus : un label qui n'est pas relié à son champ, une modale qui piège le focus, un message d'erreur qui ne dit pas quoi corriger.
Pas « la page est-elle accessible ? » mais : quelles tâches doit pouvoir accomplir un utilisateur dans cette situation, et qu'est-ce qui l'en empêche aujourd'hui ? La première question appelle un audit. La seconde appelle un travail, et elle trouve ce que l'audit ne voit pas.
La WCAG 2.2 organise ses exigences autour de quatre principes — Perceivable, Operable, Understandable, Robust — déclinés en principes-directeurs, puis en critères de succès, puis en techniques qui ne sont que des exemples de mise en œuvre.
Les critères sont classés de A à AAA par niveau d'exigence. La quasi-totalité des obligations légales et des cahiers des charges demande le niveau AA.
Deux réflexes à éviter : viser AAA pour se distinguer, et descendre à A pour livrer plus vite. AAA contient des critères très exigeants (durée de vie des messages d'erreur, pas de texte clignotant, niveau de contraste renforcé) qui ne rapportent presque rien au produit. À l'inverse, ignorer les critères A d'Operable — le clavier, la navigation — revient à livrer un site inutilisable pour une partie consistente des utilisateurs, et c'est bien plus grave qu'un manque de contraste sur un lien secondaire.
L'accessibilité n'est pas une bonne pratique volunteer en France : pour un certain nombre d'acteurs, c'est une obligation légale assortie de sanctions.
La loi n° 2005-102 du 11 février 2005 pour l'égalité des droits et des chances de participation à la vie sociale impose aux services publics, aux établissements publics et aux entreprises privées obéissant à des obligations de service public une obligation d'accessibilité de leurs services de communication au public en ligne. Le principe retenu est celui de la conformité progressive : un schéma d'amélioration est attendu, avec un calendrier.
Point le plus souvent manqué : ce n'est pas seulement rendre le site accessible, c'est publier une déclaration d'accessibilité. Elle doit indiquer l'état de conformité constaté, le contenu et les méthodes de l'évaluation, les écarts identifiés et leur justification, et la voie de recours en cas de difficulté. Elle doit être révisée périodiquement et à chaque évolution majeure du site.
Le RGAA (Référentiel général d'amélioration de l'accessibilité, Dinum) est la déclinaison française du WCAG : il en reprend les principes en 106 critères, chacun accompagné des tests correspondants. Il permet une évaluation reproductible là où la WCAG laisse le choix des techniques.
À la date de ce cours, la version en vigueur est le RGAA 4.1.2. La version 5 est en cours de rédaction pour une publication attendue fin 2026. Travailler avec le 4.1.2 n'est donc pas un travail provisoire : le RGAA 5 précisera ou complétera les critères du 4.1.2 sans les infirmer, et les audits réalisés avant cette publication resteront valables dix-huit mois.
Si l'acteur est concerné par l'obligation légale, il n'y a pas d'arbitrage possible entre conformité et calendrier : il y a un risque contentieux. Si le projet est un produit commercial qui vise la France, largument « accessibilité = coût » ne tient pas, parce que la sanction existe et que les grands donneurs d'ordre l'exigent dans leurs propres cahiers des charges.
Les outils d'audit automatique ont une place, et il faut savoir précisément laquelle : ils détectent environ un quart des problèmes environ. Les trois quarts restants relèvent du jugement humain.
Un audit automatique qui renvoie zéro erreur ne prouve pas que la page est conforme : il prouve qu'aucun des défauts qu'il sait détecter n'a été trouvé. Entre les deux, il y a la majorité des problèmes qui font mal à un vrai utilisateur. Un audit automatique sans vérification manuelle n'est pas un audit, c'est un filtre.
Elle n'est pas dans « corriger les avertissements », qu'un outil fait déjà. Elle est dans deux gestes uniquement humains : naviguer au clavier, ce qui révèle les pièges de focus et les désordres de tabulation, et tester des tâches réelles sur un écran de téléphone vrai en 3G, ce qui révèle les problèmes de contraste, de taille de cible et de temps de réponse que le zoom desktop masque.
Le critère 1.1.1 (niveau A) exige que chaque image porteuse d'information ait une alternative textuelle. La difficulté n'est pas l'attribut : c'est de décider quoi écrire.
alt="" et rien d'autre. Une bordure, une flèche décorative, un fond de section : c'est décoratif.Au-delà des photographies, il y a : les graphiques (le cas le plus coûteux, et le plus souvent absent), les diagrammes, les schémas d'interface dans une procédure, les logos porteurs de sens quand ils lorsqu'ils portent un lien, les formules en image, les captures d'écran de code. Une capture de code sans alternative est un contenu inaccessible : le texte qu'elle porte n'existe que comme image.
Une icône décorative répétée devant chaque titre de menu
produit un menu lu comme « icône image Accueil, icône image
Formations ». Le alt="" n'est pas un oubli : c'est
ce qui rend le menu lisible. Et l'icône ne doit pas être
retirée du HTML, seulement de l'annonce vocale.
Le piège classique : un graphique sans alternative textuelle est un critère 1.1.1 non respecté et une perte d'information pour tout le monde, y compris les personnes voyantes qui utilisent un agrandissement. Ce n'est pas un problème d'accessibilité, c'est un problème de conception.
Le critère 1.3.1 (niveau A) — « information et relations » — est celui qui catches plus de sites que tous les autres réunis. Il demande que les relations visuelles entre contenu soient présentes dans le code.
Un titre de niveau h3 sans h2
au-dessus n'est pas un détail aesthetic : il casse la
navigation par titres, qui est la fonction
d'assistance la plus utilisée sur un document long. Les
lecteurs d'écran permettent de sauter d'un titre à l'autre,
de remodeler la page en liste de titres, et de revenir à
sa position après une recherche. Tout cela repose sur la
hiérarchie des niveaux.
La règle : un seul h1 par page, qui nomme le
sujet, puis h2 pour les sections, h3
pour les sous-sections. Un saut de niveau est presque toujours
un oubli de structure, et il se voit immédiatement.
Une suite de paragraphes séparés par des puces dessinées en CSS est annoncée comme une suite de paragraphes. Le lecteur d'écran ne dit pas « liste de 5 éléments », il lit cinq blocs sans signal. Pour un utilisateur qui navigue de titre en titre ou qui écoute en diagonale, la liste disparaît.
Un tableau de données est un tableau sémantique, avec
caption, en-têtes de colonnes déclarés, et la
relation entre les cellules. Un tableau dessiné pour la mise
en page — le fameux « tableau pour diviser en deux colonnes »
— est une catastrophe pour la lecture linéaire : l'ordre de
lecture suit l'ordre du code, pas l'ordre visuel.
Et il faut savoir qu'une mise en page réactive (mobile) qui transforme un tableau en cartes empilées destroys la relation entre les cellules si le balisage n'a pas été conçu pour. Les options sont connues : garder la structure de tableau et faire défiler horizontalement, ou associer explicitement chaque cellule à son en-tête.
Un champ de formulaire doit avoir une étiquette
programmatiquement liée, par for /
id. Un texte posé visuellement au-dessus du
champ, sans lien dans le code, est invisible pour la
technologie d'assistance : elle annonce « champ de saisie »,
sans dire lequel. Sur un formulaire de six champs, le
résultat est un formulaire inutilisable.
Navigation principale, contenu principal, pied de page :
ce sont des repères, et les déclarer (header,
nav, main, footer)
permet à l'utilisateur de sauter directement à ce qui
l'intéresse. C'est le critère 1.3.1 appliqué à la structure
de page, et c'est ce qui fait la différence sur un site de
commerce avec vingt liens de navigation avant le contenu.
Les seuils sont vérifiés avec les WCAG 2.x :
Un point de méthode qui évite des heures perdues : un texte placé sur une image ou un dégradé n'a pas de ratio calculable, seulement un contraste local. Il faut alors contrôler la zone réellement occupée par le texte, ou ajouter un fond, ou — plus simplement — ne pas poser de texte sur une image.
Introduit par la WCAG 2.1 : les bords de champs de formulaire, les indicateurs de focus, les icônes porteuses de sens, les graphiques doivent avoir un ratio d'au moins 3:1 avec ce qui les entoure. Cette règle attrape beaucoup de champs de formulaire, dont la bordure est souvent #ddd sur fond blanc : presque aucun ne passe.
Un champ d'erreur encirclé en rouge, un texte en rouge, une icône rouge : si le signal est uniquement la couleur, il disparaît pour une personne daltonienne. Le signal doit être doublé par un texte (« Erreur : ce champ est obligatoire »), une icône identifiable, ou un motif.
À 400 % de zoom — l'équivalent d'un écran de téléphone en paysage — le contenu doit rester lisible sans défilement horizontal en deux dimensions. Concrètement : pas de largeur fixe en pixels, pas de texte en taille absolue dans une zone trop petite, et des tableaux qui laissent la place au défilement plutôt que de comprimer les colonnes.
Le critère 1.4.12 va plus loin et impose que l'espacement du texte puisse être augmenté — hauteur de ligne, espacement entre lettres et entre mots, espacement des paragraphes — sans perte de contenu ni de fonctionnalité. Les unités relatives pour les tailles de police suffisent généralement à le satisfaire.
Le texte justifié à la ligne force des espaces irréguliers qui rendent la lecture difficile pour certaines personnes dyslexiques ou en cas de strabisme. Ce n'est pas un critère WCAG, c'est une bonne pratique de lisibilité. De même, une liste de liens — un bloc de liens dont aucun n'a de sens hors contexte — est un critère échoué en Understandable (2.4.4) : le lien doit dire où il mène.
Les informations purement sonores et purement visuelles demandent un équivalent (1.2.x). Trois cas à traiter systématiquement.
Une animation clignotante ou un défilement automatique peut provoquer une crise pour certaines personnes (critère 2.3.1, niveau A, sur trois clignotements par seconde). Le correctif est la possibilité de suspendre tout mouvement automatique de plus de cinq secondes — carrousels, défilement de texte, lecture vidéo en arrière-plan.
La vidéo est un cas particulier : elle doit avoir une transcription ou une piste de sous-titres. Le sous-titrage des dialogues ne suffit pas — les informations purement sonores (le ton d'une alarme, un bruit qui signale un danger) doivent aussi être décrites.
Un contenu audio sans transcription exclut de fait les personnes sourdes et malentendantes, et pénalise durablement tout le monde dans un environnement bruyant — un train, une cuisine, un open space. La transcription n'est pas une mesure d'accessibilité, c'est une mise à disposition de contenu. Sur un site de formation, elle a une valeur pédagogique immédiate.
Les animations de défilement et les effets de
parallaxe provoquent des sensations de nausée et de
désorientation. La WCAG ne les interdit pas, mais exige un
mécanisme pour les neutraliser. Le geste « réduire les
animations » présent dans les réglages système — et la
règle prefers-reduced-motion côté CSS — est la
mise en œuvre directe de cette exigence.
Le critère 2.1.1 (niveau A) impose que toute fonctionnalité soit utilisable au clavier. C'est le critère le plus discriminant du web : il échoue là où les sites ont été construits avec de la souris.
onclick sans tabindex, ni rôle, ni gestionnaire clavier.focus, il ne s'ouvre pas au clavier.href est vide ou valant #, qui exécute l'action en JavaScript : parfois focusable, parfois pas, jamais fiable.Ce n'est pas une question d'apparence. Un élément est un bouton s'il déclenche une action dans la page ; c'est un lien s'il va quelque part. Beaucoup d'interfaces confondent les deux, et la confusion coûte cher : un « bouton » qui est en réalité un lien styled ne déclenche pas l'action attendue avec la touche Entrée ou Espace, et ne fait rien de ce qu'on attend d'un bouton.
Le bon réflexe : utiliser <button>
pour une action et <a href> pour une
navigation, sans homotrophie d'apparence. Les deux sont
focusables, les deux sont focusables au clavier — mais
chacun réagit à la bonne touche et est annoncé avec le bon
rôle.
Un piège clavier est un composant dont le focus ne peut pas quitté au clavier. Le cas le plus grave est la modale : si le focus ne revient pas sur le déclencheur à la fermeture, l'utilisateur perd le fil de la page. Les autres pièges sont moins spectaculaires et plus fréquents : un widget de carousel où les flèches font défiler sans permettre de sortir, un menu dont la fermeture au clavier est impossible.
La règle : toute interaction doit pouvoir être annulée
avec la touche Échap, et le focus doit être ramené
explicitement. Sur une modale, la séquence attendue est
Échap ferme, le focus revient sur ce qui a
ouvert.
Un focus invisible est un piège silencieux : l'utilisateur
sait qu'il a(tabulé, il ne sait pas où il est. La cause la
plus fréquente n'est pas l'absence de style, c'est le
outline: none posé par défaut et jamais
remplacé.
Le correctif : soit conserver le contour par défaut du navigateur, soit le remplacer par quelque chose de visible et contraste suffisant — critère 1.4.11, ratio 3:1 sur les éléments non textuels. Un indicateur custom doit aussi signaler le focus focus-visible, sans supprimer l'indicateur au survol de la souris.
C'est le critère qui échoue le plus souvent, et il n'est
visible que lorsqu'on tabule. Si le tabindex
est à 0 ou absent, l'ordre suit le DOM. Il faut alors que
le DOM suive l'ordre visuel — ce qui est vrai sauf quand la
mise en page est en CSS Grid ou Flexbox avec réordonnation,
ou quand une colonne latérale est placée avant le contenu
dans le HTML pour des raisons de structure.
Le test tient en une phrase : tabuler de haut en bas doit-il donner l'ordre de lecture naturel ? Si à un moment on passe du pied de page au menu, ou d'un bouton « Suivant » au bouton « Précédent », l'ordre est faux.
Critère sous-estimé : un lien « Aller au contenu principal », le premier élément focusable de la page, visible quand il reçoit le focus. Il paraît anecdotique, il est pourtant l'un des critères les plus utiles sur un site avec une navigation de vingt liens : il évite de tabuler trente fois à chaque changement de page.
Introduit par la WCAG 2.2 : l'indicateur de focus ne doit pas être entièrement masqué par du contenu à défilement ou par une barre d'outils fixe. Le cas typique est un bouton d'acceptation de cookies fixe en bas de page qui recouvre le focus d'un lien situé juste au-dessus. Le critère impose que l'élément masquant puisse être déplacé — par exemple un bandeau qui se replie sur un bouton.
Si l'on ajoute des raccourcis — un Ctrl+S
pour sauvegarder, un / pour chercher — ils
doivent pouvoir être désactivés ou remappés, et ne pas
entrer en conflit avec ceux du navigateur ou de la
technologie d'assistance. Un raccourci qui survit au
changement de contexte capture le clavier et devient un
piège.
Le critère 4.1.2 (niveau A) demande que le nom, le rôle et la valeur de chaque composant soient déterminables par le code. C'est la définition du mot « robuste ».
« La première règle de l'utilisation d'ARIA est de ne
pas utiliser ARIA. » Un élément HTML natif porte déjà
son rôle, son nom et son comportement au clavier : un
<button> est un bouton pour tout le
monde, sans une ligne de plus. ARIA sert à
compléter le HTML là où il n'a pas d'équivalent, pas
à le réécrire.
aria-label ou aria-labelledby pour nommer un composant qui n'a pas de texte visible — un bouton icône, un champ de recherche.aria-expanded sur un accordéon ou un menu, pour dire s'il est ouvert.aria-current sur le lien de la page courante.aria-describedby pour relier un champ à son aide et à son message d'erreur.role="alert" pour qu'un message d'erreur inséré dynamiquement soit annoncé.div en role="button" sans gestion clavier ni état : annoncé comme un bouton, inopérant au clavier. Pire que de ne rien faire.<button role="button">. Inutile et source de conflits.alt sur un <div> ne fait rien, et donne l'illusion d'avoir travaillé.La seule vérification qui compte se fait dans l'inspecteur d'accessibilité de la barre de développement, sur l'onglet des rôles. Si un composant n'apparaît pas dans la liste, il n'existe pas pour l'utilisateur. Cette vérification prend trente secondes et remplace la moitié des vérifications manuelles : elle dit ce que le lecteur d'écran va annoncer, au lieu de le deviner.
Le piège à connaître : un composant peut être annoncé correctement et rester inutilisable — un bouton sans nom, un champ sans étiquette. L'ARIA donne des noms, il ne rend pas un composant fonctionnel.
Le formulaire est l'endroit où l'accessibilité se paie le plus cher en temps d abandons, et le plus souvent en causes perdues. Cinq exigences à ne pas négocier.
Un champ a besoin d'une étiquette persistante — présente avant, pendant et après la saisie. Un placeholder qui disparaît à la première frappe est un défaut classique : il ne laisse plus rien pour identifier le champ, et il est souvent trop pâle pour passer le contraste.
Le message doit dire quel champ est en erreur et quoi faire pour le corriger. « Erreur de validation » ne dit rien. « Le code postal doit contenir 5 chiffres » règle le problème. L'erreur doit être associée au champ, pas seulement affichée au-dessus du formulaire.
Une erreur validée seulement au clic sur « Envoyer »,
sans que le focus n'aille nulle part, oblige à relire tout
le formulaire pour trouver le champ fautif. L'ARIA
role="alert" sur le message d'erreur, et un
déplacement du focus vers le premier champ en erreur,
transforment une recherche en une confirmation.
Critère ajouté par la WCAG 2.2 : si le même champ déclenche plusieurs fois l' announces du même message d'erreur, l'utilisateur ne comprend plus. On annonce une fois, puis on laisse l'utilisateur corriger.
Critère également nouveau en 2.2 : les cibles interactives font au moins 24 × 24 pixels, ou elles disposent d'un espacement suffisant. Les liens de navigation inline échappent à la règle, mais les icônes de barre d'outils, les boutons-icônes et les petites croix de fermeture y sont soumis. C'est là que l'on gagne réellement : ces cibles sont minuscules au doigt comme à la souris.
Si le formulaire a une limite de temps, elle doit être annoncée, extensible, et l'avertissement doit être possible avant expiration (critères 2.2.x). De même, une étape qui exige de mémoriser une information servie ailleurs — un code dans un e-mail à recopier — est une barrière cognitive réelle. La corriger fait partie du travail.
Le RGAA fournit, pour chacun de ses 106 critères, une liste de tests à réaliser. La méthode est reproductible, ce qui est son avantage principal : deux evaluates personnes produisent le même résultat.
Un « 90 % de conformité » est un chiffre sans sens pris isolément, et c'est le piège le plus coûteux de la démarche. Un site à 92 % dont les 8 % d'échecs portent sur la navigation clavier et les erreurs de formulaire est inutilisable pour les personnes concernées. Un site à 75 % dont les échecs portent sur des contrastes secondaires est très utilisable.
Ce qui compte, c'est la répartition : quels critères échouent. Un seul critère de niveau A bloquant (navigation clavier, nom accessible) pèse plus que trente écarts de contraste sur des éléments secondaires.
Un audit réalisé sur le poste du développeur — grand écran, bonne connexion, souris, à 100 % de zoom — est presque toujours optimiste. Les deux situations qui font le plus de dégâts sont l'accès dégradé (3G, CPU lent) et l'usage en mobilité (une main, en marchant, au soleil). Un site peut passer 100 % des tests automatisés et s'effondrer dans ces deux cas.
La déclaration n'est pas un formulaire administratif : c'est un engagement daté, et sa valeur tient entièrement à sa sincérité.
Le RGAA 5 est attendu fin 2026. La Dinum est explicite sur deux points qui doivent guider la rédaction dès aujourd'hui : les critères du RGAA 5 préciseront ou compléteront ceux du 4.1.2 sans les infirmer, et les déclarations d'accessibilité établies avant cette publication resteront valables 18 mois, dans la limite de trois ans à compter de leur date de publication.
La lecture qui s'impose pour un projet en cours : il ne faut pas attendre le RGAA 5, mais il ne faut pas non plus s'y enfermer. Travailler avec le 4.1.2 dès maintenant est le bon calcul, à condition de viser le niveau AA — le niveau qui ne changera pas d'une version à l'autre, puisque le RGAA ne fixe pas de niveau AAA.
Un audit ponctuel produit une photo. La question est ce qui reste trois mois plus tard, après six livraisons.
Une régression d'accessibilité ne casse rien de visible.
Une mise à jour de dépendance remplace un composant par un
div : le site est identique à l'œil, et le
clavier ne fonctionne plus. Un design system pose
outline: none sur tous les champs pour «
clean » : le focus disparaît sur cent formulaires. Un
banner de consentement couvre la moitié de l'écran en bas :
le critère 2.4.11 est satisfait, puis violé par le bandeau
suivant. Aucun de ces changements ne déclenche une alerte,
parce qu'aucun ne casse une fonctionnalité pour la majorité
des utilisateurs.
outline: none sans remplacement visible, et fournit l'indicateur de focus par défaut. Une règle de lint CSS suffit à le tenir.« Est-ce qu'on fait ce travail maintenant, ou est-ce qu'on va le faire plus tard ? » La réponse qui trompe est « plus tard, ce sera moins cher ». Le vrai calcul est inverse : un écart d'accessibilité est d'autant plus cher qu'il est trouvé tard, parce qu'il a été répliqué, documenté, testé et repris dans des cas de test. Le coût d'un défaut trouvé au prototypage est d'une heure ; le même défaut trouvé à la deuxième année est un projet.
Mettre une page réelle en accessibilité, et produire la déclaration qui va avec. Un écran traité jusqu'au bout vaut mieux qu'un audit de dix écrans traités à moitié.
Publié le 01/10/2026