Contraste des couleurs et accessibilité : calcul, seuils WCAG et RGAA

Le vérificateur en haut de cette page compare deux couleurs et rend un chiffre, de 1:1 à 21:1. Ce guide explique d'où vient ce chiffre et quel seuil il doit atteindre selon ce que vous colorez.

La clarté avant la teinte
#Le contraste des couleurs en accessibilité
Le contraste des couleurs, c'est l'écart de clarté entre un texte et son arrière-plan : 1:1 pour deux couleurs de même clarté, 21:1 pour du noir sur du blanc. Il compte d'abord pour les personnes malvoyantes et pour celles dont la vue baisse avec l'âge.
La teinte n'entre presque pas dans le calcul. Un rouge #FF0000 et un vert #009400 donnent 1,00:1 : pour la formule, ce sont deux gris identiques. Le W3C l'a voulu ainsi, car une personne qui distingue mal les couleurs ne peut pas compter sur la teinte pour lire.


Description de l'image :
À gauche, une bannière annonce le « Marché de Noël des artisans », samedi 13 décembre, place des Tanneurs. Tout le texte est rouge vif (#FF0000) sur un arrière-plan vert vif (#009400). Les deux couleurs se distinguent par la teinte, mais le texte vibre et se lit mal.
À droite, la même bannière où chaque couleur est remplacée par le gris de même clarté. Le texte et l'arrière-plan deviennent le même gris moyen : le rectangle paraît uni et plus aucun mot n'est visible. C'est ce que mesure le ratio.
Les seuils viennent des WCAG (Web Content Accessibility Guidelines), que reprend le RGAA (Référentiel général d'amélioration de l'accessibilité). Voir aussi le glossaire : ratio de contraste.
#Calcul du ratio de contraste
Un texte bleu vif #0061F3 sur un arrière-plan jaune #FFD23F saute aux yeux. Le vérificateur répond pourtant 3,63:1 : échec pour un texte courant.
Description textuelle de l'animation
Une fiche produit de boutique en ligne : une photo de théière, le nom « Théière en grès », le prix 29,90 € et un bouton jaune « Ajouter au panier » écrit en bleu vif, à la taille d'un texte courant. Le personnage dd, le logo d'Includdy avec des bras et des jambes, entre par la gauche, regarde le bouton et lève le pouce. La question s'affiche : ce bouton est-il assez contrasté ?
Une étiquette « Vérificateur de contraste » apparaît sous la fiche et un trait lumineux balaie le bouton, comme un scanner.
Un tampon rouge « Échec » tombe de travers sur le coin du bouton. Dessous, en gros : ratio 3,63:1, il faut au moins 4,5:1. dd sursaute.
Le mot ratio clignote. Question : ce ratio, qu'est-ce que c'est, et d'où sort 3,63 ? Un point d'interrogation flotte au-dessus de dd.
La fiche s'efface. Le bouton jaune est agrandi jusqu'à montrer un seul pixel de l'écran : un carré fait de trois bandes lumineuses, rouge, verte et bleue, qui s'allument l'une après l'autre.
Sous les trois bandes s'écrivent leurs noms : rouge, vert, bleu. Chaque pixel mélange ces trois lampes pour fabriquer une couleur.
Le pixel disparaît. En haut apparaissent les deux couleurs du bouton, à gauche l'arrière-plan jaune #FFD23F, à droite le texte bleu #0061F3. Les mots rouge, vert et bleu montent se placer au-dessus de chaque colonne. Chaque code se coupe en trois pastilles : FF, D2 et 3F pour le jaune, 00, 61 et F3 pour le bleu.
Sous chaque pastille s'écrit le réglage de sa lampe, de 0 à 255 : 255, 210 et 63 pour le jaune, 0, 97 et 243 pour le bleu.
Sous chaque réglage se glisse une barre de fraction et le nombre 255 : chaque réglage est divisé par 255, le maximum possible, pour obtenir une valeur relative. Un instant plus tard, chaque fraction laisse place à son résultat, de 0 à 1 : 1, 0,82 et 0,25 pour le jaune, 0, 0,38 et 0,95 pour le bleu.
Des barres montent pour montrer la lumière réelle que l'écran émet pour chaque part, avec leur valeur au-dessus. Pour le jaune : 1, 0,64 et 0,05. Pour le bleu : 0, 0,12 et 0,90.
dd explique que les codes de couleur sont réglés pour l'œil, qui distingue mieux les nuances dans le sombre que dans le clair : ils ne mesurent donc pas directement la quantité de lumière. Pour la retrouver, on élève chaque part à la puissance 2,2 environ. Le mot « puissance » et le nombre 2,2 s'affichent en grand, puis le 2,2 se réduit et vient se placer en exposant à côté de chaque part. Chaque barre redescend alors à sa lumière réelle : 0,82 donne 0,64, 0,25 donne 0,05, 0,38 donne 0,12 et 0,95 donne 0,90. Les valeurs affichées viennent de la formule exacte des WCAG, un peu plus fine, dont la puissance 2,2 est une bonne approximation.
Les colonnes s'effacent. Une courbe en cloche sur l'arc-en-ciel montre la sensibilité de l'œil selon la couleur de la lumière : haute dans le vert, faible dans le bleu. Près des trois lampes, des badges donnent la part de chacune dans le blanc de l'écran, qui dépend de la sensibilité de l'œil et de la lumière de chaque lampe : rouge 21 %, vert 72 %, bleu 7 %. Les colonnes reviennent et les badges descendent sous les barres. Chaque barre est multipliée par son badge et rapetisse : pour le jaune, 0,213, 0,461 et 0,004 ; pour le bleu, 0,000, 0,085 et 0,065 (calculés avec les valeurs exactes, puis arrondis).
Dans chaque colonne, les trois barres s'empilent et leurs valeurs s'additionnent : 0,213 + 0,461 + 0,004 ≈ 0,677 pour le jaune (la somme exacte, les valeurs affichées étant arrondies), 0,000 + 0,085 + 0,065 = 0,150 pour le bleu. Chaque pile devient un gris : un gris clair de 0,68 pour le jaune, un gris foncé de 0,15 pour le bleu, une fois arrondis.
Les deux gris montent prendre leur place dans un calcul : (0,68 + 0,05) / (0,15 + 0,05) ≈ 3,63 ; le calcul exact, (0,6771 + 0,05) / (0,1502 + 0,05), donne 3,63. Une note précise que 0,05 représente la lumière de la pièce reflétée par l'écran. En comptant la lumière de la pièce, le jaune émet 3,63 fois plus de lumière que le bleu : c'est le ratio. dd pointe le résultat et hoche la tête.
Pour finir, la fiche produit revient avec son tampon « Échec ». dd demande comment réparer ce bouton. Le bleu du texte fonce jusqu'à #0050C8 : le tampon rouge s'envole, un tampon vert « Réussi » le remplace, et la ligne devient « Ratio 4,88:1, au-dessus de 4,5:1 ». dd lève le pouce.
Pour finir, une animation du vérificateur de contraste d'Includdy, dans une fenêtre de navigateur à l'adresse includdy.com/contraste. Le vérificateur s'assemble : les onglets WCAG 2.2 et APCA, les champs « Couleur du texte » et « Couleur d'arrière-plan », la carte de résultat et l'aperçu ; la caméra glisse d'une partie à l'autre et un pointeur fait chaque geste. Au départ, du texte noir sur du blanc : 21,00:1. Légende : « Essayons ce bleu et ce jaune dans le vérificateur. » Le pointeur tape #0061F3 dans le champ du texte, puis #FFD23F dans celui de l'arrière-plan. Légende : « Saisissez la couleur du texte, puis celle de l'arrière-plan. » La carte passe au rouge : 3,63:1, « Seulement en grand ». dd montre le score. Légende : « Verdict immédiat : contraste insuffisant pour du texte normal. » Sous la carte, « Améliorations possibles » s'ouvre avec trois combinaisons proches : texte ajusté 4,54:1, texte et arrière-plan ajustés 4,52:1, arrière-plan ajusté 4,50:1. Légende : « L'outil propose alors des couleurs proches qui réussissent le test. » Le pointeur clique sur « Texte ajusté » : le texte devient #004fe1, la carte passe au vert, 4,54:1, « Lisible, AA pour le texte normal ». Légende : « Un clic, et votre texte devient lisible. » Pour finir, la fenêtre se range à gauche et une carte apparaît à droite : un QR code qui ouvre includdy.com/contraste, l'adresse includdy.com/contraste en grand et la mention « Gratuit, sans inscription ». dd lève le pouce. Légende finale : « Gratuit et sans inscription : includdy.com/contraste ».
Pour finir, la fenêtre et la carte s'effacent. dd reste seul sur la scène et fait une petite danse : il pointe le doigt en l'air, remue un derrière qu'il n'a pas et fait un clin d'œil. Puis il saute à sa place dans le mot « inclusion buddy » : ses deux lettres en deviennent le « dd » bleu, et une note précise « inclusion buddy : le compagnon de l'inclusion ». Le mot se replie en « includdy », le logo vient au premier plan, et le slogan s'affiche dessous pendant que la voix le dit : « L'accessibilité web rendue simple. Gagnez du temps en assurant votre conformité. »
- Trois lampes par pixel. L'écran mélange une lampe rouge, une verte et une bleue, réglées de 0 à 255. Le code
#0061F3donne ces réglages : 0, 97 et 243. - Une part de 0 à 1. Chaque réglage est divisé par 255, le maximum possible : 97 devient 0,38, et 243 devient 0,95.
- La vraie lumière. Les codes sont réglés pour l'œil, qui voit mieux les nuances dans le sombre : ils ne mesurent pas la quantité de lumière. Pour la retrouver, on élève chaque part à la puissance 2,2 environ : 0,38 donne 0,12, et 0,95 donne 0,90.
- La sensibilité de l'œil. L'œil est bien plus sensible au vert. Selon cette sensibilité et la lumière de chaque lampe, sur 100 parts de clarté, le vert en apporte 72, le rouge 21, le bleu 7. Chaque lumière est multipliée par son poids : la lampe bleue, presque à fond, ne compte plus que pour 0,065.
- L'addition. Les trois résultats s'additionnent : on obtient la clarté de la couleur, de 0 à 1, que les WCAG appellent la luminance relative. Notre bleu vaut 0,1502, le jaune monte à 0,6771.
- La division. On divise le plus clair par le plus foncé, en ajoutant 0,05 de chaque côté pour la lumière de la pièce reflétée par l'écran : (0,6771 + 0,05) / (0,1502 + 0,05) ≈ 3,63.
En noir et blanc, ces deux couleurs deviendraient un gris foncé et un gris clair assez proches : c'est cet écart que mesure le ratio. Le noir (0) sur le blanc (1) donne 21, d'où le plafond de 21:1. Le même poids du vert explique pourquoi le vert pur #00FF00 sur blanc ne donne que 1,37:1.
#Taux de contraste minimum WCAG et RGAA : 4,5:1, 3:1 et 7:1
Le seuil dépend de la taille du texte et du niveau visé : AA, celui que demande la loi, ou AAA, plus exigeant.
| Type de texte | Niveau AA | Niveau AAA |
|---|---|---|
| Texte courant | 4,5:1 | 7:1 |
| Grand texte : 24 px, ou 14 pt gras, environ 18,7 px (18,5 px dans le RGAA) | 3:1 | 4,5:1 |
Le critère 3.2 du RGAA fixe le grand texte à 24 px, ou 18,5 px en gras. Un intertitre de 18 px en gras reste donc à 4,5:1.

Description de l'image :
Page d'un atelier de céramique, « Grès & Sel ». En haut, le logo et quatre icônes : recherche, compte, favoris, panier.
Le titre « Nos ateliers du samedi » (repère A) est écrit en 24 px, en terre cuite #C0703E, sur blanc. Dessous, un court paragraphe gris foncé présente les ateliers.
Une carte suit, avec la photo d'un mug en grès. Son intertitre « Initiation au tournage » (repère B) a la même couleur terre cuite, en 18 px gras. Dessous : une description, « Samedi 10 h, 65 € » et un bouton noir « Réserver ».
Les deux textes ont exactement la même couleur ; seule leur taille change le seuil à atteindre.
- Le gris
#6B7280du texte secondaire atteint 4,83:1 sur blanc et passe. - Le gris
#9CA3AFdes textes d'exemple dans les champs n'atteint que 2,54:1. #777777donne 4,48:1 et échoue : le ratio ne s'arrondit jamais.
Les textes secondaires sont ceux qui frôlent le plus souvent le seuil. Sur la fiche produit ci-dessous, regardez la ligne de description sous le nom du mug.


Description de l'image :
Deux fiches produit identiques : à gauche la photo d'un mug en grès moucheté, à droite son nom « Mug moucheté », une ligne de description, le prix 28,00 € et un bouton noir « Ajouter ».
La description « Grès fait main à Nantes, 30 cl. Passe au lave-vaisselle. » est en gris #777777 dans la première fiche (repère A) et en gris #374151 dans la seconde (repère B). Dans la seconde, le texte est aussi un peu plus grand, 16 px.
Pourquoi 4,5 ? Une bonne vue lit à partir de 3:1, et vers 80 ans il faut environ une fois et demie plus de contraste.
#Contraste des boutons, champs de formulaire et icônes
Le critère 1.4.11 (3.3 du RGAA) demande 3:1 pour ce qui permet de repérer un élément d'interface : bordure d'un champ sans couleur d'arrière-plan, focus, coche d'une case, icône seule dans un bouton.
Sur un champ, la bordure dessine la zone où l'on écrit. La bordure en gris très clair #E5E7EB donne 1,24:1 sur blanc : au soleil, le champ disparaît. Comparez les contours du champ e-mail et de la case à cocher.


Description de l'image :
Deux versions du formulaire de commande d'une fromagerie, étape 1 sur 3, « Vos coordonnées ». Chacune contient le champ « Nom complet » rempli avec « Claire Moreau », le champ « Adresse e-mail » rempli avec « [email protected] », une case à cocher pour recevoir l'arrivage du vendredi, et un bouton brun foncé « Continuer vers le retrait ».
Dans la première version, les bordures des champs et de la case sont gris très clair, #E5E7EB : sur le blanc, on devine à peine les contours (repère A sur le champ e-mail). Dans la seconde, elles sont gris moyen, #6B7280, et chaque champ se détache nettement (repère B).
Une icône seule, sans mot à côté, est la seule indication de ce que fait le bouton : elle doit elle aussi atteindre 3:1. Observez les quatre icônes de l'en-tête.


Description de l'image :
Deux versions de l'en-tête d'une boutique de céramique. À gauche, le logo « Grès & Sel » ; à droite, quatre icônes seules, sans texte : loupe, silhouette du compte, cœur des favoris, sac du panier. Sous l'en-tête, le fil d'Ariane et le titre « Bols en grès ».
Dans la première version, les quatre icônes sont gris très pâle, #D1D5DB (repère A), presque invisibles. Dans la seconde, elles sont gris foncé, #4B5563 (repère B).
L'arrière-plan d'un bouton, lui, peut se fondre dans la page si son texte suffit à le repérer ; c'est ce texte qui doit atteindre 4,5:1. Le blanc sur l'orange #FF6B00 des boutons d'achat ne donne que 2,86:1, et le rouge d'erreur #EF4444 sur blanc, 3,76:1.


Description de l'image :
Deux versions du bloc d'achat d'un « Saladier en grès, 24 cm » à 46,00 €. On y voit un sélecteur de quantité réglé sur 1, un grand bouton arrondi « Ajouter au panier » avec une icône de sac, et la mention « Expédié sous 48 h, emballage sans plastique ».
Dans la première version, le bouton est orange vif #FF6B00 avec un texte blanc qui manque de netteté (repère A). Dans la seconde, il est orange brûlé #C2410C, toujours orange, et le texte blanc se lit nettement (repère B).
Le contour de focus montre l'élément atteint avec la touche Tab. S'il se confond avec l'arrière-plan, une personne qui navigue au clavier perd sa place dans la page. Dans le menu ci-dessous, le focus est sur « Commander ».


Description de l'image :
Deux versions de l'en-tête d'une boulangerie, « Boulangerie Fournier », avec un bouton brun « Mon panier » et un menu de quatre liens : « Nos pains », « Commander », « Horaires », « La boutique ». Dessous, un bandeau crème annonce « Pain au levain, cuit chaque matin ».
Le focus du clavier est sur « Commander ». Dans la première version, il est entouré d'un contour bleu ciel #BFDBFE, qu'on distingue à peine du blanc (repère A). Dans la seconde, le contour est bleu foncé #1D4ED8 et saute aux yeux (repère B).
#Exceptions au contraste minimum : logos, décor, éléments désactivés
Aucun seuil ne s'applique au texte d'un logo, à un élément désactivé, au texte purement décoratif ni au texte présent par hasard dans une photo. Une icône qui répète le mot écrit à côté est exemptée aussi. La page ci-dessous en réunit quatre.

Description de l'image :
Page d'une épicerie en ligne, « comptoir vert ». En haut, le logo : une feuille et le nom en vert clair (repère A), puis les icônes recherche et panier.
Le titre « Fruits et légumes du jour » est en vert très foncé. À sa droite, le mot « Bio » est écrit en très grand, dans un vert presque blanc (#E8F5EE) : c'est une décoration (repère B). Dessous, la ligne « Livraison offerte dès 40 € » commence par une icône de camion gris clair (repère C).
En bas, l'encadré « Votre panier » liste un panier de saison à 24,90 € et un miel de châtaignier à 9,50 €, pour un total de 34,40 €. La mention « Choisissez un créneau de retrait pour continuer » précède le bouton « Valider la commande », grisé et désactivé (repère D).
La charte graphique, elle, n'exempte que le logo : les boutons et liens dans la couleur de marque restent soumis aux seuils. Si la couleur de la marque est trop claire pour porter du texte, gardez-le pour le logo et prenez une version plus foncée pour les boutons et les liens.


Description de l'image :
Deux versions de la fiche « Panier de saison, 6 kg » de l'épicerie « comptoir vert » : une description, le prix 24,90 €, un grand bouton « Commander ce panier » et la phrase « Prêt en 2 h. Voir les points de retrait », dont la fin est un lien souligné.
Dans la première version, le bouton a un arrière-plan vert clair #4CAF7A avec un texte blanc (repère A), et le lien, en gras, est écrit dans ce même vert (repère B). Dans la seconde, le bouton et le lien passent au vert plus foncé #1A8755 (repères C et D). Le logo reste vert clair dans les deux.
#Couleur et contraste des liens dans un texte
Un lien distingué par sa seule couleur doit atteindre 4,5:1 avec l'arrière-plan et 3:1 avec le texte voisin (technique G183). Le bleu par défaut #0000EE atteint 9,40:1 sur blanc, mais 2,23:1 face à un texte noir : sans son soulignement par défaut, on le distinguerait mal du texte.
Soulignez vos liens : l'exigence face au texte voisin disparaît, celle face à l'arrière-plan reste. Un soulignement qui n'apparaît qu'au survol ne suffit pas.


Description de l'image :
Deux versions d'un article du blog d'une boulangerie, « Le levain, notre ingrédient le plus lent ». Le paragraphe est en noir sur blanc et contient un lien, « la recette du pain de campagne », en bleu.
Dans la première version, le lien n'est pas souligné : seule sa couleur bleue le distingue du texte noir qui l'entoure (repère A, au début de sa ligne). Dans la seconde, le même lien bleu est souligné (repère B).
#Contraste du texte transparent ou posé sur une image
On mesure la couleur réellement affichée. Un texte noir à 50 % d'opacité sur blanc devient le gris #808080 : 3,95:1, échec. L'agenda ci-dessous utilise cette transparence pour ses sous-titres.


Description de l'image :
Deux versions de l'agenda d'octobre d'un café, « La Chope ». Deux événements sont listés avec leur date : « Concert du vendredi », le 17 octobre, et « Soirée jeux de société », le 24 octobre. Sous chaque titre noir, un sous-titre donne l'heure et les détails.
Les sous-titres sont écrits en noir rendu transparent. À 50 % d'opacité, ils apparaissent gris moyen (repère A) ; à 75 %, gris plus foncé (repère B).
Sur une photo, mesurez la zone la plus défavorable sous les lettres, et ajoutez un voile sombre si l'arrière-plan varie trop. Une photo claire et chargée, comme celle de ce fleuriste, est le cas le plus difficile.


Description de l'image :
Deux versions de la bannière d'accueil d'un fleuriste, « Fleurs de Margaux ». La photo montre l'intérieur lumineux d'une boutique : des fleurs blanches et roses dans des seaux en zinc, devant une grande fenêtre baignée de soleil.
Par-dessus, en blanc : le nom du fleuriste, un menu, le titre « Bouquets de saison, livrés le jour même » et la phrase « Commandez avant 14 h, nous livrons dans tout Lyon ».
Dans la première version, la photo est affichée telle quelle : le titre blanc se perd dans les fleurs blanches et le mur clair (repère A). Dans la seconde, un voile gris foncé couvre toute la photo, qui reste reconnaissable, et le texte blanc se lit partout (repère B).
Le texte dessiné dans l'image elle-même compte aussi : le slogan d'une bannière exportée en JPG, les prix d'un visuel promotionnel, une capture d'écran. Les WCAG appliquent les mêmes seuils à ces images de texte qu'au texte de la page. Un outil qui lit seulement le code ne voit pas ces lettres : vérifiez-les à part.


Description de l'image :
Deux versions d'un visuel promotionnel de jardinerie. La photo montre des plantes vertes en pots de terre cuite, sur des étagères en bois clair, devant un mur blanc.
Dans la première version, le slogan « −20 % sur les plantes d'intérieur, jusqu'au 31 octobre » est écrit en blanc, en haut à droite, directement sur le mur blanc et les feuilles : on le lit à peine (repère A). Il fait partie du fichier image.
Dans la seconde, le même slogan est écrit en blanc sur un bandeau vert foncé (#14532D) en bas de l'image, et il se lit nettement (repère B).
#Comment APCA calcule le contraste
APCA (Accessible Perceptual Contrast Algorithm) est une autre façon de calculer le contraste, créée par Andrew Somers. Comme les WCAG, il part de la clarté des deux couleurs. La suite change sur trois points.
Description textuelle de l'animation
Trois grandes pastilles de couleur s'alignent : à gauche le texte noir #000000, au milieu l'arrière-plan vert #16A34A d'un bouton, à droite le texte blanc #FFFFFF. dd, le logo d'Includdy avec des bras et des jambes, entre par la gauche et les regarde. Comme WCAG, APCA commence par mesurer la luminance de chaque couleur, la lumière qu'elle émet. Les pastilles noire et blanche pâlissent et, sous le vert, on retrouve les trois lampes du premier dessin animé : rouge, vert, bleu. Sous chaque nom, sa paire du code, 16, A3 et 4A, puis son réglage sur 255 : 22, 163 et 74. Des barres montent à la part de chaque lampe : 0,09, 0,64 et 0,29. Puis « puissance 2,4 » s'affiche en grand, et le 2,4 vient se placer en petit exposant à côté de chaque part. À cette étape, APCA utilise une simple puissance 2,4, là où la formule exacte de WCAG suit une courbe en deux parties, proche d'une puissance 2,2. Les barres baissent jusqu'à la lumière réelle : 0,00, 0,34 et 0,05. Sous les barres apparaissent les poids de l'œil, les mêmes que pour WCAG : ×21 %, ×72 % et ×7 %, et à droite, en petit, la courbe de sensibilité de l'œil revient en rappel, avec un point rouge, vert et bleu pour chaque lampe. Les barres rétrécissent encore : 0,0006, 0,2443 et 0,0037. Puis elles s'empilent en une seule barre grise, tandis que leurs valeurs viennent se poser au-dessus, l'une sous l'autre, pour une addition posée : 0,0006 + 0,2443 + 0,0037 = 0,2486. C'est le gris du vert pour APCA. À côté, un petit texte rappelle celui de WCAG : 0,2686. Le gris remonte sous la pastille verte. Les pastilles reprennent leur couleur et, sous chacune, apparaît son gris avec sa valeur : 0 pour le noir, 0,2486 pour le vert, 1 pour le blanc, et chacun se place sur une réglette qui va du noir au blanc. dd les pointe du doigt.
Les pastilles s'effacent et les gris se rangent en deux colonnes. À gauche, un bouton vert « Continuer » écrit en noir : du texte foncé sur clair. À droite, le même bouton écrit en blanc : du texte clair sur foncé. Le gris du vert se dédouble pour aller dans les deux colonnes. Première différence avec WCAG : le sens du contraste compte. dd regarde un bouton puis l'autre, un point d'interrogation au-dessus de la tête.
Pourquoi ? Les boutons et les gris s'écartent un instant, et deux panneaux apparaissent sous les mentions « Foncé sur clair » et « Clair sur foncé » : à gauche, « Aa » en noir sur un panneau blanc, à droite, « Aa » en blanc sur un panneau noir. L'œil s'adapte à la lumière qui entoure le texte : sur un arrière-plan foncé, un texte clair agit un peu comme une petite lampe. Exemple : il peut paraître plus gras et un peu flou, c'est le halo, et le « Aa » blanc se met à rayonner. APCA a mesuré des puissances propres à chaque sens, une pour l'arrière-plan et une pour le texte : 0,56 et 0,57 quand le texte est foncé sur clair, 0,65 et 0,62 quand il est clair sur foncé. Elles s'inscrivent sous les panneaux. dd regarde un panneau puis l'autre et pointe le « Aa » blanc, puis les boutons et les gris reviennent.
D'abord l'arrière-plan. Dans chaque colonne, la puissance s'affiche en grand : « puissance 0,56 » à gauche, « puissance 0,65 » à droite. Le mot s'efface, le nombre rétrécit et vient se placer en petit, en haut à droite de 0,2486 : c'est un exposant. Le résultat s'écrit à côté : 0,2486 puissance 0,56 égale 0,4586, et 0,2486 puissance 0,65 égale 0,4046. Puis seul ce résultat reste dans le gris. dd pointe les puissances, se penche pour suivre leur trajet, puis hoche la tête.
Ensuite le texte. APCA remonte d'abord un peu le noir pur : son 0 devient 0,0045. Les puissances du texte s'affichent à leur tour en grand, 0,57 pour le noir et 0,62 pour le blanc, puis passent en exposant de la même façon. Le noir donne 0,046 et le blanc reste à 1.
Deuxième différence avec WCAG : APCA soustrait au lieu de diviser. Les gris s'écartent et, dans chaque colonne, deux barres montent côte à côte, l'arrière-plan à gauche et le texte à droite, avec la mention « WCAG 2 » : ce sont d'abord les luminances de WCAG, plus 0,05. Le vert vaut 0,2686 + 0,05 = 0,3186, le noir 0 + 0,05 = 0,05 et le blanc 1 + 0,05 = 1,05. WCAG divise : il regarde combien de fois une barre est plus haute que l'autre. Des copies de la barre courte glissent une à une depuis la droite et s'empilent au-dessus d'elle jusqu'en haut de la grande, la dernière coupée : × 6,37 à gauche, le ratio de 6,37:1 du texte noir, et × 3,30 à droite, le ratio de 3,30:1 du texte blanc. Puis la mention devient « APCA » et les barres changent de hauteur : elles prennent les clartés corrigées d'APCA, 0,4586 et 0,046 à gauche, 0,4046 et 1 à droite. APCA soustrait : il mesure l'écart entre le haut des deux barres. Une accolade marque cet écart : 0,4126 à gauche, moins 0,5954 à droite. dd pointe la pile, puis se penche vers l'écart et hoche la tête. Les barres s'effacent et les gris reviennent. Dans chaque colonne, les deux valeurs se placent de part et d'autre d'un signe moins : clarté de l'arrière-plan moins clarté du texte. À gauche, 0,4586 moins 0,046 égale 0,4126. À droite, 0,4046 moins 1 égale moins 0,5954. Cet écart passe ensuite par trois opérations, chaque nouvelle valeur remplaçant la précédente. D'abord, on le multiplie par 1,14, un facteur d'échelle choisi pour que les seuils tombent sur des nombres ronds : 0,470 à gauche, moins 0,679 à droite. Puis APCA teste l'écart : sous 0,1, le score vaut zéro, ce qui efface les contrastes trop faibles ; ici, il dépasse 0,1. Sinon, on le rapproche de zéro de 0,027 : 0,443 à gauche, moins 0,652 à droite. Enfin, multiplié par 100, il devient le score Lc : Lc 44,3 pour le texte noir, Lc moins 65,2 pour le texte blanc. Le signe moins clignote : il indique un texte clair sur un arrière-plan foncé. dd pointe chaque opération, hoche la tête, puis pointe le signe moins.
Troisième différence avec WCAG : le score d'APCA donne une taille de texte minimale précise, là où WCAG n'a que deux catégories, texte courant et grand texte. Les calculs s'effacent, les scores montent sous les boutons, et dessous apparaissent deux carrés verts avec les lettres « Aa », minuscules. Les lettres grandissent. Le blanc devient lisible dès 21,75 px, en graisse normale, et s'arrête vite. Le noir doit grandir bien plus, jusqu'à 44 px, toujours en graisse normale. dd se penche pour suivre la course.
La colonne du noir pâlit et le carré blanc s'entoure de vert : APCA prédit le texte que l'œil lit le mieux, ici le blanc. dd lève le pouce et hoche la tête.
Pour résumer, tout s'efface et dd part en courant vers la gauche, les talons dans un petit nuage de poussière. Trois cartes apparaissent l'une après l'autre au centre. Première carte : « Le sens du contraste compte », avec un petit « Aa » noir sur blanc à côté d'un « Aa » blanc sur noir. Deuxième carte : « APCA soustrait les clartés », avec un signe moins à côté d'un signe diviser barré de rouge. Troisième carte : « Le score donne une taille minimale », avec un petit « Aa » qui grandit. dd tombe du haut de l'image sur la première carte, en soulevant de la poussière, et hoche la tête. À chaque nouvelle carte, il prend son élan jusqu'au bord, s'accroupit et saute par-dessus le vide jusqu'à la carte suivante, où il atterrit dans un nuage de poussière. Sur chaque carte, il s'arrête un instant, regarde la carte et hoche la tête. Sur la troisième, il regarde le « Aa » grandir et lève le pouce. Puis il s'élance d'un bond vers le coin en haut à droite et sort de l'image, avant de revenir en courant par la gauche jusqu'à sa place, près de la bulle.
Pour finir, une animation du vérificateur de contraste d'Includdy, dans une fenêtre de navigateur à l'adresse includdy.com/contraste. Le vérificateur s'assemble : les onglets WCAG 2.2 et APCA, les champs « Couleur du texte » et « Couleur d'arrière-plan », la carte de résultat et l'aperçu ; la caméra glisse d'une partie à l'autre et un pointeur fait chaque geste. Au départ, du texte noir sur du blanc. Légende : « Mettons ce bouton vert dans notre vérificateur, avec un texte blanc. » Le pointeur colle #16A34A dans le champ de l'arrière-plan, puis tape #FFFFFF dans celui du texte. En WCAG 2.2, la carte passe au rouge : 3,30:1. Le pointeur clique sur l'onglet APCA ; l'indicateur glisse et s'étire. Légende : « Passez sur APCA : la taille de texte minimale s'affiche. » La carte affiche Lc −65,2, « Seulement en grand, taille minimale : 22 px, ou 15 px en gras », « texte clair sur arrière-plan foncé ». La caméra glisse vers l'aperçu, qui dit : « Avec ce contraste, le texte normal doit faire au moins 22 px » (le tableau d'APCA donne 21,75 px, l'outil arrondit au-dessus). Légende : « En blanc, en graisse normale, il faut au moins 22 pixels. » Le pointeur remplace #FFFFFF par #000000 : Lc 44,3, « Très grand texte seulement, taille minimale : 44 px, ou 25 px en gras », et l'aperçu, « Lisible en grand seulement », demande au moins 44 px. dd écarquille les yeux. Légende : « En noir, il faudrait des lettres deux fois plus grandes. » Pour finir, la fenêtre se range à gauche et une carte apparaît à droite : un QR code qui ouvre includdy.com/contraste, l'adresse includdy.com/contraste en grand et la mention « Gratuit, sans inscription ». dd lève le pouce. Légende finale : « Gratuit et sans inscription : includdy.com/contraste ».
Pour finir, la fenêtre et la carte s'effacent. dd reste seul sur la scène et fait une petite danse : il pointe le doigt en l'air, remue un derrière qu'il n'a pas et fait un clin d'œil. Puis il saute à sa place dans le mot « inclusion buddy » : ses deux lettres en deviennent le « dd » bleu, et une note précise « inclusion buddy : le compagnon de l'inclusion ». Le mot se replie en « includdy », le logo vient au premier plan, et le slogan s'affiche dessous pendant que la voix le dit : « L'accessibilité web rendue simple. Gagnez du temps en assurant votre conformité. »
- Le sens compte. L'œil ne lit pas de la même façon un texte foncé sur un arrière-plan clair et un texte clair sur un arrière-plan foncé. APCA fait passer chaque clarté par une courbe qui dépend de ce sens.
- Une soustraction au lieu d'une division. APCA retire la clarté du texte de celle de l'arrière-plan. Le résultat s'appelle le score Lc (de l'anglais lightness contrast, le contraste de clarté), et son signe donne le sens : négatif pour un texte clair sur un arrière-plan foncé.
- Une taille minimale au lieu d'un seuil. Le score ne dit pas « passe » ou « échoue » : il donne la taille de texte à partir de laquelle on lit sans effort, selon la graisse de la police.
Sur un bouton vert #16A34A, le texte blanc obtient Lc −65,2 : en graisse normale, il se lit dès 21,75 px. Le texte noir obtient Lc 44,3 : il faudrait l'écrire en 44 px. Les valeurs viennent de la bibliothèque apca-w3.
#WCAG 2 ou APCA : quand les deux ne sont pas d'accord
Les deux méthodes ne donnent pas toujours la même réponse. Sur un bouton bleu #2F80ED, les WCAG font passer le texte noir à 5,43:1 et refusent le blanc à 3,87:1. APCA dit l'inverse : Lc −71,1 pour le blanc, lisible dès 19,5 px en graisse normale, et Lc 38,5 pour le noir, qu'il faudrait écrire en 71 px. À l'œil, beaucoup trouvent le blanc plus lisible.
Description textuelle de l'animation
La capture d'un petit site apparaît au centre de l'écran : « Atelier Terre », un atelier de céramique fictif, avec un formulaire et son bouton « Envoyer » bleu #2F80ED, en graisse normale. dd entre par la gauche. Légende : « Ce formulaire a un bouton bleu. Pour son texte, noir ou blanc ? » Sur « bouton », la vue zoome doucement sur ce bouton, qui remplit le centre de l'écran.
Un seul bouton, et une hésitation : sur « noir », son texte devient noir ; sur « blanc », il redevient blanc ; puis il continue d'alterner, noir, blanc, noir, blanc, de plus en plus lentement. dd réfléchit, la main au menton, un point d'interrogation au-dessus de la tête, les yeux sur le bouton.
Légende : « Comparons les deux : noir en haut, blanc en bas. » Le bouton se dédouble en deux grands boutons du même bleu, l'un au-dessus de l'autre : celui du haut en texte noir, celui du bas en texte blanc. Puis la question : « À votre avis, lequel se lit le mieux ? » dd regarde un bouton puis l'autre et ouvre les mains.
Les deux boutons rapetissent et se rangent côte à côte en haut de l'écran, le noir à gauche, le blanc à droite. dd les suit des yeux.
Sous chaque bouton apparaît le verdict de WCAG 2 : le texte noir obtient 5,43:1, conforme, en vert avec une coche ; le texte blanc obtient 3,87:1, en échec, en rouge avec une croix. Légende : « Pour WCAG 2, en texte normal, le noir passe et le blanc échoue. » dd hésite et secoue la tête.
Légende : « Pourtant, à l'œil, beaucoup trouvent le blanc plus lisible. WCAG 2 aurait-il tort ? » dd pointe le bouton blanc, dont le verdict rouge tremble.
Dessous apparaît le score APCA de chaque bouton : Lc 38,5 pour le texte noir, Lc −71,1 pour le texte blanc. Le signe moins indique un texte clair sur un arrière-plan foncé. Légende : « Regardons APCA : Lc −71,1 pour le blanc, contre 38,5 pour le noir. » dd écarquille les yeux puis hoche la tête.
Sous chaque score, une barre montre la taille minimale pour lire le texte. Légende : « Ce score donne aussi une taille minimale de texte. » La barre du noir se remplit entièrement, lisible dès 71 px en graisse normale ; celle du blanc s'arrête au quart, lisible dès 19,5 px.
Légende : « Comme notre œil, APCA préfère donc le blanc. » Le verdict du blanc s'illumine et dd lève le pouce.
Légende : « Un bleu un peu plus foncé, et les deux méthodes valident le blanc. » La colonne du texte noir s'efface. Le bouton au texte blanc fonce, du bleu #2F80ED au bleu #1470EB. Ses verdicts passent au vert : WCAG 2 donne 4,62:1, conforme, avec une coche ; APCA donne Lc −76,8, lisible dès 18 px. dd lève le pouce et hoche la tête.
Les boutons et leurs verdicts disparaissent. Deux cartes apparaissent côte à côte, chacune avec un petit « Aa » blanc sur le bleu #2F80ED. À gauche, « WCAG 2 » affiche 3,87:1 sur une règle qui s'arrête avant le trait de 4,5:1 : « la conformité, la norme exigée par la loi ». À droite, « APCA » affiche Lc −71,1 sur une règle qui part de zéro vers la gauche, du côté négatif, et dépasse le trait de −60 (Lc 60 en valeur absolue), le minimum pour un texte de 24 px, ou de 16 px en gras : « la lisibilité, plus proche de l'œil, mais expérimental ». Légende : « La loi s'appuie sur WCAG 2. APCA, encore expérimental, n'a aucune valeur légale. » dd regarde les deux cartes.
Légende : « Pour être conforme, vérifiez avec WCAG 2, » dd pointe la carte WCAG 2, son trait de 4,5:1 pulse ; la carte APCA pâlit.
Légende : « et pour la lisibilité, regardez APCA. » dd pointe la carte APCA, dont le score grossit un instant ; la carte WCAG 2 pâlit.
Les cartes disparaissent et dd file en courant vers la gauche, talons au vent, en soulevant de petits nuages de poussière. Au centre apparaît la capture d'un petit site, celui d'un atelier de céramique fictif, « Atelier Terre » : une barre de navigation, une photo d'étagères de bols et de tasses, et un formulaire « Nous écrire » avec les champs Nom, E-mail et Votre message, puis le bouton « Envoyer » au texte blanc en gras, bleu #2F80ED. Un fin trait part de ce bouton, un point d'abord, puis une ligne qui s'allonge jusqu'à un panneau placé à droite : un curseur « Luminosité » qui va du noir au blanc en passant par le bleu, avec sous sa poignée le code de la couleur, #2F80ED. Dessous, deux cartes de verdict pour le texte blanc du bouton : WCAG 2, seuil 4,5:1, et APCA, seuil Lc 60, avec la mention « pour un texte de 16 px en gras ». Au départ, WCAG 2 donne 3,87:1, en échec avec une croix rouge, et APCA Lc −71,1, au-dessus du seuil avec une coche verte. Légende finale : « S'ils ne sont pas d'accord, cherchez une couleur qui passe les deux. »
Aussitôt, dd passe la tête par le coin en haut à droite, jette un œil au curseur et saute dessus et atterrit sur la piste, à gauche de la poignée. Il pose la main sur la poignée et la tire d'un trait vers le côté sombre ; il force, et des gouttes de sueur s'envolent de sa tête. Le bouton fonce avec elle, le code sous la poignée change sans cesse et les valeurs défilent en continu, comme un compteur : le ratio WCAG 2 monte de 3,87:1 à 4,47:1, toujours avec sa croix rouge, et le score APCA descend de Lc −71,1 à Lc −75,8. dd s'arrête juste avant le seuil pour reprendre son souffle, en sueur. Puis une dernière poussée : à 4,52:1, sur le bleu #1872EB, WCAG 2 passe et sa croix devient une coche verte, et la poignée s'arrête sur #1470EB : 4,62:1 et Lc −76,8, les deux avec une coche verte. dd lâche la poignée, lève le pouce et hoche la tête.
Pour finir, une animation du vérificateur de contraste d'Includdy, dans une fenêtre de navigateur à l'adresse includdy.com/contraste. Le vérificateur s'assemble : les onglets WCAG 2.2 et APCA, les champs « Couleur du texte » et « Couleur d'arrière-plan », la carte de résultat et l'aperçu ; la caméra glisse d'une partie à l'autre et un pointeur fait chaque geste. Au départ, du texte blanc sur du noir. Légende : « Dernier essai : notre bouton bleu, avec son texte blanc. » Le pointeur colle #2F80ED dans le champ de l'arrière-plan : en WCAG 2.2, la carte passe au rouge, 3,87:1. Légende : « Son score avec WCAG, puis avec APCA. » Un clic sur l'onglet APCA : Lc −71,1, « Seulement en grand ». Retour sur WCAG 2.2 ; sous la carte, trois combinaisons : arrière-plan ajusté 4,52:1, texte et arrière-plan ajustés 7,36:1, texte ajusté 4,50:1. Légende : « Un clic sur la suggestion, et les deux méthodes sont d'accord. » Le pointeur clique sur « Arrière-plan ajusté » : l'arrière-plan devient #2274e0, la carte passe au vert, 4,52:1, « Lisible ». Sur l'onglet APCA, la même paire donne Lc −76,3, « Lisible, texte courant dès 18 px ». dd lève le pouce. Plus bas, la partie « 04 Exporter » monte à l'écran avec le code CSS des couleurs, ligne par ligne, et le pointeur clique sur « Copier », qui devient « Copié ». Légende : « Copiez ensuite toute la palette dans votre code. » Pour finir, la fenêtre se range à gauche et une carte apparaît à droite : un QR code qui ouvre includdy.com/contraste, l'adresse includdy.com/contraste en grand et la mention « Gratuit, sans inscription ». dd lève le pouce. Légende finale : « Gratuit et sans inscription : includdy.com/contraste ».
Pour finir, la fenêtre et la carte s'effacent. dd reste seul sur la scène et fait une petite danse : il pointe le doigt en l'air, remue un derrière qu'il n'a pas et fait un clin d'œil. Puis il saute à sa place dans le mot « inclusion buddy » : ses deux lettres en deviennent le « dd » bleu, et une note précise « inclusion buddy : le compagnon de l'inclusion ». Le mot se replie en « includdy », le logo vient au premier plan, et le slogan s'affiche dessous pendant que la voix le dit : « L'accessibilité web rendue simple. Gagnez du temps en assurant votre conformité. »
Les deux méthodes divergent dans les deux sens : #767676 sur blanc passe les WCAG à 4,54:1, mais n'obtient que Lc 71,6 avec APCA, sous le minimum de Lc 75 pour un texte courant. Changer de formule rendrait non conformes des sites qui l'étaient la veille, et l'inverse : le débat dure depuis plus de trois ans.
La loi suit les WCAG 2. Vérifiez la conformité avec elles et la lisibilité avec APCA ; en #1470EB, le bouton passe les deux avec un texte blanc.
#Tester et corriger le contraste des couleurs d'un site web
Collez vos couleurs dans l'outil en haut de cette page, dans n'importe quel format CSS : il tient compte de la transparence et propose des couleurs proches qui passent. Pour corriger, gardez la teinte et changez la clarté : l'orange #C2410C porte le texte blanc à 5,18:1 et reste orange.
Vérifiez aussi ce qu'on oublie : textes d'exemple des champs, messages d'erreur, focus, états de survol et thème sombre.
Le thème sombre se vérifie comme une palette à part. Un gris qui passe sur blanc peut échouer sur un arrière-plan presque noir, et APCA y demande souvent un texte plus clair, ou à défaut plus grand ou plus gras.


Description de l'image :
Deux versions de la page « Mes commandes » d'une boutique en ligne, en thème sombre : un arrière-plan presque noir et des titres blancs. Deux commandes sont listées, n° 4821 à 62,40 € et n° 4790 à 18,00 €, chacune avec une icône de colis.
Sous chaque numéro, une ligne indique la date de livraison et le nombre d'articles. Dans la première version, elle est en gris #6B7280, terne et difficile à lire (repère A). Dans la seconde, elle est en gris très clair #D1D5DB, en graisse moyenne (repère B).
Pour vérifier une page déjà en ligne, l'application Includdy la scanne et repère le texte peu contrasté là où il s'affiche, y compris sur un arrière-plan complexe et dans les images.

