Le contraste des couleurs expliqué : ratios WCAG, texte lisible et formats de couleur
Un texte se lit bien quand il se détache de son fond, et les Règles pour l’accessibilité des contenus Web (WCAG) en font un nombre : le rapport de contraste. WCAG 2.2, la version en vigueur, est une Recommandation du W3C depuis le 12 décembre 2024. Ce guide explique comment ce rapport se calcule, les seuils pour le texte et pour les commandes, et le lien avec les façons courantes d’écrire une couleur.
Comment se calcule le contraste
Chaque couleur est convertie en luminance relative, de 0 pour le noir à 1 pour le blanc. Les valeurs de rouge, de vert et de bleu sont d’abord ramenées à une intensité lumineuse, car les valeurs sRGB ne sont pas proportionnelles à la lumière : une valeur inférieure ou égale à 0,04045 (sur une échelle de 0 à 1) est divisée par 12,92, et les valeurs plus hautes suivent une courbe en puissance 2,4. Puis elles sont pondérées selon la luminosité que l’œil leur prête : 0,2126 pour le rouge, 0,7152 pour le vert et 0,0722 pour le bleu. Avant mai 2021, le seuil s’écrivait 0,03928 ; le W3C précise que le changement n’a pas d’effet pratique.
Le rapport vaut (L1 + 0,05) ÷ (L2 + 0,05), L1 étant la couleur la plus claire. Il va de 1:1 pour deux couleurs identiques à 21:1 pour du noir sur du blanc. Il ne s’arrondit jamais : l’explication officielle des WCAG indique que 4,499:1 n’atteint pas 4,5:1, ce qui explique que des outils arrondissant à une décimale puissent afficher une réussite qui n’en est pas une.
Les seuils
Les WCAG ont trois niveaux, A, AA et AAA ; AA est le niveau visé par la plupart des politiques et des audits d’accessibilité. Trois critères de succès fixent des minimums de contraste :
| Critère | S’applique à | Minimum | Niveau |
|---|---|---|---|
| 1.4.3 Contraste (minimum) | Texte normal | 4,5:1 | AA |
| 1.4.3 Contraste (minimum) | Grand texte | 3:1 | AA |
| 1.4.6 Contraste (amélioré) | Texte normal | 7:1 | AAA |
| 1.4.6 Contraste (amélioré) | Grand texte | 4,5:1 | AAA |
| 1.4.11 Contraste du contenu non textuel | Commandes, indicateurs de focus, icônes et éléments de graphiques | 3:1 | AA |
Le grand texte, c’est au moins 18 points, ou 14 points en gras, soit environ 24 et 18,5 pixels CSS selon le W3C. Le texte d’un logo, le texte purement décoratif et celui des commandes désactivées n’ont pas d’exigence de contraste. Le contraste non textuel couvre ce qu’il faut voir pour utiliser une page : le contour d’un champ, une case à cocher, l’indicateur de focus, une icône sans libellé, les traits d’un graphique.
Quelles couleurs passent sur du blanc
Rapports sur fond blanc, tronqués à deux décimales comme les affiche le vérificateur :
| Texte / fond | Contraste | Ce qui est conforme |
|---|---|---|
| #000000 / #ffffff | 21:1 | Le maximum : tout est conforme |
| #0000ff / #ffffff | 8,59:1 | Conforme AAA pour tout le texte |
| #595959 / #ffffff | 7:1 | Tout juste AAA pour le texte normal |
| #767676 / #ffffff | 4,54:1 | Conforme AA pour le texte normal |
| #777777 / #ffffff | 4,47:1 | Non conforme AA pour le texte normal ; grand texte et graphismes seulement |
| #ff0000 / #ffffff | 3,99:1 | Grand texte et graphismes seulement |
| #949494 / #ffffff | 3,03:1 | Grand texte et graphismes seulement |
| #959595 / #ffffff | 2,99:1 | Rien n’est conforme, ni bordures ni icônes |
| #ffff00 / #ffffff | 1,07:1 | Presque invisible |
#777777 et #767676 paraissent identiques, et pourtant l’une échoue et l’autre passe : la limite est aussi fine. Le rouge pur, fréquent pour les erreurs, n’atteint que 3,99:1 sur du blanc, assez pour une icône ou du grand texte mais pas pour un message d’erreur en texte normal ; un rouge un peu plus sombre comme #ee0000 atteint 4,53:1.
Pourquoi 4,5:1
Le W3C explique que 4,5:1 compense la perte de sensibilité au contraste qui accompagne en général une vision d’environ 20/40, fréquente avec l’âge, et 7:1 celle d’une vision d’environ 20/80. Un bon contraste aide aussi tous les autres : un téléphone en plein soleil, un écran bas de gamme, un projecteur dans une salle éclairée.
Les formats de couleur et ce qu’ils disent du contraste
#1a73e8, rgb(26 115 232), hsl(214 82% 51%) et oklch(57.4% 0.195 257.9) sont le même bleu écrit de quatre façons. HEX et RGB donnent directement les quantités de rouge, de vert et de bleu ; HEX peut ajouter une quatrième paire pour la transparence, comme #1a73e880 pour 50 %. HSL décrit teinte, saturation et luminosité, mais cette luminosité n’est pas celle que voit l’œil : le jaune et le bleu à 50 % de luminosité HSL ont 96,8 % et 45,2 % de luminosité OKLCH, d’où un texte bleu conforme sur blanc et un texte jaune qui ne l’est pas.
OKLCH, issu de CSS Color niveau 4, est conçu pour que des pas égaux de luminosité paraissent égaux, ce qui en fait le format le plus utile pour construire une palette au contraste prévisible. Les navigateurs le prennent en charge depuis Chrome et Edge 111, Firefox 113 et Safari 15.4, et il est Baseline largement disponible depuis novembre 2025. Le contraste se calcule toujours sur la couleur sRGB réellement affichée : vérifiez donc la paire finale avec un vérificateur.
Corriger une couleur qui échoue
- Gardez la teinte et changez la luminosité : assombrissez le texte ou éclaircissez le fond jusqu’à ce que le rapport passe. Le vérificateur propose la couleur conforme la plus proche dans la même teinte.
- Vérifiez tous les états : survol, liens visités, textes d’exemple sur lesquels vous comptez, boutons désactivés qui doivent rester visibles, et le mode sombre, soumis aux mêmes exigences.
- Mesurez un texte posé sur une image ou un dégradé contre la zone la plus claire derrière lui, ou placez-le sur un fond uni.
- Ne comptez pas sur la couleur seule : le critère 1.4.1 des WCAG 2.2 demande un autre indice, comme le soulignement des liens ou une icône et un mot pour les erreurs.
Au-delà des WCAG 2
Les brouillons des WCAG 3 ont testé une autre méthode de contraste, souvent appelée APCA, qui tient compte de la taille et de la graisse des caractères et traite différemment le texte clair sur fond sombre. C’est un brouillon, pas une norme : les audits et les lois utilisent toujours le rapport des WCAG 2. Dans l’Union européenne, l’Acte européen sur l’accessibilité (directive 2019/882) s’applique depuis le 28 juin 2025 à de nombreux produits et services, dont le commerce en ligne.
Questions fréquentes
4,47:1, est-ce assez proche de 4,5:1 ?
Non. Le rapport ne s’arrondit pas : 4,47:1 n’atteint pas le minimum de 4,5:1 pour le texte normal. Il respecte en revanche 3:1 pour le grand texte et les graphismes.
Qu’est-ce qu’un grand texte ?
Au moins 18 points, environ 24 pixels CSS, ou 14 points en gras, environ 18,5 pixels CSS.
Les bordures et les icônes doivent-elles être contrastées ?
Oui, quand elles sont nécessaires pour comprendre ou utiliser la page : 3:1 face aux couleurs voisines. Le contour d’un champ, une case à cocher et l’indicateur de focus en sont des exemples.
Le mode sombre change-t-il les règles ?
Non. Les mêmes rapports valent pour tous les thèmes : vérifiez aussi la palette sombre.
Plus de contraste, c’est toujours mieux ?
Jusqu’à un certain point. Un contraste très élevé, comme du blanc pur sur du noir pur, peut paraître agressif à certains lecteurs ; à partir de 7:1, la lecture est confortable pour la plupart des textes.
Références
- W3C — Web Content Accessibility Guidelines (WCAG) 2.2, W3C Recommendation, 12 December 2024
- W3C WAI — Understanding Success Criterion 1.4.3: Contrast (Minimum)
- W3C WAI — Understanding Success Criterion 1.4.11: Non-text Contrast
- W3C — CSS Color Module Level 4
- Web platform features explorer — oklab() and oklch()
- Directive (EU) 2019/882 on the accessibility requirements for products and services (European Accessibility Act)
Guides associés
- Les adresses IP expliquées : IPv4, IPv6 et les plages réservées
- Les sous-réseaux et le CIDR expliqués : préfixes, masques et hôtes utilisables
- Les enregistrements DNS expliqués : A, AAAA, CNAME, MX, TXT et NS
- Un site est-il en panne, ou est-ce chez vous ? Comment vérifier, étape par étape
- Codes de statut HTTP et erreurs Cloudflare : ce que signifient 403, 404, 429, 500, 503 et 521
- Les timestamps Unix et les fuseaux horaires expliqués
- Compter les dates : jours entre deux dates, années bissextiles et semaines ISO
- Fuseaux horaires et heure d’été : réunions entre villes
- Les formats d’image expliqués : JPEG, PNG, WebP, AVIF et HEIC
- La taille d’une image expliquée : pixels, DPI, poids et qualité
- Les photos de téléphone expliquées : HEIC, métadonnées EXIF et vie privée
- La robustesse des mots de passe expliquée : longueur, entropie et phrases de passe
- Le hachage expliqué : SHA-256, sommes de contrôle et mots de passe
- Les JSON Web Tokens expliqués : revendications, signatures, validation sûre
- Les clés API expliquées : longueur, format, stockage et rotation
- Les UUID expliqués : v4, v7 et comment choisir la bonne version
- Les QR codes expliqués : capacité, correction d’erreurs et taille d’impression
- Les pourcentages et la TVA expliqués : ajouter, retirer et cumuler
- Erreurs JSON courantes et comment les corriger
- Les fichiers CSV expliqués : séparateurs, guillemets, encodage et Excel
- Les encodages de texte expliqués : UTF-8, Base64 et encodage d’URL
- Expressions régulières : classes, quantificateurs et groupes
- Mo ou Mio, Mbit/s ou Mo/s : tailles de fichiers et débits
- Expressions cron : champs, pas et fuseaux horaires
- Paramètres UTM : étiqueter des liens pour l’analyse d’audience
- Seuil de rentabilité, marge et ROAS : les chiffres d’une petite entreprise
- Tarifs freelance expliqués : taux horaire, TJM et heures facturables
- Modifier des PDF dans le navigateur : ce que la fusion, la division et la conversion conservent