Estoy diseñando una aplicación en electrón, así que tengo acceso a las variables CSS. He definido una variable de color en vars.css
:
:root {
--color: #f0f0f0;
}
Quiero usar este color main.css
, pero con algo de opacidad aplicada:
#element {
background: (somehow use var(--color) at some opacity);
}
¿Cómo haría para hacer esto? No estoy usando ningún preprocesador, solo CSS. Preferiría una respuesta totalmente CSS, pero aceptaré JavaScript / jQuery.
No puedo usar opacity
porque estoy usando una imagen de fondo que no debería ser transparente.
css
colors
css-variables
JoshyRobot
fuente
fuente
Respuestas:
No puede tomar un valor de color existente y aplicarle un canal alfa. Es decir, no puede tomar un valor hexadecimal existente como
#f0f0f0
darle un componente alfa y usar el valor resultante con otra propiedad.Sin embargo, las propiedades personalizadas le permiten convertir su valor hexadecimal en un triplete RGB para usarlo
rgba()
, almacenar ese valor en la propiedad personalizada (¡incluidas las comas!), Sustituir ese valor usandovar()
unargba()
función con su valor alfa deseado, y solo trabajo:Esto parece casi demasiado bueno para ser verdad. 1 ¿Cómo funciona?
La magia radica en el hecho de que los valores de las propiedades personalizadas se sustituyen tal como están al reemplazar las
var()
referencias en un valor de propiedad, antes de que se calcule el valor de esa propiedad. Esto significa que, en lo que respecta a las propiedades personalizadas, el valor de--color
en su ejemplo no es un valor de color en absoluto hastavar(--color)
que aparezca una expresión en algún lugar que espera un valor de color (y solo en ese contexto). De la sección 2.1 de la especificación de variables css:Y sección 3 :
Esto significa que el
240, 240, 240
valor que ve arriba se sustituye directamente en largba()
función antes de que se calcule la declaración. Así que esto:que no parece ser CSS válido al principio porque
rgba()
espera no menos de cuatro valores numéricos separados por comas, se convierte en esto:que, por supuesto, es CSS perfectamente válido.
Dando un paso más, puede almacenar el componente alfa en su propia propiedad personalizada:
y sustitúyalo, con el mismo resultado:
Esto le permite tener diferentes valores alfa que puede intercambiar sobre la marcha.
1 Bueno, lo es, si está ejecutando el fragmento de código en un navegador que no admite propiedades personalizadas.
fuente
.element2 { background-color: rgba(var(--red), var(--low-opacity); }
. De esta manera, puede utilizar completamente el uso de variables :)."240, 240, 240"
no es editable con un selector de color. Esa es una gran falta cuando necesitas encontrar los colores correctos para tu GUI.var(--hex-color)99
se convierte en dos tokens#333333 99
(observe el espacio para separar los tokens) que obviamente no es lo que desea. Las propiedades personalizadas se definieron originalmente para copiar tokens, no cadenas, y este es el resultado final. Es demasiado tarde para arreglar esto ahora.Sé que el OP no está utilizando un preprocesador, pero me habría ayudado si la siguiente información fuera parte de la respuesta aquí (no puedo comentar todavía, de lo contrario habría comentado la respuesta de @BoltClock.
Si está utilizando, por ejemplo, scss, la respuesta anterior fallará, porque scss intenta compilar los estilos con una función rgba () / hsla () específica de scss, que requiere 4 parámetros. Sin embargo, rgba () / hsla () también son funciones css nativas, por lo que puede usar la interpolación de cadenas para omitir la función scss.
Ejemplo (válido en sass 3.5.0+):
Tenga en cuenta que la interpolación de cadenas no funcionará para funciones scss que no sean CSS, como
lighten()
porque el código resultante no sería CSS funcional. Sin embargo, seguiría siendo válido scss, por lo que no recibiría ningún error en la compilación.fuente
@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
es sinónimo desdergb
hace bastante tiempo. Por lo tanto, se le permite soltar la "a".RGB
) que luego sass ignora. Por ejemplo:color: RGB(var(--color_rgb), 0.5);
. De GitHub:root { @each $color, $value in $colors { --#{$color}_rgb: #{red($value), green($value), blue($value)}; } }
Yo estaba en una situación similar, pero por desgracia las soluciones dadas no funcionó para mí, ya que las variables podrían ser cualquier cosa de
rgb
ahsl
ahex
o incluso nombres de colores.Resolví este problema ahora, aplicando el
background-color
y elopacity
a un pseudo:after
o:before
elemento:Es posible que sea necesario cambiar un poco los estilos, según el elemento al que se debe aplicar el fondo.
También podría no funcionar para todas las situaciones, pero es de esperar que ayude en algunos casos, donde las otras soluciones no se pueden usar.
Editar: Acabo de notar que esta solución obviamente también afecta el color del texto, ya que crea un elemento delante del elemento de destino y le aplica un color de fondo transparente.
Esto podría ser un problema en algunos casos.
fuente
rgb
oHSL
), sino que también evita cualquier conflicto entre las funciones de color CSS nativas y las funciones de color de Sass. Vea la respuesta de SimplyPhy a continuación.:before
para obtener el orden correcto de apilamiento sin jugarz-index
.De hecho, esto es posible con CSS . Está un poco sucio y tendrás que usar gradientes. He codificado un pequeño fragmento como ejemplo, tenga en cuenta que para fondos oscuros, debe usar la opacidad negra, como para los claros:
fuente
donde reemplazas la opacidad con cualquier cosa entre 0 y 1
fuente
rgba(var(--color), opacity)
bit. Especialmente porque el valor de su propiedad personalizada es la notación rgb () completa. Pero también por la palabra clave "opacidad".SCSS / SASS
Ventaja: puede usar valores de color Hex, en su lugar, usar los 8 bits para cada canal (0-255).
Así es como lo hice con la idea inicial de: https://codyhouse.co/blog/post/how-to-combine-sass-color-functions-and-css-variables
Editar: También puede modificar la función alfa para usar
#{$color-name}-rgb
y omitir las variables CSS * -r, * -g, * -b generadas.Resultado
Uso:
Mixin y funciones
Esperemos que esto ahorre algo de tiempo a alguien.
fuente
Puede establecer una variable / valor específico para cada color: el original y el que tiene opacidad:
Si no puede usar esto y está de acuerdo con la solución de JavaScript, puede usar esta:
fuente
Para usar rgba () con la variable css general, intente esto:
fuente
En CSS deberías poder usar los valores rgba:
o simplemente establece la opacidad:
fuente
Si amas los colores hexadecimales como yo, hay otra solución. El valor hexadecimal es de 6 dígitos después de eso es el valor alfa. 00 es 100% de transparencia 99 es aproximadamente 75%, luego usa el alfabeto 'a1-af' y luego 'b1-bf' que termina con 'ff' que es 100% opaco.
fuente