Aussi élégante qu'une interface puisse paraître, si son texte est illisible, le design ne remplit pas sa mission. Les règles de contraste des couleurs WCAG rendent précisément cette préoccupation mesurable : elles transforment l'écart de luminosité entre un texte et son fond en un ratio numérique, garantissant la lisibilité pour les personnes malvoyantes, celles touchées par une perte de vue liée à l'âge, ou quiconque plisse les yeux devant un écran en plein soleil. Dans cet article, j'explique ce qu'est réellement un ratio de contraste, quels seuils sont obligatoires et comment les appliquer concrètement dans votre travail quotidien de design.
Qu'est-ce qu'un ratio de contraste, exactement ?
Un ratio de contraste est la relation entre la luminance relative de deux couleurs. WCAG le définit par cette formule :
contraste = (L1 + 0.05) / (L2 + 0.05)
Ici, L1 est la luminance relative de la couleur la plus claire et L2 celle de la plus foncée. La luminance va de 0 (noir pur) à 1 (blanc pur). Le résultat se situe entre 1:1 (aucune différence) et 21:1 (noir sur blanc, le maximum possible). Le point essentiel : ce ratio repose sur la luminosité, pas sur la teinte ; un rouge et un vert de même luminance peuvent sembler éclatants tout en ayant un mauvais ratio de contraste.
Les seuils WCAG : 4.5:1 et 3:1
WCAG (Web Content Accessibility Guidelines) comporte deux niveaux de conformité, et la plupart des exigences légales et d'entreprise visent le niveau AA :
- Texte normal — AA : au moins
4.5:1(critère 1.4.3). - Grand texte — AA : au moins
3:1. « Grand » signifie au moins 18pt (≈24px), ou 14pt gras (≈18.66px). - Texte normal — AAA : au moins
7:1(critère 1.4.6). - Grand texte — AAA : au moins
4.5:1.
La logique : plus le texte est grand et gras, plus les fûts des lettres sont larges, donc il reste lisible même à plus faible contraste. Cela vous laisse un peu plus de liberté dans les titres, mais vous ne devriez jamais descendre sous 4.5:1 dans le corps de texte.
Pas seulement le texte : éléments d'interface et graphiques
Voici un point que beaucoup de designers oublient : le contraste ne concerne pas que le texte. Le critère 1.4.11 Contraste des éléments non textuels, introduit dans WCAG 2.1, couvre aussi les parties interactives et porteuses d'information d'une interface :
- Bordures de boutons, contours des champs de formulaire, anneaux de focus ;
- Les limites de contrôles comme les cases à cocher et boutons radio ;
- Lignes, icônes et couleurs de carte qui portent un sens dans un graphique.
Tous doivent maintenir au moins 3:1 de contraste face à leurs couleurs voisines. Donc si vous posez une bordure de champ gris légèrement plus clair sur un fond gris clair, vous violez très probablement ce critère. Les indicateurs de focus sont particulièrement critiques : un utilisateur au clavier ne sait où il se trouve que grâce à un anneau de focus visible.
Choisir les couleurs en pratique
Quelques habitudes rendent la création d'une palette accessible bien plus simple :
- Partez de la luminosité, pas de la teinte. Conservez la teinte de votre marque mais ajustez sa clarté si nécessaire. Modifier la valeur
Len HSL, ou mieux en OKLCH, est la façon la plus propre d'augmenter le contraste. - Ne codez jamais le sens par la couleur seule. « Vert = succès, rouge = erreur » ne suffit pas en soi ; ajoutez une icône, un libellé ou un motif pour les daltoniens. C'est l'objet du critère 1.4.1 (Utilisation de la couleur).
- Testez les deux extrêmes. Une couleur qui passe en thème clair repose sur un fond différent en thème sombre. Mesurez dans les deux thèmes.
- Ne comptez pas sur le texte de remplacement (placeholder). Les placeholders gris pâles sont presque toujours sous 4.5:1 ; ne les utilisez jamais à la place d'un libellé permanent.
Côté CSS, donner au texte du mode sombre une teinte légèrement adoucie plutôt que du #000 pur (ou du blanc pur) ménage les yeux tout en conservant assez de contraste :
:root {
--text: #1a1a1a; /* thème clair, ~16:1 sur blanc */
--text-muted: #555; /* toujours au-dessus de 4.5:1 */
}
[data-theme="dark"] {
--text: #e8e8e8; /* ~13:1 sur fond sombre */
--text-muted: #a0a0a0;
}
Comment mesurer et tester le contraste ?
Estimer à l'œil n'est pas fiable ; vérifiez toujours avec un outil :
- WebAIM Contrast Checker — saisissez deux valeurs hex et obtenez le verdict AA/AAA instantanément.
- DevTools de Chrome/Edge — sélectionnez un élément de texte et ouvrez le sélecteur de couleur pour lire directement le ratio et les lignes AA/AAA.
- Lighthouse et axe DevTools — scannent la page entière et listent les échecs de contraste ; ils s'intègrent même à votre pipeline CI.
- Plugins Figma (comme Contrast ou Stark) — mesurent directement sur l'artboard pendant la conception.
Le flux idéal : vérifiez la palette dans Figma lors du design, ajoutez un contrôle automatisé avec axe ou Lighthouse dans le code, afin qu'une régression soit détectée avant la mise en production.
Questions fréquentes
Dois-je atteindre 4.5:1 partout ?
Pour le corps de texte et les petits caractères, oui, c'est obligatoire si vous visez la conformité AA. Il y a des exceptions : le texte purement décoratif (sans signification), les logos et les éléments d'interface désactivés sont exemptés de l'exigence de contraste. Pour les grands titres, le seuil descend à 3:1.
Le mode sombre résout-il le contraste automatiquement ?
Non. Du texte blanc pur sur fond sombre peut créer un effet de « halo » qui gêne la lecture, tandis qu'un texte gris pâle tombe facilement sous 4.5:1. Le mode sombre doit être mesuré aussi rigoureusement que le mode clair.
Les règles de contraste ont-elles changé entre les versions WCAG ?
Les seuils de contraste fondamentaux (4.5:1, 3:1, 7:1) sont identiques depuis WCAG 2.0. WCAG 2.1 a ajouté le contraste non textuel (1.4.11) ; la 2.2 a renforcé les critères liés à la visibilité du focus. Les seuils sont donc fixes, mais la portée s'est élargie.
Vous voulez une interface à la fois nette et lisible pour tous ? Je peux vous aider à bâtir une palette et un système de design conformes WCAG sans dénaturer vos couleurs de marque. Contactez-moi et étudions votre projet ensemble.