Vous ne pouvez pas prendre une couleur existante de valeur et appliquer une couche alpha. À savoir, vous ne pouvez pas prendre un hex de valeur tels que l' #f0f0f0
, donner un composant alpha et l'utilisation de la valeur de la propriété.
Cependant, les propriétés personnalisées vous permettent de convertir votre valeur hexadécimale en RVB, triplet pour une utilisation avec des rgba()
, stocker cette valeur dans la propriété personnalisée (y compris les virgules!), substituer cette valeur à l'aide d' var()
en rgba()
de la fonction désirée de la valeur alpha, et il va tout simplement de travail:
:root {
/* #f0f0f0 in decimal RGB */
--color: 240, 240, 240;
}
body {
color: #000;
background-color: #000;
}
#element {
background-color: rgba(var(--color), 0.5);
}
<p id="element">If you can see this, your browser supports custom properties.</p>
Cela semble presque trop beau pour être vrai.1 Comment cela fonctionne?
La magie réside dans le fait que les valeurs de propriétés personnalisées sont substitués comme lors du remplacement d' var()
des références en la valeur d'une propriété, avant que la valeur de la propriété est calculée. Cela signifie que dans la mesure où les propriétés personnalisées sont concernés, la valeur de --color
dans votre exemple n'est pas une couleur de la valeur à tous jusqu'à ce qu' un var(--color)
expression apparaît quelque part qui attend une valeur de couleur (et seulement dans ce contexte). De l'article 2.1 de la css-variables spec:
Le permis de syntaxe pour les propriétés personnalisées est très permissive. L' <déclaration de valeur> production correspond à toute séquence de un ou plusieurs jetons, tant que la séquence ne contient pas de <mauvais-chaîne-token>, <mauvais-url-token>, une <)-token>, <]-token>, ou <}>, ou de niveau supérieur <point-virgule-token> jetons ou <delim-token> jetons avec une valeur de "!".
Pour exemple, le code suivant est valide propriété personnalisée:
--foo: if(x > 5) this.width = 10;
Alors que cette valeur est évidemment inutile comme une variable, comme il serait invalide dans une propriété, il peut être lu et traité par JavaScript.
Et l'article 3:
Si une propriété contient un ou plusieurs (var) de fonctions, et ces fonctions sont syntaxiquement valide, l'ensemble de la propriété de la grammaire doit être supposé pour être valide au moment de l'analyse. C'est seulement la syntaxe vérifié au calculée valeur de temps après (var) fonctions ont été substituées.
Cela signifie que l' 240, 240, 240
de la valeur que vous voyez ci-dessus se substituer directement dans l' rgba()
fonction avant la déclaration est calculée. Donc ceci:
#element {
background-color: rgba(var(--color), 0.5);
}
ce qui ne semble pas être valide CSS au premier abord car rgba()
attend pas moins de quatre séparée par des virgules des valeurs numériques, devient:
#element {
background-color: rgba(240, 240, 240, 0.5);
}
ce qui, bien sûr, est parfaitement valide CSS.
En prenant une étape supplémentaire, vous pouvez stocker la composante alpha dans sa propre propriété personnalisée:
:root {
--color: 240, 240, 240;
--alpha: 0.5;
}
et de le remplacer, 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.
1eh Bien, c'est, si vous êtes en cours d'exécution du fragment de code dans un navigateur qui ne prend pas en charge les propriétés personnalisées.