Critères de succès WCAG · Level AA

WCAG 1.4.11 : Contraste des éléments non textuels

WCAG 1.4.11 exige que les composants de l’interface utilisateur et les objets graphiques aient un ratio de contraste d’au moins 3:1 par rapport aux couleurs adjacentes, afin de garantir que les personnes malvoyantes puissent percevoir les contrôles interactifs, les indicateurs de focus et les éléments graphiques significatifs sans technologie d’assistance.

Ce que signifie cette règle

WCAG 1.4.11 Contraste non textuel est un critère de niveau AA introduit dans WCAG 2.1 et reconduit dans WCAG 2.2. Il impose un ratio de contraste minimal de 3:1 entre la présentation visuelle des deux catégories de contenu suivantes et leur(s) couleur(s) adjacente(s) :

  • Composants de l’interface utilisateur (UI) : Les limites visuelles ou indicateurs qui identifient les contrôles interactifs tels que les champs de saisie de texte, cases à cocher, boutons radio, interrupteurs à bascule, menus déroulants et boutons. Cela inclut à la fois le composant lui-même et tout changement d’état visuel (par exemple, survol, focus, sélection, erreur).
  • Objets graphiques : Parties d’icônes, de graphiques, de diagrammes et d’autres images significatives nécessaires à la compréhension du contenu. Chaque partie du graphique qui transmet une information doit respecter le seuil de 3:1 par rapport à sa couleur environnante.

Le ratio de contraste est mesuré entre l’élément de premier plan et la couleur immédiatement adjacente — généralement sa couleur d’arrière-plan, la couleur de sa bordure ou un segment voisin d’un graphique. Le calcul utilise la même formule de luminance relative que celle définie dans WCAG 1.4.3, mais le seuil est de 3:1 plutôt que 4.5:1, car les éléments non textuels peuvent tolérer un contraste légèrement plus faible tout en restant discernables.

Un succès signifie que chaque indicateur visuel qui identifie un composant d’interface ou communique une information dans un graphique atteint au moins un ratio de 3:1. Un échec se produit lorsqu’une bordure, un trait d’icône, un segment de graphique ou un indicateur d’état est en dessous de ce ratio et que le composant ou le graphique ne peut pas être identifié ou compris sans cette information visuelle.

La spécification WCAG définit plusieurs exceptions importantes :

  • Composants inactifs : Les composants d’interface qui sont désactivés et non disponibles pour l’interaction sont exemptés. Un bouton grisé qui ne peut pas être cliqué n’a pas besoin de respecter l’exigence de contraste.
  • Apparence contrôlée par l’agent utilisateur : Les composants dont la présentation visuelle est entièrement contrôlée par le style par défaut du navigateur (non surchargé par le CSS de l’auteur) sont exemptés, car la responsabilité incombe au fournisseur du navigateur.
  • Graphiques essentiels ou décoratifs : Les objets graphiques dont la présentation particulière est essentielle à l’information transmise (par exemple, des drapeaux nationaux représentant des pays) ou qui sont purement décoratifs sont exemptés. Les logos sont également généralement exemptés au titre de cette clause.
  • Texte : Le texte et les images de texte sont déjà couverts par 1.4.3 et 1.4.6 et ne relèvent pas de 1.4.11.

Les indicateurs de focus méritent une attention particulière dans WCAG 2.2. Le critère 2.4.11 (Apparence du focus) ajoute des exigences plus strictes pour la visibilité du focus, mais 1.4.11 s’applique toujours au contraste de tout anneau de focus personnalisé par rapport à son arrière-plan. Un outline ou une ombre portée (box-shadow) personnalisés utilisés comme indicateur de focus doivent atteindre 3:1 par rapport à la couleur adjacente pour satisfaire ce critère de manière indépendante.

Pourquoi c’est important

Environ 2,2 milliards de personnes dans le monde présentent une forme de déficience visuelle, selon l’Organisation mondiale de la santé. Une proportion significative de ces personnes — y compris les quelque 253 millions de personnes vivant avec une perte de vision modérée à sévère — dépendent d’un contraste suffisant pour percevoir et interagir avec les interfaces numériques sans nécessairement utiliser un lecteur d’écran. Les personnes malvoyantes qui naviguent avec un logiciel de grossissement, des modes à contraste élevé ou simplement dans des conditions d’éclairage difficiles font partie de celles qui sont le plus directement affectées par les échecs de 1.4.11.

Considérons un scénario pratique : une personne atteinte de glaucome remplit un formulaire de déclaration d’assurance sur le site web d’un hôpital. Les champs du formulaire utilisent une bordure gris clair (#cccccc) sur un arrière-plan blanc (#ffffff), ce qui donne un ratio de contraste de seulement 1,6:1 — bien en dessous du 3:1 requis. La personne ne peut pas voir où commencent et se terminent les champs de saisie, elle ne peut donc pas cliquer de manière fiable dedans ni comprendre la structure du formulaire. Elle abandonne complètement le formulaire, ce qui a à la fois un coût personnel et crée une responsabilité juridique pour l’établissement.

Au-delà de la déficience visuelle, les handicaps cognitifs peuvent également rendre les composants d’interface à faible contraste plus difficiles à interpréter. Les personnes ayant des troubles de l’attention ou des difficultés de traitement de l’information s’appuient sur une forte différenciation visuelle entre les éléments interactifs et non interactifs pour comprendre rapidement la structure de la page. De même, les personnes ayant des tremblements ou des limitations motrices qui utilisent de grandes cibles de pointeur doivent voir clairement les limites des contrôles pour viser avec précision.

Du point de vue de l’entreprise, respecter 1.4.11 améliore l’ergonomie pour tous les utilisateurs dans des conditions sous-optimales — lumière du soleil sur un écran mobile, moniteurs de faible qualité ou écrans plus anciens avec une mauvaise précision des couleurs. Cela réduit les coûts de support, élargit la portée de l’audience et renforce le SEO de manière indirecte en réduisant les taux de rebond liés à une mauvaise ergonomie. Pour les organisations soumises à des obligations légales en matière d’accessibilité, ne pas respecter ce critère au niveau AA constitue un risque direct de non-conformité.

Règles Axe-core associées

  • color-contrast (couverture partielle) : La règle color-contrast d’axe-core cible principalement le contraste du texte au titre de WCAG 1.4.3, mais elle effectue également des vérifications partielles pour les éléments non textuels dans certains contextes. Axe signale des composants d’interface comme les boutons et les contrôles de formulaire lorsqu’il peut déterminer de manière programmatique que la limite visuelle ou l’arrière-plan du composant ne respecte pas le ratio 3:1. Cependant, la couverture de la règle est explicitement marquée comme partielle pour 1.4.11, car de nombreux échecs de contraste pour les éléments non textuels sont invisibles pour l’analyse automatisée. Par exemple, le contraste du trait d’une icône SVG par rapport à son arrière-plan, ou la bordure d’une case à cocher personnalisée stylisée avec des pseudo-éléments CSS, ne peut pas être extrait de manière fiable du DOM sans contexte de rendu. Le style calculé d’une bordure CSS peut être présent dans l’arbre d’accessibilité, mais l’arrière-plan adjacent — en particulier lorsqu’il s’agit d’un dégradé, d’une image ou d’un élément superposé — n’est pas toujours calculable de manière programmatique. C’est pourquoi axe signale des violations de 1.4.11 sous la règle color-contrast avec la mention needs review dans de nombreux cas, ce qui signifie que l’outil a détecté un problème potentiel mais qu’une personne doit le confirmer en inspectant visuellement l’élément et en utilisant un outil d’analyse de contraste des couleurs pour échantillonner les pixels réellement rendus.

Parce que les outils automatisés ne peuvent détecter qu’une fraction des échecs de contraste non textuel, les tests manuels sont essentiels. Des outils comme Colour Contrast Analyser (TPGi), les sélecteurs de couleur des DevTools des navigateurs ou l’outil Accessible Colors doivent être utilisés pour échantillonner directement les couleurs de premier plan et d’arrière-plan à partir de l’interface rendue. Les analyses automatisées doivent être considérées comme un premier passage, et non comme un audit exhaustif.

Comment tester

  1. Exécuter une analyse automatisée avec axe DevTools ou Lighthouse : Installez l’extension de navigateur axe DevTools et exécutez une analyse de page complète. Dans le panneau de résultats, filtrez les problèmes étiquetés WCAG 1.4.11 ou examinez toute violation de color-contrast. Notez les éléments marqués comme Needs Review dans la catégorie contraste non textuel — ils nécessitent un suivi manuel. Dans Lighthouse (Outils de développement Chrome > onglet Lighthouse), exécutez un audit Accessibilité et examinez les résultats liés au contraste, en gardant à l’esprit que la couverture de Lighthouse est également partielle pour les éléments non textuels.
  2. Inspection manuelle avec un analyseur de contraste des couleurs : Téléchargez et ouvrez l’application de bureau TPGi Colour Contrast Analyser. Utilisez son outil pipette pour échantillonner la couleur de premier plan de chaque limite de composant d’interface (par exemple, la bordure d’un champ de texte, le trait d’une icône, le remplissage d’une barre de graphique), puis échantillonnez la couleur d’arrière-plan adjacente. L’outil affichera le ratio de contraste calculé. Tout ratio inférieur à 3:1 est un échec. Parcourez systématiquement tous les contrôles de formulaire interactifs, les boutons composés uniquement d’icônes, les indicateurs de focus et les visualisations de données.
  3. Navigation au clavier et test des indicateurs de focus : Parcourez toute la page en utilisant uniquement le clavier avec la touche Tab. Pour chaque élément interactif qui reçoit le focus, vérifiez que l’indicateur de focus (anneau, contour ou changement d’arrière-plan) est visible. Utilisez l’analyseur de contraste pour confirmer que la couleur de l’indicateur de focus atteint 3:1 par rapport à l’arrière-plan de l’élément. Testez avec NVDA + Firefox et JAWS + Chrome pour confirmer que l’élément reçoit le focus dans l’ordre attendu et que l’indicateur visuel n’est pas supprimé par un CSS outline: none sans remplacement équivalent.
  4. Tester en modes à contraste élevé et en modes de couleurs forcées : Sous Windows, activez le mode Contraste élevé (Paramètres > Options d’ergonomie > Contraste élevé) et rechargez la page. Dans les navigateurs basés sur Chromium, ouvrez DevTools, allez dans Rendering et activez l’option Emulate CSS media feature forced-colors: active. Vérifiez que les limites des composants d’interface restent visibles. Bien que la conformité au mode couleurs forcées ne soit pas strictement requise par 1.4.11, les tests dans ce mode révèlent les éléments qui reposent uniquement sur des indices de couleur à faible contraste.
  5. Vérifier les objets graphiques dans leur contexte : Pour chaque graphique, icône, diagramme ou image informationnelle, identifiez chaque segment ou tracé qui transmet une signification. Utilisez l’outil pipette pour échantillonner les couleurs adjacentes à l’intérieur du graphique lui-même (par exemple, deux segments voisins d’un diagramme circulaire) et par rapport à l’arrière-plan de la page environnante. Chaque partie distincte qui communique une information doit individuellement atteindre 3:1.
  6. Vérifier tous les états des composants : Les éléments interactifs ont plusieurs états — par défaut, survol, focus, actif, sélectionné, coché, erreur et succès. Testez chaque état séparément. La bordure d’un bouton qui est conforme dans son état par défaut peut échouer dans son état de survol si la couleur change pour une variante à faible contraste.

Comment corriger

Bordure de champ de formulaire — Incorrect

<!-- Échec : bordure gris clair (#cccccc) sur blanc (#ffffff) = ratio 1.6:1 -->
<style>
  .form-input {
    border: 1px solid #cccccc;
    background-color: #ffffff;
    padding: 8px 12px;
  }
</style>
<label for='email'>Email Address</label>
<input type='email' id='email' class='form-input' />

Bordure de champ de formulaire — Correct

<!-- Succès : bordure plus foncée (#767676) sur blanc (#ffffff) = ratio 4.54:1, supérieur à 3:1 -->
<style>
  .form-input {
    border: 1px solid #767676; /* Assombrie pour obtenir un contraste suffisant */
    background-color: #ffffff;
    padding: 8px 12px;
  }
  .form-input:focus {
    outline: 3px solid #005fcc; /* Anneau de focus à 5.9:1 sur blanc */
    outline-offset: 2px;
  }
</style>
<label for='email'>Email Address</label>
<input type='email' id='email' class='form-input' />

Bouton icône seule — Incorrect

<!-- Échec : icône gris clair (#aaaaaa) sur blanc (#ffffff) = ratio 2.32:1 -->
<style>
  .icon-btn { background: none; border: none; color: #aaaaaa; }
</style>
<button class='icon-btn' aria-label='Delete item'>
  <svg aria-hidden='true' focusable='false' width='24' height='24'>
    <path d='M3 6h18M8 6V4h8v2M19 6l-1 14H6L5 6' stroke='currentColor' stroke-width='2' fill='none'/>
  </svg>
</button>

Bouton icône seule — Correct

<!-- Succès : icône foncée (#595959) sur blanc (#ffffff) = ratio 7:1, bien au-dessus de 3:1 -->
<style>
  .icon-btn { background: none; border: none; color: #595959; cursor: pointer; }
  .icon-btn:focus-visible {
    outline: 3px solid #005fcc;
    outline-offset: 2px;
    border-radius: 4px;
  }
</style>
<button class='icon-btn' aria-label='Delete item'>
  <svg aria-hidden='true' focusable='false' width='24' height='24'>
    <!-- Un trait plus foncé garantit que la forme de l’icône est perceptible -->
    <path d='M3 6h18M8 6V4h8v2M19 6l-1 14H6L5 6' stroke='currentColor' stroke-width='2' fill='none'/>
  </svg>
</button>

Case à cocher personnalisée — Incorrect

<!-- Échec : la case à cocher personnalisée utilise une bordure claire (#d0d0d0) sur fond blanc -->
<style>
  .custom-checkbox-box {
    width: 18px; height: 18px;
    border: 2px solid #d0d0d0; /* Ratio 1.3:1 sur blanc — échec */
    border-radius: 3px;
    display: inline-block;
  }
</style>
<label>
  <input type='checkbox' style='position:absolute;opacity:0;width:0;height:0' />
  <span class='custom-checkbox-box'></span>
  I agree to the terms
</label>

Case à cocher personnalisée — Correct

<!-- Succès : bordure (#5a5a5a) sur blanc = 7.2:1. La coche de l’état coché utilise également un contraste suffisant -->
<style>
  .custom-checkbox-input {
    position: absolute; opacity: 0; width: 0; height: 0;
  }
  .custom-checkbox-box {
    width: 18px; height: 18px;
    border: 2px solid #5a5a5a; /* Contraste suffisant sur fond blanc */
    border-radius: 3px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background-color: #ffffff;
  }
  .custom-checkbox-input:checked + .custom-checkbox-box {
    background-color: #005fcc; /* Remplissage bleu à l’état coché */
    border-color: #005fcc;
  }
  .custom-checkbox-input:checked + .custom-checkbox-box::after {
    content: '';
    display: block;
    width: 10px; height: 6px;
    border-left: 2px solid #ffffff; /* Coche blanche sur bleu = 5.9:1 */
    border-bottom: 2px solid #ffffff;
    transform: rotate(-45deg) translateY(-2px);
  }
  .custom-checkbox-input:focus-visible + .custom-checkbox-box {
    outline: 3px solid #005fcc;
    outline-offset: 2px;
  }
</style>
<label class='custom-label'>
  <input type='checkbox' class='custom-checkbox-input' />
  <span class='custom-checkbox-box' aria-hidden='true'></span>
  I agree to the terms
</label>

Graphique de données — Incorrect

<!-- Échec : deux segments adjacents d’un diagramme circulaire utilisent des teintes claires similaires avec un contraste <3:1 -->
<svg viewBox='0 0 200 200' aria-label='Market share chart' role='img'>
  <!-- Segment A : #f5c6cb (rose clair) adjacent au segment B : #ffeeba (jaune clair) -->
  <!-- Le ratio de contraste entre ces deux couleurs est d’environ 1.1:1 — échec -->
  <path d='M100,100 L100,10 A90,90 0 0,1 190,100 Z' fill='#f5c6cb' />
  <path d='M100,100 L190,100 A90,90 0 0,1 100,190 Z' fill='#ffeeba' />
</svg>

Graphique de données — Correct

<!-- Succès : utiliser des remplissages de segments à fort contraste OU ajouter une bordure visible entre les segments -->
<svg viewBox='0 0 200 200' aria-label='Market share chart: Segment A 50%, Segment B 25%' role='img'>
  <!-- Option 1 : utiliser un trait sombre entre les segments pour les séparer à 3:1 par rapport aux deux remplissages -->
  <path d='M100,100 L100,10 A90,90 0 0,1 190,100 Z' fill='#d63384' stroke='#ffffff' stroke-width='2' />
  <path d='M100,100 L190,100 A90,90 0 0,1 100,190 Z' fill='#0d6efd' stroke='#ffffff' stroke-width='2' />
  <!-- Le trait blanc (#ffffff) sépare les deux segments ; chaque remplissage a également 3:1 par rapport au fond blanc -->
</svg>

Erreurs courantes

  • Utiliser une bordure d’un seul pixel qui respecte 3:1 mais devient invisible à faible DPI : Même une couleur conforme peut devenir imperceptible si la bordure ne fait qu’1 px de large sur un écran à faible résolution. Utilisez border: 2px solid ou une ombre portée visible en plus d’une couleur conforme pour garantir que la limite est physiquement perceptible.
  • Supposer que l’arrière-plan est toujours blanc : Lorsqu’un champ de formulaire ou une icône apparaît à l’intérieur d’une carte ou d’une barre latérale avec un arrière-plan gris clair (#f5f5f5), le contraste doit être mesuré par rapport à ce gris, et non par rapport au blanc. Une bordure qui est conforme sur blanc peut échouer sur un arrière-plan teinté.
  • Supprimer le contour de focus par défaut avec outline: none sans fournir d’équivalent : C’est l’un des échecs 1.4.11 les plus courants. Définir :focus { outline: none; } globalement détruit la visibilité du focus pour les utilisateurs de clavier. Remplacez-le toujours par un style de focus personnalisé qui atteint au moins 3:1 par rapport à son arrière-plan.
  • Considérer l’état désactivé comme une excuse pour ignorer tous les contrôles de contraste : Les composants désactivés sont exemptés, mais les développeurs marquent parfois des éléments comme visuellement désactivés via un style à faible contraste sans réellement ajouter l’attribut disabled ou aria-disabled='true'. Un élément qui semble désactivé mais reste interactif doit toujours respecter 1.4.11.
  • Se fier uniquement à la couleur pour différencier les segments d’un graphique sans trait de séparation : Deux segments adjacents d’un graphique dont le seul différenciateur est la teinte (par exemple, bleu clair vs vert clair) peuvent échouer si leur ratio de contraste est inférieur à 3:1. Ajouter un trait de séparation blanc ou sombre de 2 px entre les segments est une solution fiable.
  • Appliquer des corrections de contraste uniquement à l’état par défaut et oublier les états survol, focus, erreur et succès : Chaque état interactif a sa propre présentation visuelle. La bordure d’un bouton qui est conforme à l’état par défaut peut passer à une couleur à faible contraste au survol. Tous les états doivent être testés indépendamment.
  • Intégrer des icônes comme images d’arrière-plan et se fier à la propriété CSS color pour le contraste : Les icônes SVG intégrées dans le HTML répondent à color et currentColor, mais les icônes utilisées comme background-image CSS ne peuvent pas être recolorées via CSS. Si le fichier image de l’icône lui-même a un contraste insuffisant, aucun correctif CSS ne peut résoudre le problème sans remplacer la ressource.
  • Oublier que le texte d’espace réservé (placeholder) dans les champs de saisie n’est pas couvert par 1.4.11 mais reste réglementé : Le texte d’espace réservé relève de 1.4.3 (contraste du texte à 4.5:1), et non de 1.4.11. Les développeurs appliquent parfois par erreur le seuil de 3:1 au texte d’espace réservé, créant ainsi un échec distinct et inaperçu de 1.4.3.
  • Utiliser des transitions CSS qui animent un passage par une couleur non conforme : Un élément peut animer d’une couleur conforme à une autre couleur conforme en passant par une couleur intermédiaire non conforme. Même si les états de départ et d’arrivée sont conformes, le composant visuel est techniquement non conforme pendant la transition. Utilisez les media queries prefers-reduced-motion de manière réfléchie et évitez de faire passer les transitions par des états à faible contraste.
  • Ignorer les barres de progression, les curseurs de plage (range) et les interrupteurs à bascule : Ces composants d’interface personnalisés sont fréquemment stylisés sans tenir compte de 1.4.11. La partie remplie d’une barre de progression doit avoir un contraste de 3:1 par rapport à sa piste ; le bouton d’un interrupteur doit contraster avec l’arrière-plan de l’interrupteur ; le curseur d’un input de type range doit contraster avec la piste.

Lien avec la réglementation d’accessibilité de la Turquie

La Circulaire présidentielle n° 2025/10 de la Turquie, publiée au Journal officiel n° 32933 le 21 juin 2025, établit des exigences obligatoires en matière d’accessibilité web et mobile pour un large éventail d’entités publiques et privées opérant en Turquie. La Circulaire adopte WCAG 2.2 comme norme technique normative, et la conformité de niveau AA est le seuil requis pour la conformité.

WCAG 1.4.11 Contraste non textuel, en tant que critère de niveau AA, est donc directement exécutoire au titre de la Circulaire. Les organisations soumises à la réglementation doivent s’assurer que toutes les limites des composants d’interface, les états des contrôles interactifs et les objets graphiques significatifs sur leurs propriétés numériques respectent l’exigence de contraste non textuel de 3:1.

Les entités couvertes par la Circulaire présidentielle 2025/10 comprennent les institutions et agences publiques à tous les niveaux de gouvernement, les plateformes de commerce électronique, les banques et institutions financières, les hôpitaux et prestataires de santé privés, les opérateurs de télécommunications comptant 200 000 abonnés ou plus, les agences de voyage, les entreprises de transport privé et les écoles privées autorisées par le ministère de l’Éducation nationale (MoNE). Pour ces organisations, le fait de ne pas mettre en œuvre 1.4.11 n’est pas simplement un manquement aux bonnes pratiques, mais une non-conformité réglementaire.

Le Logo d’accessibilité (Erişilebilirlik Logosu), délivré par le ministère de la Famille et des Services sociaux, sert de marque de certification visible au public pour les services numériques conformes. Pour obtenir et afficher ce logo, une organisation doit démontrer une conformité complète au niveau AA pour tous les critères WCAG 2.2 applicables, y compris 1.4.11. Étant donné que de nombreux portails turcs de e-gouvernement, interfaces bancaires et formulaires de santé utilisent largement des contrôles de formulaire personnalisés et des visualisations de données, le contraste non textuel est un critère que les auditeurs sont particulièrement susceptibles d’évaluer lors du processus de certification.

Les organisations utilisant le widget de surcouche Accsible doivent savoir que la technologie de surcouche peut aider à remédier à certains ajustements de contraste à l’exécution — par exemple en permettant aux utilisateurs d’activer un thème à contraste élevé — mais que les échecs structurels persistants, comme un champ de formulaire rendu avec une bordure à 1,6:1 de contraste, doivent être corrigés au niveau du code source pour atteindre une conformité réelle et pouvoir prétendre à l’Erişilebilirlik Logosu. Combiner des corrections au niveau du code source avec les fonctionnalités d’amélioration orientées utilisateur d’un widget d’accessibilité représente la posture de conformité la plus défendable au regard du droit turc.