Je conçois une application en électron, j'ai donc accès aux variables CSS. J'ai défini une variable de couleur dans vars.css
:
:root {
--color: #f0f0f0;
}
Je souhaite utiliser cette couleur dans main.css
, mais avec une certaine opacité appliquée:
#element {
background: (somehow use var(--color) at some opacity);
}
Comment pourrais-je procéder? Je n'utilise aucun préprocesseur, seulement CSS. Je préférerais une réponse entièrement CSS, mais j'accepterai JavaScript / jQuery.
Je ne peux pas utiliser opacity
car j'utilise une image d'arrière-plan qui ne doit pas être transparente.
css
colors
css-variables
JoshyRobot
la source
la source
Réponses:
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 utilisantvar()
dans unergba()
fonction avec la valeur alpha souhaitée, et cela il suffit de travailler: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'unevar(--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:Et section 3 :
Cela signifie que la
240, 240, 240
valeur que vous voyez ci-dessus est directement substituée dans largba()
fonction avant que la déclaration ne soit calculée. Donc ça: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: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:
et remplacez-le, avec le même résultat:
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.
la source
.element2 { background-color: rgba(var(--red), var(--low-opacity); }
. De cette façon, vous pouvez utiliser pleinement l'utilisation des variables :)."240, 240, 240"
n'est pas modifiable avec un sélecteur de couleur. C'est un énorme manque lorsque vous devez trouver les bonnes couleurs pour votre interface graphique.var(--hex-color)99
est convertie en deux jetons#333333 99
(notez l'espace pour séparer les jetons) ce qui n'est évidemment pas ce que vous voulez. Les propriétés personnalisées ont été initialement définies pour copier des jetons, pas des chaînes et c'est le résultat final. Il est bien trop tard pour résoudre ce problème maintenant.Je sais que l'OP n'utilise pas de préprocesseur, mais j'aurais été aidé si les informations suivantes faisaient partie de la réponse ici (je ne peux pas encore commenter, sinon j'aurais commenté la réponse @BoltClock.
Si vous utilisez, par exemple, scss, la réponse ci-dessus échouera, car scss tente de compiler les styles avec une fonction rgba () / hsla () spécifique à scss, qui nécessite 4 paramètres. Cependant, rgba () / hsla () sont également des fonctions css natives, vous pouvez donc utiliser l'interpolation de chaîne pour contourner la fonction scss.
Exemple (valide dans sass 3.5.0+):
Notez que l'interpolation de chaîne ne fonctionnera pas pour les fonctions scss non-CSS, par exemple
lighten()
, parce que le code résultant ne serait pas un CSS fonctionnel. Ce serait toujours un scss valide, vous ne recevrez donc aucune erreur de compilation.la source
@function rgb($args...) { @return #{'rgb(#{$args})'}; }
@function rgba($args...) { @return #{'rgba(#{$args})'}; }
@function hsl($args...) { @return #{'hsl(#{$args})'}; }
@function hsla($args...) { @return #{'hsla(#{$args})'}; }
`` ``rgba
est un synonyme dergb
depuis un certain temps maintenant .. Vous êtes donc autorisé à supprimer le "a".RGB
) qui sont ensuite ignorées par sass. Par exemple:color: RGB(var(--color_rgb), 0.5);
. De GitHub:root { @each $color, $value in $colors { --#{$color}_rgb: #{red($value), green($value), blue($value)}; } }
J'étais dans une situation similaire, mais malheureusement , les solutions données ne fonctionne pas pour moi, car les variables pourraient être quelque chose de
rgb
àhsl
àhex
ou même des noms de couleur.J'ai résolu ce problème maintenant, en appliquant le
background-color
et leopacity
à un pseudo:after
ou un:before
élément:Les styles devront peut-être être légèrement modifiés, en fonction de l'élément auquel l'arrière-plan doit être appliqué.
De plus, cela peut ne pas fonctionner pour toutes les situations, mais j'espère que cela aide dans certains cas, où les autres solutions ne peuvent pas être utilisées.
Edit: Je viens de remarquer que cette solution a évidemment également un impact sur la couleur du texte, car elle crée un élément devant l'élément cible et lui applique une couleur d'arrière-plan transparente.
Cela peut être un problème dans certains cas.
la source
rgb
ouHSL
) mais évite également tout conflit entre les fonctions de couleur CSS natives et les fonctions de couleur de Sass. Voir la réponse de SimplyPhy ci-dessous.:before
pour obtenir le bon ordre d'empilement sans jouer avecz-index
.C'est en effet possible avec CSS . C'est juste un peu sale et vous devrez utiliser des dégradés. J'ai codé un petit extrait de code à titre d'exemple, notez que pour les arrière-plans sombres, vous devez utiliser l'opacité noire, comme pour la lumière - les blancs .:
la source
où vous remplacez l'opacité par quelque chose entre 0 et 1
la source
rgba(var(--color), opacity)
bit. Surtout que la valeur de votre propriété personnalisée est la notation rgb () entière. Mais aussi à cause du mot-clé "opacity".SCSS / SASS
Avantage: vous pouvez simplement utiliser des valeurs de couleur hexadécimales, au lieu d'utiliser le 8 bits pour chaque canal (0-255).
C'est ainsi que je l'ai fait avec l'idée initiale de: https://codyhouse.co/blog/post/how-to-combine-sass-color-functions-and-css-variables
Edit: Vous pouvez également modifier la fonction alpha pour simplement utiliser
#{$color-name}-rgb
et omettre les variables CSS générées * -r, * -g, * -b.Résultat
Usage:
Mixin et fonctions
Espérons que cela fera gagner du temps à quelqu'un.
la source
Vous pouvez définir une variable / valeur spécifique pour chaque couleur - l'original et celle avec l'opacité:
Si vous ne pouvez pas utiliser ceci et que vous êtes d'accord avec la solution javascript, vous pouvez utiliser celle-ci:
la source
Pour utiliser rgba () avec la variable css générale, essayez ceci:
la source
En CSS, vous devriez pouvoir utiliser les valeurs rgba:
ou définissez simplement l'opacité:
la source
Si vous aimez les couleurs hexadécimales comme moi, il existe une autre solution. La valeur hexadécimale est de 6 chiffres après la valeur alpha. 00 est une transparence de 100% 99 est d'environ 75% puis il utilise l'alphabet 'a1-af' puis 'b1-bf' se terminant par 'ff' qui est 100% opaque.
la source