Essayer de coder ← Retour aux sujets

Les réflexes de base

a11y

L'accessibilité, c'est faire en sorte que tout le monde puisse utiliser la page : personnes aveugles, malvoyantes, sourdes, qui naviguent au clavier, ou simplement sous le soleil sur un petit écran.

<html lang="fr">
Langue déclarée : bonne prononciation par les lecteurs d'écran
<img alt="…">
Texte de remplacement pour chaque image
<label for="…">
Un libellé pour chaque champ de formulaire
<h1>, <h2>, <h3>…
Titres hiérarchisés : le plan sert de navigation
<a>Lire la fiche Python</a>
Un texte de lien compréhensible hors contexte
<a href="#contenu">Aller au contenu</a>
Lien d'évitement pour passer le menu au clavier
accessible.html
<html lang="fr">
<body>
  <a class="evitement" href="#contenu">Aller au contenu</a>
  <header>
    <nav aria-label="Menu principal">
      <a href="index.html">Accueil</a>
      <a href="cours.html">Cours</a>
    </nav>
  </header>
  <main id="contenu">
    <h1>Inscription</h1>
    <form>
      <label for="mail">Adresse e-mail</label>
      <input id="mail" name="mail" type="email" autocomplete="email" required>
      <button type="submit">Créer mon compte</button>
    </form>
    <img src="mascotte.png" alt="Mascotte du site : un robot souriant">
  </main>
</body>
</html>

Clavier et lecteur d'écran

clavier

Beaucoup d'utilisateurs n'utilisent pas de souris. Tout ce qui est cliquable doit aussi se faire au clavier, avec un focus visible.

Tab / Maj + Tab
Passer au contrôle suivant / précédent
Entrée / Espace
Activer un lien (Entrée) / un bouton (Entrée, Espace)
:focus-visible { outline: … }
Style du focus : ne jamais le supprimer sans le remplacer
<button> plutôt que <div onclick>
Le bon élément est focusable et activable au clavier
aria-label="Fermer"
Donne un nom à un bouton qui n'a que des icônes
aria-hidden="true"
Cache un élément décoratif aux lecteurs d'écran
bouton-icone.html
<button type="button" aria-label="Fermer la fenêtre">
  <svg aria-hidden="true" width="16" height="16" viewBox="0 0 16 16">
    <path d="M2 2 L14 14 M14 2 L2 14" stroke="currentColor" stroke-width="2"/>
  </svg>
</button>
Rendu
Un petit bouton qui ne montre qu'une croix. Un lecteur d'écran annonce « Fermer la fenêtre, bouton ».

♿ Le cours : une page pour tout le monde

Une page accessible est une page plus simple pour tout le monde : sous-titres utiles dans un train, contrastes bienvenus en plein soleil, navigation au clavier appréciée de qui se fatigue du trackpad. C'est aussi une obligation légale pour de nombreux services publics et grandes entreprises (en France, le référentiel RGAA). Les bonnes pratiques de cette fiche sont, pour la plupart, des conséquences d'un HTML bien écrit.

Pour qui ? Et que faut-il prévoir ?

SituationBesoinCe que tu fais
vision (cécité, basse vision)lecteur d'écran, zoom, contrastesalt, titres, label, contrastes suffisants, mise en page qui supporte un zoom de 200 %
auditionalternative au sonsous-titres et transcriptions des vidéos
motricitéclavier seul, grandes zones cliquablestout atteignable avec Tab, boutons assez grands
compréhension, fatiguetextes clairs, pas de surchargephrases courtes, titres, pas d'animation envahissante
situation (soleil, réseau lent)lisibilité, légèretébons contrastes, images compressées

Des images avec le bon alt

Le texte alternatif dépend du rôle de l'image : on ne décrit pas toujours son apparence, on dit ce qu'elle apporte.

Imagealt à écrire
informative (graphique, photo qui illustre)ce qu'elle montre ou démontre : alt="Courbe du sinus entre −1 et 1"
décorative (filet, ornement)vide : alt="", le lecteur d'écran l'ignore
dans un lien ou un boutonla destination ou l'action : alt="Fiche Python"
texte dans l'image (logo)le texte lu : alt="Algorism"
alt.html
<img src="sinus.png" alt="Courbe du sinus : elle oscille entre -1 et 1">
<img src="separateur.png" alt="">
<a href="python.html"><img src="python.png" alt="Fiche Python"></a>

Naviguer au clavier

  • L'ordre de tabulation suit l'ordre des éléments dans le code : écris le HTML dans l'ordre logique de lecture.
  • Les liens, boutons et champs sont focusables automatiquement ; une <div onclick> ne l'est pas. Utilise l'élément natif adapté (<button>, <a href>).
  • Garde un focus visible : un contour net autour de l'élément actif. Le supprimer rend la navigation impossible à suivre.
  • Un lien d'évitement en tête de page (« Aller au contenu ») permet de sauter le menu : il peut rester caché tant qu'il n'a pas le focus.
style.css
.evitement {
  position: absolute;
  left: -999px;
}

.evitement:focus {
  left: 1rem;
  top: 1rem;
  padding: 0.5rem 1rem;
  background: #ffffff;
}

:focus-visible {
  outline: 3px solid #2563eb;
  outline-offset: 2px;
}

Contrastes et couleurs

Le texte doit se détacher du fond : le rapport de contraste minimal (norme WCAG) est de 4,5:1 pour un texte courant et 3:1 pour un grand texte. Un gris clair sur fond blanc échoue souvent. Ne transmets jamais une information par la couleur seule (« les champs en rouge sont erronés ») : ajoute un texte ou une icône. Des outils en ligne calculent le contraste de deux couleurs.

ARIA : en dernier recours

Les attributs aria-* complètent le HTML quand aucun élément natif ne convient. Première règle d'ARIA : si une balise native fait le travail, utilise-la (<button> plutôt que <div role="button">). Les plus utiles :

AttributUsage
aria-label="…"donne un nom à un élément sans texte visible (bouton-icône, <nav> supplémentaire)
aria-labelledby="id"prend comme nom le texte d'un autre élément
aria-hidden="true"retire un élément décoratif de ce que lit le lecteur d'écran
aria-live="polite" / role="status"annonce un message qui apparaît sans rechargement (résultat, erreur)
aria-expanded="true|false"indique si un volet ou un menu est déplié
annonce.html
<p id="statut" role="status" aria-live="polite"></p>

Tester son travail

  1. Au clavier : débranche la souris et parcours la page avec Tab ; vois-tu toujours où tu es ? Peux-tu tout activer ?
  2. Au zoom : passe à 200 % : rien ne doit se chevaucher ni être coupé.
  3. Aux lecteurs d'écran : essaie NVDA (gratuit, Windows) ou VoiceOver (macOS, iPhone) sur une page.
  4. Aux outils : la panneau Lighthouse du navigateur, les extensions WAVE ou axe, et le validateur HTML du W3C repèrent beaucoup de fautes.

Et le référencement ?

Les mêmes bonnes pratiques aident les moteurs de recherche : un <title> unique et précis par page, une <meta name="description"> d'une phrase, des titres hiérarchisés, des liens explicites, des adresses lisibles, des pages légères et adaptées au téléphone (<meta name="viewport">).

⚠️ Erreurs fréquentes

Supprimer le contour du focus

À éviter
faux.css
button:focus { outline: none; }   /* on ne voit plus où l'on est */
Correct
correct.css
button:focus-visible {
  outline: 3px solid #2563eb;
  outline-offset: 2px;
}

Une div qui joue le rôle d'un bouton

À éviter
faux.html
<div class="bouton" onclick="valider()">Valider</div>   <!-- pas focusable, pas annoncé comme bouton -->
Correct
correct.html
<button type="button" onclick="valider()">Valider</button>

Un alt inutile ou redondant

alt="image", alt="photo123.jpg" ou alt="image de la mascotte" n'apprennent rien (le lecteur d'écran annonce déjà « image »). Décris ce que l'image apporte, en quelques mots.

Du texte dans une image

Un texte incrusté dans une image n'est ni agrandi proprement, ni lu, ni traduit. Écris-le en HTML et mets-le en forme avec CSS.

Bloquer le zoom

<meta name="viewport" content="…, user-scalable=no"> empêche les personnes malvoyantes d'agrandir la page. Ne l'écris jamais.

Information transmise par la couleur seule

Un champ « en rouge » ne dit rien à un daltonien ni à un lecteur d'écran. Ajoute un message écrit (« Adresse e-mail invalide ») lié au champ.

Des animations qui ne s'arrêtent pas

Les mouvements incessants gênent la lecture et peuvent rendre malade. Respecte prefers-reduced-motion en CSS (voir Animations) et laisse l'utilisateur arrêter ce qui bouge.

📋 Aide-mémoire

  • lang sur <html> ; un <title> unique par page ; titres h1 → h2 → h3 dans l'ordre ; repères <header>, <nav>, <main>, <footer>.
  • alt toujours (vide si décoratif, la destination si dans un lien) ; jamais de texte dans une image.
  • Chaque champ : <label for> ; chaque bouton : <button> ; chaque lien : un texte compréhensible seul.
  • Tout se fait au clavier (Tab, Entrée) avec un focus visible ; lien d'évitement en tête de page.
  • Contraste d'au moins 4,5:1 pour le texte courant ; jamais la couleur seule pour informer ; zoom autorisé.
  • ARIA en dernier recours (aria-label, aria-hidden, role="status") ; test au clavier, au zoom 200 % et avec un lecteur d'écran.