- L’ancienne palette de couleurs de Postmark présentait une luminosité perçue très irrégulière selon les couleurs, et il était difficile de prédire les rapports de contraste entre les niveaux ; il fallait donc vérifier manuellement à chaque fois le contraste recommandé par les WCAG
- HSL/HSV sont des modèles issus d’une simple transformation de RGB : ils ne reflètent pas la perception humaine de la luminosité et de la saturation. Ils peuvent servir à choisir une couleur isolée, mais ne conviennent pas à la construction d’un système de couleurs
- CIELAB et LCh sont des espaces colorimétriques perceptuellement uniformes, conçus pour que les variations numériques correspondent davantage aux variations perçues ; ils permettent donc de créer des échelles de couleurs plus cohérentes à luminosité égale
- Accessible Palette est une application qui génère une palette cohérente basée sur LCh, en ajustant la luminosité, les rapports de contraste, la correction de Hue et la prise en compte des couleurs de marque existantes
- Il faut vérifier à la fois les rapports de contraste WCAG 2.1 et l’APCA du Working Draft de WCAG 3, afin de répondre plus facilement aux règles actuelles comme aux futurs changements d’algorithme de contraste
Le problème du système de couleurs de Postmark
- L’ancienne palette de Postmark avait deux problèmes
- La luminosité perçue n’était pas cohérente : les bleus et les rouges semblaient beaucoup plus sombres que les jaunes et les verts, par exemple
- Il était difficile de prédire les rapports de contraste entre les variantes de couleurs, ce qui empêchait de savoir facilement si une paire de couleurs respectait les recommandations WCAG
- À chaque choix d’une paire de couleurs, il fallait vérifier manuellement le rapport de contraste, avec un risque élevé que cette vérification ne soit pas faite en pratique
- La cause venait des limites du modèle de couleur HSL lui-même, ainsi que du manque de prise en charge de meilleures alternatives dans les outils de design
Pourquoi HSL n’est pas adapté aux systèmes de couleurs
- RGB est un modèle qui reflète le fonctionnement des écrans ; ce n’est pas un modèle intuitif pour aider les humains à choisir des couleurs
- HSL et HSV/HSB sont des alternatives créées dans les années 1970 pour représenter RGB d’une manière plus proche de la façon dont les humains pensent les couleurs
- HSL signifie Hue, Saturation, Lightness
- HSV/HSB signifie Hue, Saturation, Value ou Brightness
- À l’époque, les modèles plus sophistiqués étaient coûteux à calculer ; HSL et HSV ont donc sacrifié la précision perceptuelle au profit de la vitesse de calcul
- En conséquence, HSL et HSV ne sont que de simples transformations mathématiques de RGB, et ne reflètent pas correctement la luminosité ou la saturation perçues par les humains
- Par exemple, dans HSL, une échelle de couleurs réglée sur Saturation 100 et Lightness 50 a la même luminosité selon le modèle, mais en réalité le bleu
#00Fparaît beaucoup plus sombre que le jaune#FF0ou le cyan#0FF - Dans HSL, les couleurs à saturation complète sont mappées sur la valeur maximale de RGB et placées sur le cercle des Hue à Lightness 50 ; Lightness 0 et 100 correspondent respectivement au noir et au blanc
- Les variantes plus claires ou plus sombres sont créées comme si l’on “mélangeait” avec du blanc ou du noir
- L’axe vertical central correspond à la plage des couleurs neutres ou grises avec Saturation 0
CIELAB et LCh
- À l’époque où HSL et HSV ont été formalisés, une meilleure alternative existait déjà : l’espace colorimétrique CIELAB
- La Commission internationale de l’éclairage, ou CIE, a défini en 1976 l’espace colorimétrique CIELAB, ou L*a* b*
- CIELAB est un espace colorimétrique perceptuellement uniforme, conçu pour que les variations numériques correspondent à des variations de couleur perçues similaires
- Contrairement à RGB, il est conçu pour couvrir l’ensemble des couleurs visibles
- La composante L*, qui représente la Lightness, est proche de la perception humaine de la luminosité
- CIELAB se compose de trois axes
- La valeur L* définit le noir à 0 et le blanc à 100
- L’axe a* est l’axe d’opposition vert-rouge : les valeurs négatives vont vers le vert, les valeurs positives vers le rouge
- L’axe b* est l’axe d’opposition bleu-jaune : les valeurs négatives vont vers le bleu, les valeurs positives vers le jaune
- CIELCh, LCh ou Lch(ab) est une représentation cylindrique de CIELAB
- Au lieu de a* et b*, elle utilise Chroma et l’angle de Hue
- La Lightness reste inchangée
- L’angle de Hue de LCh ressemble au Hue de HSL, mais il n’est pas identique
- HSL/HSV placent les trois couleurs primaires additives, rouge, vert et bleu, à H=0, 120 et 240°
- LCh place le rouge, le jaune, le vert et le bleu à h=0, 90, 180 et 270°
- Il existe aussi un espace colorimétrique similaire appelé HCL ou LCh(uv), qui, contrairement à LCh(ab), possède une échelle de Chroma uniforme de 0 à 100
Comment créer une échelle de couleurs en LCh
- Contrairement à HSL/HSV, LCh tient dans un cylindre, mais ne remplit pas entièrement ce cylindre
- Certaines combinaisons de Lightness, Chroma et Hue produisent des couleurs impossibles
- Par exemple, un jaune sombre et très saturé n’existe pas
- Sur l’échelle de Lightness, plus on se rapproche du noir et du blanc, moins il existe de couleurs que l’œil humain peut distinguer
- Les écrans réels ne peuvent pas afficher toute la gamme des couleurs visibles
- Le gamut sRGB représente les écrans courants et ne couvre qu’environ ⅓ de l’espace colorimétrique LCh
- En CSS aussi, du moins pour l’instant, on est limité à cette plage
- Si l’on observe avec LCh une échelle de couleurs en HSL avec Saturation 100 et Lightness 50, le jaune est le plus clair et le bleu le plus sombre
- Le vert est presque trois fois plus clair que le bleu, et environ deux fois plus clair que le rouge
- Si l’on reconstruit l’échelle en LCh avec le même niveau de Lightness, la luminosité de chaque couleur devient visuellement cohérente
- La Chroma variant, certaines couleurs peuvent être plus saturées que d’autres
- Dans un système de couleurs, ces différences peuvent être utiles, car on peut vouloir que les couleurs de notification et d’alerte soient plus saturées que les couleurs de texte par défaut
- En harmonisant aussi davantage la Chroma, on peut créer des échelles fluides même dans l’espace sRGB limité
Les limites des outils de design et Accessible Palette
- Aujourd’hui, Figma, Sketch et Adobe XD ne prennent pas en charge CIELAB ni LCh
- Figma dispose des plugins LCH color picker et Chromatic, mais ils n’étaient pas suffisants pour créer un système de couleurs flexible
- L’outil nécessaire devait remplir trois conditions
- Maintenir la cohérence de luminosité lors de la création de variantes de couleurs
- Permettre de contrôler les rapports de contraste entre les niveaux
- Être assez flexible pour accepter les couleurs de marque existantes
- Après avoir découvert la bibliothèque Chroma.js, qui prend bien en charge LCh, un outil simple de génération de nouvelle palette par le code a été créé
- Après un usage interne et un partage avec quelques connaissances, cet outil a été publié sous forme d’application : Accessible Palette
- Accessible Palette est une application permettant de créer des systèmes de couleurs avec une luminosité cohérente et des rapports de contraste prévisibles sur l’ensemble des niveaux de couleur
Fonctionnement d’Accessible Palette
- Lorsque l’on ajuste une couleur de départ ou que l’on colle une couleur issue d’un design existant, l’outil utilise la Chroma et le Hue de cette couleur pour calculer une échelle sur plusieurs niveaux de Lightness
- La Lightness est entièrement personnalisable et peut être utilisée aussi bien pour des palettes claires que sombres
- Elle peut être ajustée finement pour inclure des couleurs de marque existantes
- Chez Postmark, l’objectif était de conserver le jaune
#FFDE00, le bleu#007DCCet le vert#4FC47F, qui étaient les couleurs les plus utilisées dans l’ancienne palette - Les valeurs de Lightness de ces couleurs, 88,6, 75,2 et 50,6, ont été utilisées respectivement comme luminosités des niveaux 200, 400 et 600
- Le rapport de contraste varie selon la Lightness ; pour chaque niveau, il est calculé à la fois avec la méthode recommandée par WCAG 2.1 et avec le nouvel algorithme du Working Draft de WCAG 3.0
- Par défaut, le contraste de toutes les couleurs est mesuré par rapport à un fond blanc
- Il est possible de sélectionner l’échantillon de couleur souhaité pour mesurer le rapport de contraste par rapport à cette couleur
- Les niveaux peuvent être générés avec l’espace colorimétrique RGB ou CIELAB
- Les résultats pouvant varier selon les cas, cela vaut la peine d’expérimenter
- Dans le système de couleurs de Postmark, l’usage de CIELAB a réduit la teinte violette des rouges clairs, mais l’a accentuée dans les bleus
- Certaines couleurs peuvent nécessiter une correction de Hue sur l’ensemble de la plage
- Les jaunes clairs prennent une nuance verdâtre lorsqu’ils s’assombrissent
- Pour les rapprocher légèrement de l’orange, une correction de Hue négative est utilisée
- L’application met à jour l’URL pendant l’utilisation afin d’enregistrer les modifications
- Il est possible de la partager avec l’équipe ou de l’ajouter à une bibliothèque Figma et à un fichier de variables de couleurs CSS pour référence ultérieure
- Parmi les palettes d’exemple figurent des palettes basées sur la nouvelle palette de couleurs Postmark, Material Design de Google et TailwindCSS
- Ces exemples ne reproduisent pas exactement les originaux ; ce sont des alternatives inspirées des couleurs et des niveaux de luminosité d’origine
Calcul des rapports de contraste et WCAG
- Accessible Palette affiche deux rapports de contraste parce que la méthode WCAG 2.1 a des limites
- WCAG 2.1 calcule le rapport de contraste en divisant la luminance de la couleur de premier plan par celle de la couleur d’arrière-plan
- Cette formule fournit une réponse linéaire, mais les humains perçoivent le contraste entre couleurs claires comme plus élevé que le contraste entre couleurs sombres
- Dans des exemples réels, un échantillon respectant les recommandations WCAG 2.1 peut être plus difficile à lire qu’un échantillon affiché avec un rapport de contraste “insuffisant”
- Le W3C est conscient de ce problème, et Andrew Somers a lancé une discussion publique en 2019
- Le nouvel algorithme de travail proposé par Andrew Somers est devenu une partie du Working Draft de WCAG 3, et il a aussi créé l’APCA Contrast Calculator
- APCA signifie Advanced Perceptual Contrast Algorithm ; il est plus précis sur le plan perceptuel et tient aussi compte de la taille et de la graisse de la police
- Accessible Palette utilise APCA et retient un score de 60 comme niveau minimal recommandé pour un texte lisible
- Cela correspond à un seuil similaire à la recommandation historique de rapport de contraste 4.5:1 de WCAG 2.1
- Le rapport de contraste WCAG 2.1 n’est pas totalement inutile
- Il reste assez précis pour les couleurs de milieu de gamme
- Mais, globalement, le nouvel algorithme constitue une nette amélioration
- La méthode WCAG 3 est encore un Working Draft et peut évoluer avec le temps
- Pour respecter les directives actuelles tout en se préparant aux évolutions futures, il est préférable de construire les systèmes de couleurs en gardant les deux lignes directrices à l’esprit
1 commentaires
Avis de Hacker News
Sur les systèmes d’affichage et d’impression courants, il faut considérer que les rouges et les bleus saturés sont en réalité plus sombres que les verts
La formule exacte varie selon l’espace colorimétrique, mais
Grayscale = 0.299R + 0.587G + 0.114Best souvent citée ; dans ce cas, le rouge pur le plus lumineux a une luminosité d’environ 30 %, et le bleu pur de 11 %, si bien que, dans la plupart des cas, rouge clair est presque une contradictionOn peut utiliser ce genre de couleur, mais elle paraîtra forcément toujours sombre ; si appliquer simplement des règles de contraste peut suffire pour l’accessibilité, les techniques abordées dans l’article sont bien plus avantageuses si l’on veut aussi obtenir un rendu agréable
Même lorsqu’on crée des images stéréoscopiques rouge-cyan comme https://en.wikipedia.org/wiki/Anaglyph_3D, les arbres et l’herbe sont verts, mais comme ils comportent en réalité beaucoup de composante rouge, l’équilibre des canaux est bon et le relief comme les couleurs ressortent bien
Référence : https://www.dynamsoft.com/blog/insights/image-processing/ima...
Il était toujours difficile d’expliquer qu’une belle illustration rouge ne serait pas du tout belle à la télévision, surtout si elle était destinée à la diffusion
Même hors diffusion, un rouge hors spécifications pouvait persister plusieurs images plus tard et donner l’impression de baver comme une gorge tranchée
Si vous avez lu les réponses, répondez-moi et j’essaierai d’en clarifier quelques-unes
Cela me dérange depuis longtemps que les exemples qui satisfont effectivement aux critères recommandés WCAG 2.1 soient plus difficiles à lire que ceux dont le ratio de contraste est jugé « insuffisant »
Je me demande pourquoi une formule de « directives d’accessibilité » qui produit plutôt l’effet inverse a été standardisée
C’est vrai pour la 2.1 comme pour la prochaine norme ; dans un domaine aussi influent, j’aimerais que l’industrie finance des recherches plus rigoureuses
Peut-être n’était-ce qu’une demande en ce sens et que cela n’a pas encore été officiellement adopté
Le meilleur article que j’aie vu sur ce sujet est https://www.handprint.com/HP/WCL/color1.html
Il est extrêmement long, donc il faut être prêt à y consacrer une journée
Cela peut surprendre, mais nous utilisons aussi certaines idées de cet article pour joliment colorer les logs dans ClickHouse : https://github.com/ClickHouse/ClickHouse/blob/master/base/ba...
Je me demande si vous pourriez partager les valeurs RGB attendues pour chaque type de message défini dans le code
J’ai rencontré Eugene à la conférence Config de Figma ; il a donné aux designers beaucoup de conseils pratiques similaires, et c’était quelqu’un de vraiment aimable, sincèrement engagé dans le design et l’accessibilité
Ce que je tiens particulièrement à saluer dans cet article, c’est APCA, qui a de bonnes chances de succéder à l’algorithme de contraste des couleurs de WCAG 2
Nous avons aussi utilisé APCA dans la refonte interne de l’accessibilité chez Figma, et le résultat final s’en est trouvé nettement amélioré
Eugene montre bien les cas où WCAG 2 échoue, et dans les faits, nous avons nous aussi rencontré ce genre de cas en permanence
Le conseil essentiel est qu’ajuster correctement les couleurs est vraiment difficile
Les outils aident, mais à un moment donné, il faut faire confiance à ses yeux
Au bout du compte, ces outils ne font qu’approximer mathématiquement la manière dont l’œil perçoit les couleurs ; le critère final, ce n’est pas l’algorithme, mais l’œil humain
Là où un outil ou un algorithme donne un résultat qui ne convient pas, mieux vaut ajuster ou revenir aux fondamentaux
J’aimerais savoir si cela signifie que vous avez utilisé uniquement APCA et ignoré les contenus que l’algorithme de contraste des couleurs WCAG 2 signalait comme insuffisamment contrastés
Beau travail
Je voudrais aussi présenter HCT
C’est un espace colorimétrique créé pour rendre Material You possible, qui combine la mesure de luminosité évoquée ici avec un espace colorimétrique issu de la science moderne de la couleur
LAB/LCH date de 1976
Il rend le design plus intuitif : il suffit de savoir qu’un écart de
Tde 40 satisfait le critère WCAG pour les boutons, et qu’un écart de 50 satisfait le critère pour le texteJe me demande comment HCT se compare à https://www.hsluv.org/comparison/
Comme avec HCT, ici la différence de
Lfacilite le choix de couleurs contrastéesDans le même ordre d’idées, je serais curieux d’avoir des avis sur https://www.myndex.com/APCA/ et sur l’approche à adopter quand cela deviendra un standard
Comme la valeur de contraste entre deux couleurs dépend de celle qui est au premier plan et de celle qui est en arrière-plan, il me semble qu’il ne suffira plus de comparer uniquement l’écart de
TPar exemple, supposons qu’une application ait besoin de rouge, jaune, bleu, orange, vert et violet, soit 6 couleurs correspondant aux 3 couleurs primaires et aux 3 complémentaires
Les teintes exactes importent peu, mais si l’on veut que ces 6 couleurs soient à peu près identifiables tout en ayant une luminosité similaire, et peut-être même une saturation similaire, comment faire ?
Comme le jaune est très clair et le bleu très sombre, il n’y a probablement pas de réponse exacte, et il faudrait parvenir à une approximation
Je me demande s’il existe des outils ou des tutoriels pour apprendre ce genre de choses
Tout ce que j’ai trouvé, c’est le code
material-color-utilitiessur GitHubÀ lire le code, les calculs semblent bien plus complexes que pour OkLab, surtout dans le sens HCT vers RGB
L’article ne se contente pas d’omettre oklab/oklch ; l’affirmation selon laquelle le Web/CSS ne prend en charge que sRGB est également fausse
La fonction CSS
color()prend en charge plusieurs espaces colorimétriquesCet article a été publié il y a 2 ans, et lorsque j’ai commencé à travailler sur l’outil, la spécification OkLCH n’était pas encore sortie
Aujourd’hui, je choisirais OkLCH plutôt que LCH, car il résout certains problèmes de LCH
Ici, « pris en charge » signifie plus précisément « pris en charge sauf par Microsoft Edge (Chromium) et Pale Moon (Goanna) »
https://test.csswg.org/harness/results/css-color-4_dev/group...
Il utilise toutefois le contraste d’APCA, c’est-à-dire de WCAG 3, au lieu de la luminosité : https://github.com/antiflasher/apcach
oklab pourrait être une meilleure alternative à LCh
https://bottosson.github.io/posts/oklab/
Le canal de luminosité est inversé par rapport à tous les autres espaces colorimétriques, et
Ln’a aucun rapport avec leLde LCH ou LABSon succès a aussi, d’une certaine façon, accentué une pauvreté intellectuelle
Le billet de blog initial contient énormément de choses à corriger, et la logique déraille fortement à partir du moment où il commence à revendiquer l’exactitude avec des dégradés utilisant CAM16 UCS
Si les valeurs CIELAB reposent sur des changements perceptifs, je me demande comment cela interagit avec l’accessibilité
Faut-il s’inquiéter du fait que ce type de formule perceptuelle ait probablement été établi sur la base d’une vision standard ?
Je me demande aussi si cela peut varier selon les types de déficience de la vision des couleurs, ou si ce n’est pas vraiment le sujet
J’essaie de rendre mes graphiques aussi accessibles que possible, mais je n’ai jamais rien appris sur la couleur, donc je ne fais que suivre des conseils sans pouvoir les déduire moi-même
Il est donc tout à fait possible que la question soit stupide
Le contraste varie de façon non linéaire
Les simulations sont assez faciles à appliquer, et celles de Machado et al. ne sont rien d’autre que des transformations matricielles
L’article place l’explication plus bas, mais APCA Contrast, le test de contraste lisible du brouillon de standard WCAG 3, est beaucoup plus équitable pour certaines couleurs que le ratio de contraste de WCAG 2.1
Un bon article pour lire la théorie des couleurs derrière le contraste perceptuel : https://www.smashingmagazine.com/2022/09/realities-myths-con...
Un article qui explique APCA de façon concise : https://typefully.com/u/DanHollick/t/sle13GMW2Brp
Avant de l’utiliser pour quoi que ce soit, mieux vaut examiner cette partie en détail et déterminer si vous pouvez vraiment vous en servir
Où est le code ?
Il faut un algorithme utilisable non pas dans un formulaire web, mais dans n’importe quel logiciel.
Je l’ai essayée moi-même et elle fonctionnait bien.
https://github.com/gka/chroma.js
Oklab a été présenté dans [2], et le code de cet article est vraiment facile à utiliser.
[1]: https://news.ycombinator.com/item?id=37310534
[2]: https://bottosson.github.io/posts/oklab/