Les couleurs relatives en CSS đš
Je ne sais pas vous, mais une chose qui mâa toujours frustrĂ© en tant que dĂ©veloppeur front-end, câest de devoir manipuler des couleurs.
Appliquer une opacitĂ©, ajuster une teinte ou modifier la luminositĂ© dâune couleur selon un contexte donnĂ© a toujours Ă©tĂ© un exercice dĂ©licat. đ
Pendant trĂšs longtemps, lâunique solution consistait Ă utiliser un prĂ©processeur tel que Sass, proposant diverses fonctions liĂ©es aux couleurs (darken(), lighten(), etc.).
Puis, lâarrivĂ©e des propriĂ©tĂ©s personnalisĂ©es a marquĂ© un tournant majeur dans la conception des interfaces web.
NĂ©anmoins, manipuler une couleur restait encore et toujours un processus laborieux⊠et ce, jusquâĂ lâarrivĂ©e des couleurs relatives, introduites par le CSS Color Module Level 5 du W3CâŻ! đ
Mais, avant dâentrer dans le vif du sujet, je vous propose de faire un bref retour en arriĂšre sur la façon de manipuler une couleur, Ă une Ă©poque, pas si lointaine, afin de mieux apprĂ©hender les problĂ©matiques qui y sont liĂ©es. đ
Section intitulĂ©e le-monde-d-avantLe monde dâavant đŠ
Commençons par dĂ©finir la couleur principale de notre thĂšme Ă lâaide dâune propriĂ©tĂ© personnalisĂ©e, laquelle est dĂ©finie globalement via la pseudo-classe :root :
:root {
--brand-color: #e23e57;
}
Utilisons maintenant cette propriĂ©tĂ© personnalisĂ©e pour modifier la couleur de fond dâun bouton :
.button {
background-color: var(--brand-color);
}
Jusquâici tout va bienâŻ! đ
Nous souhaitons dĂ©sormais changer lâapparence de notre bouton lorsquâil est survolĂ© par un pointeur (Ă©tat :hover).
Une bonne pratique est dâajuster la luminositĂ© de la couleur de fond du bouton afin de la rendre plus sombre :
Afin de corser lâexercice, la couleur de fond du bouton survolĂ© doit ĂȘtre relative Ă sa couleur de fond courante (il nâest donc pas question dâajouter arbitrairement une nouvelle couleur de fond spĂ©cifique Ă lâĂ©tat :hover).
Vous me voyez venirâŻ? Oui, les problĂšmes commencent maintenantâŻ! đ
Section intitulée problematiquesProblématiques
Afin de rĂ©pondre Ă cette problĂ©matique, une des solutions consiste Ă utiliser lâespace colorimĂ©trique hsl(), puis, Ă dĂ©finir chaque composante de cette couleur (teinte, saturation et luminositĂ©) au sein dâune propriĂ©tĂ© personnalisĂ©e dĂ©diĂ©e, comme ceci :
:root {
--brand-color-hue: 351deg;
--brand-color-saturation: 74%;
--brand-color-lightness: 56%;
}
Nous pouvons alors modifier la composante de luminosité de la couleur de fond de notre bouton, indépendamment de ses deux autres composantes (teinte et saturation) :
.button {
background-color: hsl(
var(--brand-color-hue)
var(--brand-color-saturation)
var(--brand-color-lightness)
);
&:hover {
--brand-color-lightness: 41%;
}
}
Oui, maisâŠ
Cette approche prĂ©sente plusieurs inconvĂ©nients : â ïž
- Nous sommes dépendants de la notation fonctionnelle
hsl()âŻ; - La composante de luminositĂ© a Ă©tĂ© fixĂ©e arbitrairement Ă 41% (-15%), sans tenir compte de sa valeur initiale dĂ©finie Ă 56%âŻ;
- Plus gĂ©nĂ©ralement, la complexitĂ© du code augmente significativement. Imaginez un projet comportant une dizaine de couleurs et des composants dâinterface ayant plusieurs variations (bouton primaire, secondaire, etc.). Nous devrons gĂ©rer chaque composante de couleur sĂ©parĂ©ment, et ce, pour chaque couleur et chaque variation de composant dâinterface. đ
Heureusement, il existe une solution beaucoup plus simpleâŻ! đ
Section intitulĂ©e bienvenue-aux-couleurs-relativesBienvenue aux couleurs relatives đ€
DĂ©finissons dâabord ce quâest une couleur relative :
Une couleur relative est une couleur basĂ©e sur une couleur existante. đ€Ż
Je sens la dĂ©ception dans votre regardâŠ
Section intitulée syntaxeSyntaxe
La syntaxe pour définir une couleur relative est assez simple :
color-function(from origin-color channel1 channel2 channel3 / alpha)
Plongeons un peu plus dans les détails :
color-function()est la notation fonctionnelle utilisĂ©e pour manipuler les couleurs, commergb(),hsl(),hwb(), etc.âŻ;origin-colorest, comme son nom lâindique, la couleur dâorigine, elle doit ĂȘtre prĂ©cĂ©dĂ©e du mot-clĂ©from. La couleur relative se basera sur cette couleurâŻ;chanel1,chanel2etchanel3correspondent aux composantes de la couleur de sortie. Ces composantes sont liĂ©es Ă la notation fonctionnellecolor-function()utilisĂ©e pour la couleur relativeâŻ;alphaest une valeur optionnelle qui reprĂ©sente le canal alpha (opacitĂ©) de la couleur.
Voici un premier exemple pour illustrer ça :
.button {
background-color: rgb(from red r g b);
}
Dans cet exemple, notre couleur relative est définie avec la notation fonctionnelle rgb().
Les valeurs des composantes de sortie doivent donc suivre cet espace colorimétrique.
La couleur dâorigine est, quant Ă elle, dĂ©finie par le mot-clĂ© red.
Il est intĂ©ressant de noter que la couleur dâorigine est nommĂ©e, alors que les composantes de la couleur de sortie suivent lâespace colorimĂ©trique rgb().
En rĂ©alitĂ©, le navigateur convertit la couleur dâorigine dans lâespace colorimĂ©trique spĂ©cifiĂ© pour la couleur relative.
Enfin, les composantes de notre couleur de sortie restent inchangĂ©es (r g b) et sont donc identiques Ă celles de la couleur dâorigine :
- La valeur de la composante rouge
rde notre couleur de sortie est Ă©gale Ă 255âŻ; - La valeur de la composante verte
gde notre couleur de sortie est Ă©gale Ă 0âŻ; - La valeur de la composante bleue
bde notre couleur de sortie est égale à 0.
Le code CSS précédent est équivalent à celui-ci :
.button {
background-color: red;
}
Oui, tout ça pour ça. đ
Section intitulée quelques-exemples-interessantsQuelques exemples intéressants
Maintenant que vous avez saisi le principe, jouons au jeu des diffĂ©rences (indice, il y en a 2 đ) :
.button {
background-color: rgb(from red b g r);
}
Cette fois-ci, les composantes r et b de notre couleur de sortie ont été inversées (le filou).
Oui, il est possible de permuter (et mĂȘme de rĂ©pĂ©ter) les composantes de la couleur de sortie.
Ă votre avis, quelle sera la couleur de fond du boutonâŠâŻ? đ„
Un indice, lâexemple prĂ©cĂ©dent est Ă©quivalent Ă :
.button {
background-color: rgb(from rgb(255 0 0) b g r);
}
Ou encore :
.button {
background-color: rgb(0 0 255);
}
Soit :
.button {
background-color: blue;
}
Et oui, la couleur de fond du bouton sera donc bleueâŻ!
Amusons-nous maintenant Ă modifier la valeur dâune des composantes de notre couleur de sortie :
.button {
background-color: rgb(from red r g 255);
}
Cette fois-ci, nous avons défini la valeur de la composante bleue b de notre couleur de sortie à 255.
Ce code CSS est donc équivalent à :
.button {
background-color: rgb(255 0 255);
}
Soit du rouge pourpre⊠du magenta pour les puristes, ou du violet pour moi đ :
.button {
background-color: magenta;
}
Ou encore (lĂ , câest juste pour mon plaisir personnel) :
.button {
background-color: rgb(from red r g r);
}
Câest magique, nonâŻ? đ§
Section intitulée utilisation-des-proprietes-personnaliseesUtilisation des propriétés personnalisées
Comme nous lâavons mentionnĂ© prĂ©cĂ©demment, il est possible dâutiliser un espace colorimĂ©trique diffĂ©rent entre la couleur dâorigine et les composantes de la couleur de sortie.
Mais ce nâest pas tout, la couleur dâorigine peut Ă©galement ĂȘtre stockĂ©e dans une propriĂ©tĂ© personnalisĂ©e, ou ĂȘtre spĂ©cifiĂ©e Ă lâaide du mot-clĂ© currentcolor.
Pour reprendre notre tout premier exemple, cette écriture est donc tout à fait envisageable :
:root {
--brand-color: #e23e57;
}
.button {
background-color: hsl(from var(--brand-color) h s 41%);
}
Nous avons modifiĂ© la valeur de la composante de luminositĂ© de la couleur de sortie, dĂ©finie dans un espace colorimĂ©trique hsl(), Ă partir de sa couleur dâorigine, en notation hexadĂ©cimale, elle-mĂȘme stockĂ©e dans une propriĂ©tĂ© personnalisĂ©e. đ€Ż
Oui, ça commence Ă ĂȘtre intĂ©ressant, mais le meilleur est Ă venirâŻ! đ
Section intitulée utilisation-de-la-fonction-code-calc-codeUtilisation de la fonction calc()
Une fonctionnalitĂ© vraiment pratique serait de pouvoir modifier les valeurs des composantes de notre couleur de sortie, en se basant sur leurs valeurs initiales, quâen pensez-vousâŻ?
Bonne nouvelle, cette fonctionnalitĂ© est rendue possible grĂące Ă la fonction calc()âŻ! đ
Imaginons maintenant que nous souhaitions diminuer la valeur de la composante de luminositĂ© de 15%, par rapport Ă celle de notre couleur dâorigineâŻ?
Câest maintenant possible en une seule dĂ©claration CSS :
.button {
background-color: hsl(from var(--brand-color) h s calc(l - 15));
}
Et oui, tout simplement. đ
Notre tout premier exemple peut donc se simplifier de cette façon.
Avant :
:root {
--brand-color-hue: 351deg;
--brand-color-saturation: 74%;
--brand-color-lightness: 56%;
}
.button {
background-color: hsl(
var(--brand-color-hue)
var(--brand-color-saturation)
var(--brand-color-lightness)
);
&:hover {
--brand-color-lightness: 41%;
}
}
AprĂšs :
:root {
--brand-color: #e23e57;
}
.button {
background-color: var(--brand-color);
&:hover {
background-color: hsl(from var(--brand-color) h s calc(l - 15));
}
}
Nous avons résolu nos trois problématiques de départ, à savoir :
- Nous sommes libres dâutiliser nâimporte quel espace colorimĂ©trique pour dĂ©finir nos couleursâŻ;
- Il est dĂ©sormais possible de modifier la valeur dâune composante de la couleur de sortie en se basant sur sa valeur initiale Ă lâaide de la fonction
calc()âŻ; - Le code CSS est beaucoup plus simple et facile Ă maintenir.
Section intitulée bonus-un-bouton-a-plusieurs-variationsBonus : Un bouton à plusieurs variations�
En apportant quelques modifications Ă notre exemple prĂ©cĂ©dent, il est mĂȘme possible, en quelques lignes, dâajouter des variations Ă notre bouton đ€© :
.button--primary {
--button-bg: #e23e57;
}
.button--secondary {
--button-bg: #48a6a7;
}
.button--tertiary {
--button-bg: #7f55b1;
}
.button {
background-color: var(--button-bg);
&:hover {
background-color: hsl(from var(--button-bg) h s calc(l - 15));
}
}
Section intitulée support-navigateurSupport navigateur
Une bonne nouvelle nâarrive jamais seule : Le support navigateur est trĂšs correct.
Cette fonctionnalitĂ© est supportĂ©e par les derniĂšres versions de Chrome, Firefox, Edge, Safari et Opera, raison de plus de lâadopter dĂšs maintenantâŻ! đ„ł
Section intitulée le-mot-de-la-finLe mot de la fin
Bref, vous lâaurez compris, les couleurs relatives font parties des fonctionnalitĂ©s que jâattendais depuis de nombreuses annĂ©es.
Elles rĂ©pondent parfaitement Ă mes besoins (gestion de thĂšmes personnalisĂ©s, manipulation de couleurs, etc.), et je pourrais difficilement mâen passer aujourdâhui.
JâespĂšre, en tout cas, que cela vous incitera Ă les essayer dans vos futurs projetsâŻ! đ
Commentaires et discussions
Ces clients ont profité de notre expertise
Dans le cadre du renouveau de sa stratĂ©gie digitale, Orpi France a fait appel Ă JoliCode afin de diriger la refonte du site Web orpi.com et lâintĂ©gration de nombreux nouveaux services. Pour effectuer cette migration, nous nous sommes appuyĂ©s sur une architecture en microservices Ă lâaide de PHP, Symfony, RabbitMQ, Elasticsearch et Docker.
LâĂ©quipe dâAlain Afflelou a choisi JoliCode comme rĂ©fĂ©rent technique pour le dĂ©veloppement de son nouveau site internet. Ce site web-to-store incarne lâimage premium de lâenseigne, met en valeur les collections et offre aux clients de nouvelles expĂ©riences et fonctionnalitĂ©s telles que lâe-rĂ©servation, le store locator, le click & collect et lâessayageâŠ
Refonte complĂšte de la plateforme dâannonces immobiliĂšres de Cushman & Wakefield France. ConnectĂ© aux outils historiques, cette nouvelle vitrine permet une bien meilleure visibilitĂ© SEO et permet la mise en avant dâactifs qui ne pouvaient pas lâĂȘtre auparavant.