Vérifier le contraste de couleur WCAG en ligne : AA, AAA et texte large

Vérifier le contraste de couleur WCAG en ligne : AA, AAA et texte large

Un ratio de contraste texte/fond insuffisant est l'erreur d'accessibilité la plus fréquente sur le web. Vérifiez AA/AAA en collant deux couleurs, sans plugin ni extension.

13.09.2026
11 min de lecture
Partager cet article:
accessibilitywcagcolor-contrastCSSTutoriel

Le contraste, première erreur d'accessibilité sur le web

Chaque année, l'audit WebAIM Million place le contraste de texte insuffisant en tête des échecs WCAG détectés, devant les images sans texte alternatif ou les liens sans libellé. Cet audit analyse les pages d'accueil les plus visitées du web. Le contraste est aussi l'un des rares critères d'accessibilité que l'on peut vérifier sans lecteur d'écran ni audit complet. Le vérificateur de contraste FastMinify calcule le ratio WCAG 2.2 entre deux couleurs CSS (HEX, RGB, HSL, OKLCH, color() ou couleurs nommées). Pendant la saisie, il affiche les verdicts AA et AAA pour le texte normal, le texte large et les éléments non textuels. Rien n'est envoyé à un serveur. Il va plus loin qu'un simple couple de couleurs : un mode matrice croise toute une palette de premier plan avec toute une palette d'arrière-plan en un seul passage. Les autres outils se trouvent sur le hub Couleur & CSS.

Verdicts WCAG 2.2 en direct : AA, AAA et non-texte 3:1 (SC 1.4.11) pour chaque paire de couleurs
Mode matrice jusqu'à 16 couleurs par axe, pour auditer d'un coup la palette d'un design system entier
Curseur d'opacité pour vérifier un texte semi-transparent composé sur son fond réel
Superposition APCA expérimentale (candidat à WCAG 3) en complément du ratio WCAG 2.2 classique
URL partageable : envoyez la vérification exacte à un designer ou collez-la dans une PR
100 % dans le navigateur, aucune couleur de charte graphique n'est transmise à un serveur

Les erreurs de contraste qui reviennent le plus souvent

Le texte gris clair "élégant" sur fond blanc

Un gris #999999 sur blanc donne un ratio d'environ 2,85:1, bien en dessous du seuil AA de 4,5:1. C'est pourtant l'un des choix de design les plus courants pour les textes secondaires, les placeholders et les légendes.

Texte placeholder de formulaire en gris trop clair (souvent < 3:1)
Légendes et métadonnées ("il y a 2h", "250 vues") en gris pâle sur fond clair
Copier un gris "neutre" d'une maquette Figma sans vérifier le ratio réel
Confondre "ça se lit bien sur mon écran" avec un ratio conforme (luminosité, calibration, fatigue visuelle)
Les utilisateurs malvoyants, les personnes en environnement lumineux (extérieur, écran mal calibré) et les daltoniens perdent une partie du contenu. Un audit axe ou Lighthouse échoue aussi en CI si le contraste est vérifié automatiquement.
Un bouton dans la couleur de marque qui échoue en silence

Les couleurs de marque "douces" (bleu pastel, vert menthe, orange clair) sont souvent choisies pour l'identité visuelle sans jamais être testées avec du texte blanc dessus.

Bouton primaire bleu clair + texte blanc : ratio parfois sous 3:1
État "disabled" qui ressemble visuellement à un état actif mal contrasté
Icônes monochromes sur fond de couleur sans vérifier le contraste non-texte (3:1)
Un seul test sur le bouton par défaut, jamais sur les états hover/focus/disabled
Un bouton d'appel à l'action illisible ou peu visible fait chuter le taux de clic. Au-delà de l'accessibilité, c'est aussi un problème de conversion.
Texte posé sur une image sans voile sombre

Un titre blanc sur une photo d'en-tête fonctionne sur la zone sombre du ciel, mais devient illisible sur la zone claire d'un nuage. Le contraste varie selon l'endroit de l'image où se trouve le texte.

Aucun dégradé ni voile sombre sous le texte
Texte testé uniquement sur la version desktop de l'image, pas sur le recadrage mobile
Ombre portée légère utilisée comme unique garantie de lisibilité
Image de fond changeante (carrousel, image utilisateur) sans contraste garanti
Ajoutez un dégradé semi-opaque (noir à 40–60 %) entre l'image et le texte, puis vérifiez le contraste sur la couleur du dégradé composé, et non sur l'image brute.
Le focus visible supprimé pour "faire propre"

outline: none sans remplacement casse la navigation au clavier. Le contraste non textuel (SC 1.4.11) s'applique aussi aux indicateurs de focus.

`outline: none` sans anneau de focus alternatif
Anneau de focus personnalisé trop pâle par rapport au fond (souvent sous 3:1)
Focus visible testé uniquement en thème clair, oublié en thème sombre
Aucune vérification du contraste des bordures de champs de formulaire
Les utilisateurs au clavier ou avec un contacteur d'accessibilité perdent totalement le repère visuel de leur position sur la page.

Quel ratio viser pour AA, AAA et le texte large

Texte normal, AA (4,5:1) ou AAA (7:1)

Le critère WCAG 1.4.3 (Contrast Minimum) impose un ratio d'au moins 4,5:1 pour le texte normal au niveau AA. Le niveau AAA, plus strict (critère 1.4.6), monte l'exigence à 7:1. Presque toutes les obligations légales visent le niveau AA (RGAA en France, EN 301 549 en Europe, ADA aux États-Unis). Le niveau AAA reste recommandé, mais il est rarement exigé pour un site entier.

AA (4,5:1) : le plancher légal dans la plupart des réglementations d'accessibilité
AAA (7:1) : recommandé pour les contenus critiques, comme les formulaires de paiement ou les contenus médicaux et juridiques
Un ratio de 21:1 (noir pur sur blanc pur) est le maximum théorique : inutile d'aller au-delà
Un ratio qui paraît correct au premier regard (par exemple 4,2:1) peut échouer au niveau AA de peu : vérifiez toujours le chiffre exact, pas l'impression visuelle
Texte large, où le seuil descend à 3:1 (AA) ou 4,5:1 (AAA)

WCAG définit le « texte large » comme un texte d'au moins 24 px, soit 18 pt. Un texte d'au moins 18,67 px, soit 14 pt, en fait aussi partie s'il est en gras (graisse de 700 ou plus). En dessous de ces seuils, le texte est considéré comme normal, même s'il paraît imposant. FastMinify détermine le seuil applicable à partir de la taille et de la graisse saisies.

≥ 24 px, n'importe quelle graisse : texte large → AA = 3:1, AAA = 4,5:1
≥ 18,67 px ET graisse ≥ 700 (gras) : texte large → mêmes seuils réduits
Un texte de 17 px en gras ne compte PAS comme texte large, un piège fréquent
Un titre H1 de 40 px profite du seuil réduit ; une pastille de 12 px en gras n'en profite jamais
Contraste non textuel (SC 1.4.11), 3:1 pour l'interface

Depuis WCAG 2.1, le critère 1.4.11 (Non-text Contrast) impose un ratio d'au moins 3:1 entre les composants d'interface et leur couleur adjacente. Cela vise les bordures de champs, les cases à cocher, les icônes porteuses de sens et les indicateurs de focus.

Bordure de champ de formulaire sans focus : 3:1 minimum contre le fond de la page
Anneau de focus (outline/box-shadow) : 3:1 minimum contre le fond ET contre l'élément
Icônes purement décoratives (sans information) : non concernées par ce critère
Le vérificateur FastMinify affiche ce verdict séparément : un couple peut réussir en non textuel tout en échouant en texte normal

Comment le ratio de contraste est calculé

La formule WCAG repose sur la luminance relative, pas sur la teinte

Le ratio WCAG 2.x compare la luminance relative des deux couleurs. Cette valeur comprise entre 0 et 1 dérive des composantes RVB linéarisées, pondérées 0.2126 pour le rouge, 0.7152 pour le vert et 0.0722 pour le bleu. L'œil humain perçoit en effet le vert bien plus intensément que le bleu. Le ratio final est (L1 + 0.05) / (L2 + 0.05), où L1 est la luminance de la couleur la plus claire. C'est pourquoi deux couleurs « différentes à l'œil » peuvent donner un ratio proche. À l'inverse, deux teintes d'apparence voisine peuvent avoir des luminances très éloignées.

Avant

color: #999999; background: #ffffff; /* Ratio ≈ 2.85:1 → échec AA (texte normal) */

Après

color: #595959; background: #ffffff; /* Ratio ≈ 7.0:1 → réussite AAA (texte normal) */
Résultat entre 1:1 pour des couleurs identiques et 21:1 pour du noir pur sur du blanc pur
Le vert pèse plus lourd que le bleu dans la formule : un bleu vif sur blanc échoue souvent plus vite qu'un vert de luminosité perçue équivalente
La formule ignore la teinte perçue : seule la luminance compte pour le ratio WCAG classique
FastMinify accepte HEX, RGB, HSL, OKLCH et color() en entrée et les convertit en sRGB avant calcul (via colorjs.io)
APCA, le candidat pour WCAG 3 (aperçu expérimental)

Le ratio WCAG 2.x a une limite connue : il traite « noir sur blanc » et « blanc sur noir » de façon symétrique, ce qui ne correspond pas toujours à la perception réelle. APCA (Advanced Perceptual Contrast Algorithm), pressenti pour WCAG 3, tient compte de la polarité, c'est-à-dire du texte clair sur fond sombre ou l'inverse. Il tient aussi compte de la taille de police, pour un jugement plus fin. FastMinify propose une superposition APCA facultative en complément du ratio WCAG 2.2 officiel, et non en remplacement, puisque WCAG 3 n'est pas encore une norme publiée.

APCA retourne un score "Lc" (Lightness Contrast) plutôt qu'un ratio classique
La polarité (normale ou inversée) influence le score : un même couple de couleurs n'a pas le même Lc selon qui est au premier plan et qui est au fond
À ce jour, seul le ratio WCAG 2.2 (AA et AAA) fait foi pour la conformité légale, qu'il s'agisse du RGAA, d'EN 301 549 ou de l'ADA
Utile pour anticiper une future migration vers WCAG 3, pas pour un audit de conformité actuel

Du couple de couleurs à la palette complète avec le vérificateur de contraste

Vérifier une paire de couleurs

Ouvrez le vérificateur de contraste, collez votre couleur de premier plan et votre couleur de fond dans n'importe quel format CSS (HEX, RGB, HSL, OKLCH, nommée). Le ratio et les niveaux AA, AAA et non textuel se recalculent en direct. Ajustez la taille et la graisse du texte pour voir le seuil « texte large » s'appliquer automatiquement.

1

D'abord, collez les deux couleurs

Premier plan et arrière-plan, dans n'importe quel format CSS valide. Aucune conversion manuelle nécessaire.

2

Ensuite, réglez taille et graisse du texte

16 px/400 par défaut (texte normal). Passez à 24 px ou à 18,67 px en gras pour tester un titre : le seuil « texte large » (3:1/4,5:1) s'applique automatiquement.

3

Enfin, lisez le verdict

Ratio exact, par exemple 4,87:1, niveau AA, AAA, AA grand ou Échec pour le texte, et verdict séparé pour le contraste non textuel (3:1, SC 1.4.11).

Auditer un bouton et son état disabled

Un bouton primaire a souvent trois variantes de couleur (normal, hover, disabled) qu'on oublie de tester individuellement.

Testez le texte du bouton sur le fond « normal » et visez au moins AA (4,5:1)
Testez la même paire sur l'état « hover » : la couleur change souvent, et le ratio aussi
Testez l'état « disabled » séparément. Un ratio faible y est acceptable si l'état est réellement non interactif et annoncé comme tel (aria-disabled)
Vérifiez la bordure du bouton (si elle est visible) contre le fond de la page : c'est du contraste non textuel, avec un seuil de 3:1
Auditer toute une palette d'un coup avec le mode matrice

Plutôt que de tester une à une les combinaisons d'un design system, collez vos couleurs de texte dans Couleurs des lignes et vos couleurs de fond dans Couleurs des colonnes. Saisissez une couleur par ligne, jusqu'à 16 par axe. Le résultat est une grille avec le verdict de chaque croisement, que vous pouvez filtrer par niveau (AAA, AA, AA grand ou Échecs).

Utile pour valider tous les tokens de couleur d'un design system en une seule passe
Filtre par niveau : isolez rapidement les seules combinaisons qui échouent
Détecte les couples « limites » (par exemple 4,4:1, juste sous le seuil AA) qu'une vérification manuelle faite paire après paire laisserait facilement passer
Fonctionne avec les mêmes formats de couleur que le mode Paire (mélange HEX/RGB/HSL possible dans une même liste)
Partager une vérification avec votre équipe

Chaque vérification (couleurs, taille du texte, mode matrice ou paire, options APCA) est encodée dans l'URL. Copiez le lien depuis la barre d'adresse, ou utilisez le bouton Partager ces réglages. Collez-le ensuite dans votre pull request, un ticket ou un message à votre designer. La page se rouvre exactement dans le même état.

Aucune donnée stockée côté serveur : l'état tient entièrement dans les paramètres d'URL
Pratique pour documenter un échec de contraste détecté en revue de code
Le lien reste valide indéfiniment tant que l'outil est en ligne

Faire du contraste un critère de CI plutôt qu'un aller-retour avec le design

Automatiser la détection avec axe-core ou Lighthouse CI

Un vérificateur manuel convient à la conception d'une palette. Pour éviter les régressions, il faut aussi vérifier le contraste automatiquement à chaque pull request. axe-core et Lighthouse CI détectent la plupart des échecs de contraste sur du texte statique. Ils ont plus de mal avec le texte posé sur une image ou un dégradé.

Exemple de base

// axe-core avec Playwright — échoue le test si contraste insuffisant import { test, expect } from '@playwright/test' import AxeBuilder from '@axe-core/playwright' test('pas de régression de contraste', async ({ page }) => { await page.goto('/') const results = await new AxeBuilder({ page }) .withTags(['wcag2aa']) .analyze() const contrastIssues = results.violations.filter( (v) => v.id === 'color-contrast' ) expect(contrastIssues).toEqual([]) })
Vérificateur de contraste FastMinify

Vérification manuelle rapide, sans installation ni donnée envoyée. Le mode matrice, unique parmi ces options, permet d'auditer un design system complet en un seul passage, et l'URL partageable facilite la collaboration entre designers et développeurs. Limite : c'est une vérification manuelle qui ne remplace pas un audit automatisé en CI, et elle ne détecte pas le contraste sur une image ou un dégradé complexe.

DevTools du navigateur (Chrome/Firefox)

L'inspecteur de couleur intégré affiche le ratio de contraste directement sur l'élément sélectionné dans la page réelle, avec les styles calculés, sans outil externe. Limite : un élément à la fois, ce qui devient fastidieux sur une palette complète, sans mode matrice ni partage par lien.

axe-core / Lighthouse CI

Un audit automatisé intégré au pipeline CI détecte systématiquement les régressions de contraste à chaque pull request, et couvre l'accessibilité au-delà du seul contraste. Limite : il ne remplace pas la phase de conception de la palette en amont, et peut produire des faux négatifs sur du texte superposé à une image.

Conclusion

Le contraste de couleur reste l'erreur d'accessibilité la plus fréquente sur le web, et l'une des plus simples à corriger une fois détectée. AA (4,5:1) pour le texte normal et 3:1 pour le texte large et les éléments non textuels sont les deux seuils dont il faut se souvenir avant de valider une palette. Le vérificateur de contraste FastMinify donne le verdict pendant la saisie, en mode paire ou en mode matrice pour tout un design system. Il ne transmet jamais vos couleurs de marque à un serveur. Un audit axe-core en CI évite les régressions, et le reste du hub Couleur & CSS aide à construire une palette cohérente de bout en bout.

Visez AA (4,5:1) en texte normal, et 3:1 en texte large et sur les éléments non textuels comme les bordures, le focus et les icônes
Testez tous les états d'un composant interactif (normal, hover, focus, disabled), y compris l'état par défaut
Utilisez le mode matrice pour valider un design system complet plutôt que couple par couple
Ajoutez axe-core ou Lighthouse CI à votre pipeline pour éviter toute régression de contraste après la mise en production
Le ratio WCAG 2.2 fait foi légalement aujourd'hui : traitez APCA comme un aperçu de l'avenir, pas comme une référence de conformité
Partager cet article
Partager cet article: