Vous ne pouvez pas prendre une valeur de couleur existante et lui appliquer un canal alpha. À savoir, vous ne pouvez pas prendre une valeur hexadécimale existante telle que #f0f0f0
, lui donner un composant alpha et utiliser la valeur résultante avec une autre propriété.
Cependant, les propriétés personnalisées vous permettent de convertir votre valeur hexadécimale en un triplet RVB à utiliser avec rgba()
, de stocker cette valeur dans la propriété personnalisée (y compris les virgules!), De remplacer cette valeur en utilisant var()
dans une rgba()
fonction avec la valeur alpha souhaitée, et cela il suffit de travailler:
:root {
/* #f0f0f0 in decimal RGB */
--color: 240, 240, 240;
}
body {
color: #000;
background-color: #000;
}
#element {
background-color: rgba(var(--color), 0.8);
}
<p id="element">If you can see this, your browser supports custom properties.</p>
Cela semble presque trop beau pour être vrai. 1 Comment ça marche?
La magie réside dans le fait que les valeurs des propriétés personnalisées sont substituées telles quelles lors du remplacement des var()
références dans une valeur de propriété, avant que la valeur de cette propriété ne soit calculée. Cela signifie qu'en ce qui concerne les propriétés personnalisées, la valeur de --color
dans votre exemple n'est pas du tout une valeur de couleur jusqu'à ce qu'une var(--color)
expression apparaisse quelque part qui attend une valeur de couleur (et uniquement dans ce contexte). À partir de la section 2.1 de la spécification des variables css:
La syntaxe autorisée pour les propriétés personnalisées est extrêmement permissive. La production de la <declaration-value> correspond à n'importe quelle séquence d'un ou plusieurs jetons, tant que la séquence ne contient pas <bad-string-token>, <bad-url-token>, unmatched <) - token>, <] - token>, ou <} - token>, ou des jetons <semicolon-token> de niveau supérieur ou des jetons <delim-token> avec une valeur de "!".
Par exemple, ce qui suit est une propriété personnalisée valide:
--foo: if(x > 5) this.width = 10;
Bien que cette valeur soit évidemment inutile en tant que variable, car elle ne serait pas valide dans n'importe quelle propriété normale, elle pourrait être lue et utilisée par JavaScript.
Et section 3 :
Si une propriété contient une ou plusieurs fonctions var () et que ces fonctions sont syntaxiquement valides, la grammaire de la propriété entière doit être considérée comme valide au moment de l'analyse. La syntaxe n'est vérifiée qu'au moment de la valeur calculée, après que les fonctions var () ont été remplacées.
Cela signifie que la 240, 240, 240
valeur que vous voyez ci-dessus est directement substituée dans la rgba()
fonction avant que la déclaration ne soit calculée. Donc ça:
#element {
background-color: rgba(var(--color), 0.8);
}
qui ne semble pas être un CSS valide au début car rgba()
n'attend pas moins de quatre valeurs numériques séparées par des virgules, devient ceci:
#element {
background-color: rgba(240, 240, 240, 0.8);
}
qui, bien sûr, est parfaitement valide CSS.
Pour aller plus loin, vous pouvez stocker le composant alpha dans sa propre propriété personnalisée:
:root {
--color: 240, 240, 240;
--alpha: 0.8;
}
et remplacez-le, avec le même résultat:
#element {
background-color: rgba(var(--color), var(--alpha));
}
Cela vous permet d'avoir différentes valeurs alpha que vous pouvez échanger à la volée.
1 Eh bien, si vous exécutez l'extrait de code dans un navigateur qui ne prend pas en charge les propriétés personnalisées.