Leçon 1/7 9 min

Pour qui, pourquoi

L'accessibilité ne sert pas « les autres » : handicaps permanents, temporaires et situationnels, et l'arbre d'accessibilité que voit un lecteur d'écran.

Marie n'a pas trouvé ton bouton

Marie est malvoyante. Elle navigue sur le web avec un lecteur d'écran : un logiciel qui lit la page à voix haute et la laisse circuler au clavier. Aujourd'hui, elle veut commander chez toi.

Elle arrive sur ta boutique. La fiche produit est belle, la photo charge, le prix s'affiche. Elle cherche le bouton « Ajouter au panier ». Son lecteur d'écran parcourt la page, annonce les titres, les liens, les vrais boutons. Mais ton « Ajouter au panier », tu l'as codé comme ça :

<div class="btn" onclick="addToCart()">Ajouter au panier</div>

Pour le lecteur d'écran, ce div n'est pas un bouton. C'est un bout de texte inerte. Il ne l'annonce pas comme cliquable, le clavier ne s'arrête pas dessus. Marie ne sait même pas qu'il existe. Elle part, et elle commande ailleurs.

Pas de drame, pas de violons. C'est juste un bug, comme un autre. Un bug qui exclut une cliente, silencieusement, sans message d'erreur dans ta console. Tout ce cours sert à débusquer ces bugs-là.

« L'accessibilité, c'est pour les aveugles »

C'est l'idée reçue numéro un, et elle est fausse. L'accessibilité ne concerne pas une petite minorité « à part ». Elle te concerne, toi aussi, plus souvent que tu ne crois.

Le handicap, ce n'est pas seulement une situation permanente. Il y en a trois formes :

  • Permanent : une personne aveugle, sourde, sans usage d'un bras, avec un trouble cognitif. La situation dure.
  • Temporaire : un bras dans le plâtre pendant six semaines, une opération des yeux qui te force à grossir tout, une otite qui coupe le son.
  • Situationnel : le soleil en plein sur ton écran de téléphone, un bébé endormi dans un bras donc une seule main libre, un open-space bruyant où tu regardes une vidéo en sous-titres.

Tout le monde, un jour. Le clavier seul, le contraste suffisant, les sous-titres, un bouton qui s'annonce comme un bouton : ce ne sont pas des faveurs pour « les autres ». Ce sont des filets qui rattrapent tes utilisateurs, y compris toi, le jour où le contexte coince. Coder accessible, c'est coder pour des humains réels, pas pour un navigateur parfait dans une pièce idéale.

Le web est massivement cassé

Chaque année, le projet WebAIM Million teste automatiquement la page d'accueil du million de sites les plus visités. Le résultat de l'édition 2025 est brutal : 94,8 % de ces pages présentent des échecs WCAG détectables (source : WebAIM Million 2025, webaim.org/projects/million). Des erreurs qu'un outil automatique repère tout seul, sans même le test humain qui en trouverait davantage.

Traduction : l'écrasante majorité du web est cassée sur l'accessibilité. C'est une mauvaise nouvelle pour les utilisateurs, mais une bonne nouvelle pour toi. Savoir faire mieux que 95 % des sites n'est pas un exploit réservé aux experts. Quelques réflexes solides suffisent à te distinguer nettement.

Le mécanisme : l'arbre d'accessibilité

Pour comprendre pourquoi le div de Marie disparaît, il faut voir ce que voit réellement un lecteur d'écran. Et la surprise, c'est qu'il ne lit pas ta page comme toi.

Quand le navigateur charge ton HTML, il construit le DOM : l'arbre des éléments qu'il va afficher. Mais il construit aussi un second arbre, dérivé du premier : l'arbre d'accessibilité. Pour chaque élément, cet arbre note trois choses : son nom (le texte annoncé), son rôle (bouton ? lien ? titre ?) et son état (focusable, coché, désactivé...).

C'est ce second arbre, et lui seul, que le navigateur expose aux technologies d'assistance, via une API du système d'exploitation. Le lecteur d'écran de Marie ne lit pas ton CSS ni tes jolies classes. Il lit cet arbre.

Maintenant, compare deux éléments qui s'affichent pareil à l'écran :

  • Un <button> natif arrive dans l'arbre avec le rôle « bouton », un nom (son texte), et l'état focusable. Le lecteur l'annonce, le clavier s'arrête dessus. Gratuit.
  • Un <div onclick> arrive dans l'arbre comme... du texte. Pas de rôle bouton, pas d'état focusable. Le lecteur le lit comme une phrase ordinaire, le clavier passe à côté.

Voilà le mécanisme exact derrière le départ de Marie. Le div existe à l'écran, mais il se perd en route vers l'arbre d'accessibilité.

Trois colonnes de gauche à droite : le DOM (button et div onclick), l'arbre d'accessibilité (le button devient « rôle bouton, focusable », le div n'arrive que comme texte inerte), puis le lecteur d'écran qui annonce le bouton mais ignore le div. DOM Arbre d'accessibilité Lecteur d'écran <button> Ajouter au panier rôle : bouton nom : Ajouter au panier état : focusable « Bouton, Ajouter au panier » <div onclick> Ajouter au panier texte inerte ni rôle, ni focus rien d'annoncé Marie passe à côté Même rendu à l'écran. Pas le même arbre. Pas le même accès.
Le button traverse jusqu'au lecteur d'écran. Le div onclick se perd en chemin.
Prédis avant de lire

Une vidéo de ton site a des sous-titres. À ton avis, qui en profite ? Liste tous les profils qui te viennent.

Voir la réponse

Bien plus de monde que prévu. Les personnes sourdes et malentendantes, bien sûr. Mais aussi : le voyageur dans un métro bruyant, la personne dans un open-space sans écouteurs, celui qui regarde en silence pour ne pas réveiller le bébé, et la personne non native qui lit mieux qu'elle n'entend la langue. Un seul effort, des bénéficiaires partout. C'est la règle de fond de l'accessibilité : ce qui aide une minorité finit par aider tout le monde.

Les 4 principes de WCAG, en français simple

WCAG, le standard international d'accessibilité, tient sur quatre principes. On les retient avec l'acronyme POUR. Garde-les en tête comme une boussole, le détail viendra dans les leçons suivantes.

  • Perceptible : l'utilisateur doit pouvoir percevoir le contenu, par un canal ou un autre (texte alternatif sur les images, sous-titres sur les vidéos).
  • Utilisable : l'utilisateur doit pouvoir s'en servir, y compris sans souris (tout doit marcher au clavier).
  • Compréhensible : le contenu et le fonctionnement doivent être clairs et prévisibles (un libellé qui dit ce que fait le bouton).
  • Robuste : le code doit rester lisible par les technologies d'assistance, aujourd'hui et demain (du HTML propre que le lecteur d'écran sait interpréter).

La carte du cours

Voici le chemin qu'on va suivre, dans cet ordre précis :

  • Leçon 2, la sémantique : utiliser le bon HTML pour que l'arbre d'accessibilité soit bon tout seul.
  • Leçon 3, le clavier et le focus visible : tout faire fonctionner sans souris.
  • Leçon 4, le texte alternatif : décrire les images pour ceux qui ne les voient pas.
  • Leçon 5, les formulaires accessibles : des champs qui s'annoncent et des erreurs lisibles.
  • Leçon 6, le contraste et la couleur : un texte lisible, une info jamais portée par la couleur seule.
  • Leçon 7, ARIA et tester pour de vrai : les attributs ARIA et les outils de test.

Tu remarques qu'ARIA arrive en dernier, et c'est voulu. Tu comprendras pourquoi en chemin : bien utilisé, ARIA est un outil de finition, pas la fondation. La fondation, c'est le bon HTML. On commence par là.

Marie couldn't find your button

Marie has low vision. She browses the web with a screen reader: software that reads the page aloud and lets her move through it with the keyboard. Today, she wants to order from you.

She lands on your shop. The product page is nice, the photo loads, the price shows. She looks for the "Add to cart" button. Her screen reader scans the page, announces the headings, the links, the real buttons. But your "Add to cart"? You coded it like this:

<div class="btn" onclick="addToCart()">Add to cart</div>

To the screen reader, this div is not a button. It's an inert piece of text. It isn't announced as clickable, the keyboard never stops on it. Marie doesn't even know it exists. She leaves, and she orders elsewhere.

No drama, no violins. It's just a bug, like any other. A bug that excludes a customer, silently, with no error in your console. This whole course is about hunting down bugs like this one.

"Accessibility is for blind people"

That's misconception number one, and it's wrong. Accessibility isn't about a small, separate minority. It's about you too, more often than you think.

Disability isn't only a permanent condition. It comes in three forms:

  • Permanent: a person who is blind, deaf, has no use of an arm, or has a cognitive impairment. The situation lasts.
  • Temporary: an arm in a cast for six weeks, eye surgery that forces you to zoom everything, an ear infection that kills the sound.
  • Situational: bright sun on your phone screen, a sleeping baby in one arm so only one hand free, a noisy open-plan office where you watch a video on captions.

Everyone, some day. Keyboard-only use, enough contrast, captions, a button that announces itself as a button: these aren't favours for "other people". They're safety nets that catch your users, you included, the day the context gets in the way. Coding accessibly means coding for real humans, not for a perfect browser in an ideal room.

The web is massively broken

Every year, the WebAIM Million project automatically tests the home page of the million most-visited sites. The 2025 result is brutal: 94.8% of those pages have detectable WCAG failures (source: WebAIM Million 2025, webaim.org/projects/million). Errors an automated tool spots on its own, before the human testing that would find even more.

Translation: the overwhelming majority of the web is broken on accessibility. That's bad news for users, but good news for you. Doing better than 95% of sites is not a feat reserved for experts. A few solid habits are enough to set you clearly apart.

The mechanism: the accessibility tree

To understand why Marie's div vanishes, you need to see what a screen reader actually sees. And the surprise is: it doesn't read your page the way you do.

When the browser loads your HTML, it builds the DOM: the tree of elements it will display. But it also builds a second tree, derived from the first: the accessibility tree. For each element, this tree notes three things: its name (the announced text), its role (button? link? heading?) and its state (focusable, checked, disabled...).

It's this second tree, and only this one, that the browser exposes to assistive technologies, through an operating-system API. Marie's screen reader doesn't read your CSS or your pretty classes. It reads this tree.

Now compare two elements that look identical on screen:

  • A native <button> arrives in the tree with the role "button", a name (its text), and the focusable state. The reader announces it, the keyboard stops on it. For free.
  • A <div onclick> arrives in the tree as... text. No button role, no focusable state. The reader reads it like an ordinary sentence, the keyboard walks right past it.

There's the exact mechanism behind Marie leaving. The div exists on screen, but it gets lost on its way to the accessibility tree.

Three columns left to right: the DOM (button and div onclick), the accessibility tree (the button becomes "role button, focusable", the div arrives only as inert text), then the screen reader announcing the button but ignoring the div. DOM Accessibility tree Screen reader <button> Add to cart role: button name: Add to cart state: focusable "Button, Add to cart" <div onclick> Add to cart inert text no role, no focus nothing announced Marie walks past it Same render on screen. Not the same tree. Not the same access.
The button travels all the way to the screen reader. The div onclick gets lost on the way.
Predict before reading on

A video on your site has captions. Who do you think benefits? List every profile that comes to mind.

Show the answer

Far more people than expected. Deaf and hard-of-hearing people, of course. But also: the traveller in a noisy metro, the person in an open-plan office with no headphones, the one watching in silence so as not to wake the baby, and the non-native speaker who reads the language better than they hear it. One effort, beneficiaries everywhere. That's the core rule of accessibility: what helps a minority ends up helping everyone.

The 4 WCAG principles, in plain English

WCAG, the international accessibility standard, rests on four principles. We remember them with the acronym POUR. Keep them in mind as a compass; the detail comes in the following lessons.

  • Perceivable: the user must be able to perceive the content, through one channel or another (alt text on images, captions on videos).
  • Operable: the user must be able to operate it, including without a mouse (everything must work on the keyboard).
  • Understandable: the content and the behaviour must be clear and predictable (a label that says what the button does).
  • Robust: the code must stay readable by assistive technologies, today and tomorrow (clean HTML the screen reader can interpret).

The course map

Here's the path we'll follow, in this precise order:

  • Lesson 2, semantics: use the right HTML so the accessibility tree is correct on its own.
  • Lesson 3, keyboard and visible focus: make everything work without a mouse.
  • Lesson 4, alt text: describe images for those who can't see them.
  • Lesson 5, accessible forms: fields that announce themselves and readable errors.
  • Lesson 6, contrast and color: readable text, and info never carried by color alone.
  • Lesson 7, ARIA and real testing: ARIA attributes and the testing tools.

You'll notice ARIA comes last, and that's on purpose. You'll understand why along the way: used well, ARIA is a finishing tool, not the foundation. The foundation is good HTML. That's where we start.

🎯 Pratique

S'entraîner (clique pour ouvrir) :

💬 Ré-explique sans regarder
Ré-explique sans regarder

Explique à un collègue pourquoi un <div onclick> et un <button> qui se ressemblent à l'écran ne sont pas pareils pour un lecteur d'écran.

Une bonne explication dit : le navigateur construit un arbre d'accessibilité à côté du DOM, avec pour chaque élément un nom, un rôle et un état. Le <button> y arrive avec le rôle « bouton » et l'état focusable, donc le lecteur l'annonce et le clavier s'arrête dessus. Le <div onclick> y arrive comme du texte inerte : ni rôle, ni focus. Même rendu à l'écran, mais pas le même arbre, donc pas le même accès.
🧠 Rappel libre
Rappel libre

Sans remonter : cite les trois formes de handicap, avec un exemple de chaque.

Permanent : une personne aveugle ou sourde, la situation dure. Temporaire : un bras dans le plâtre, une opération des yeux. Situationnel : le soleil sur l'écran, un bébé dans un bras, un environnement bruyant qui pousse aux sous-titres. La leçon : coder accessible profite à tout le monde, un jour ou l'autre.
⚖️ Juge le code de l'IA
Accepter ou rejeter le code de l'IA

Tu démarres un projet et tu demandes à l'IA de penser à l'accessibilité. Elle répond : « Bonne idée, mais on verra l'accessibilité à la fin, quand l'app marchera. Si on a le temps, on rajoutera ce qu'il faut. » Tu acceptes, ou tu rejettes ?

À rejeter. « À la fin si on a le temps » veut dire « jamais ». Surtout, l'accessibilité tient surtout au choix des bonnes briques HTML : un vrai bouton, un vrai champ de formulaire, des titres hiérarchisés. Si on bâtit toute l'app sur des div cliquables, la remettre d'aplomb à la fin coûte dix fois plus cher que d'avoir mis le bon HTML dès le départ. L'accessibilité se décide au moment où on pose la structure, pas après.
Pourquoi le lecteur d'écran de Marie ne « voit »-il pas un <div onclick> comme un bouton ?
Tu utilises un site avec une seule main parce que tu portes ton bébé endormi. De quel type de situation s'agit-il ?
Dans l'acronyme POUR de WCAG, que veut dire « Utilisable » ?
Synthèse. Deux éléments s'affichent exactement pareil à l'écran : un <button> et un <div onclick> stylé en bouton. Qu'est-ce qui décide vraiment si un lecteur d'écran les rend accessibles ?
Prochaine étape

Marie est partie à cause d'un div déguisé en bouton. La bonne nouvelle : 80 % du travail d'accessibilité est gratuit. Il suffit d'utiliser le HTML pour ce qu'il sait faire. Leçon 2 : la sémantique, et le labo trouve-les-5-problèmes où tu débusques toi-même les pièges d'une page.

Leçon 2 : HTML sémantique : 80 % du travail →

Une erreur dans cette leçon, un passage flou, une question ? Écrivez-moi : chaque retour améliore ce cours.

Besoin d'un développeur pour votre projet ?

Réponse sous 24h · Sans engagement