Como estou projetando um aplicativo em elétrons, tenho acesso a variáveis CSS. Eu defini uma variável de cor em vars.css
:
:root {
--color: #f0f0f0;
}
Quero usar essa cor main.css
, mas com alguma opacidade aplicada:
#element {
background: (somehow use var(--color) at some opacity);
}
Como eu faria isso? Não estou usando nenhum pré-processador, apenas CSS. Eu preferiria uma resposta totalmente CSS, mas aceitarei JavaScript / jQuery.
Não posso usar opacity
porque estou usando uma imagem de plano de fundo que não deve ser transparente.
css
colors
css-variables
JoshyRobot
fonte
fonte
Respostas:
Você não pode pegar um valor de cor existente e aplicar um canal alfa a ele. Nomeadamente, você não pode
#f0f0f0
usar um valor hexadecimal existente, como fornecer um componente alfa e usar o valor resultante com outra propriedade.No entanto, as propriedades personalizadas permitem converter seu valor hexadecimal em um trigêmeo RGB para uso
rgba()
, armazenar esse valor na propriedade personalizada (incluindo vírgulas!), Substituir esse valor usandovar()
em umargba()
função com o valor alfa desejado e ele apenas trabalhe:Isso parece bom demais para ser verdade. 1 Como isso funciona?
A mágica está no fato de que os valores das propriedades customizadas são substituídos como na substituição de
var()
referências em um valor de propriedade, antes que o valor dessa propriedade seja calculado. Isso significa que, no que diz respeito às propriedades personalizadas, o valor do--color
seu exemplo não é um valor de cor até que umavar(--color)
expressão apareça em algum lugar que espere um valor de cor (e somente nesse contexto). Na seção 2.1 da especificação de variáveis css:E seção 3 :
Isso significa que o
240, 240, 240
valor que você vê acima é substituído diretamente nargba()
função antes que a declaração seja computada. Então, é isso:que não parece ser CSS válido no início porque
rgba()
espera não menos que quatro valores numéricos separados por vírgula, torna-se o seguinte:que, é claro, é CSS perfeitamente válido.
Indo um passo adiante, você pode armazenar o componente alfa em sua própria propriedade customizada:
e substitua-o, com o mesmo resultado:
Isso permite que você tenha valores alfa diferentes que podem ser trocados on-the-fly.
1 Bem, é verdade, se você estiver executando o snippet de código em um navegador que não suporta propriedades personalizadas.
fonte
.element2 { background-color: rgba(var(--red), var(--low-opacity); }
. Dessa forma, você pode utilizar totalmente o uso de variáveis :)."240, 240, 240"
não é editável com um seletor de cores. É uma falta enorme quando você precisa encontrar as cores certas para sua GUI.var(--hex-color)99
é convertida em dois tokens#333333 99
(observe o espaço para separar os tokens), o que obviamente não é o que você deseja. As propriedades personalizadas foram originalmente definidas para copiar tokens, não seqüências de caracteres, e este é o resultado final. É muito tarde para consertar isso agora.Sei que o OP não está usando um pré-processador, mas teria sido ajudado se as seguintes informações fizessem parte da resposta aqui (ainda não posso comentar, caso contrário, teria comentado a resposta do @BoltClock.
Se você estiver usando, por exemplo, scss, a resposta acima falhará, porque o scss tenta compilar os estilos com uma função rgba () / hsla () específica do scss, que requer 4 parâmetros. No entanto, rgba () / hsla () também são funções nativas de css, portanto, você pode usar a interpolação de strings para ignorar a função scss.
Exemplo (válido no sass 3.5.0+):
Observe que a interpolação de string não funcionará para funções scss não CSS, como
lighten()
, porque o código resultante não seria CSS funcional. No entanto, ainda seria um scss válido, portanto você não receberá nenhum erro na compilação.fonte
@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
é sinônimo de já faz umrgb
bom tempo. Portanto, você pode largar o "a".RGB
) que é ignorado pelo sass. Por exemplo:color: RGB(var(--color_rgb), 0.5);
. De GitHub:root { @each $color, $value in $colors { --#{$color}_rgb: #{red($value), green($value), blue($value)}; } }
Eu estava em uma situação semelhante, mas, infelizmente, as soluções dadas não funcionou para mim, como as variáveis poderia ser qualquer coisa, desde
rgb
quehsl
ahex
ou mesmo nomes de cores.Resolvi esse problema agora, aplicando oe
background-color
oopacity
a um pseudo:after
ou:before
elemento:Os estilos podem precisar ser alterados um pouco, dependendo do elemento ao qual o plano de fundo deve ser aplicado.
Também pode não funcionar para todas as situações, mas espero que ajude em alguns casos, onde as outras soluções não podem ser usadas.
Edit: Acabei de notar que essa solução obviamente também afeta a cor do texto, pois cria um elemento na frente do elemento de destino e aplica uma cor de fundo transparente a ele.
Isso pode ser um problema em alguns casos.
fonte
rgb
ouHSL
), mas também evita qualquer conflito entre as funções de cores CSS nativas e as funções de cores do Sass. Veja a resposta do SimplyPhy abaixo.:before
para que você obtenha a ordem correta de empilhamento sem brincarz-index
.Isso é realmente possível com CSS . Está um pouco sujo e você terá que usar gradientes. Codifiquei um pequeno trecho como exemplo, observe que, para fundos escuros, você deve usar a opacidade em preto, como em claro - os brancos:
fonte
onde você substitui a opacidade por algo entre 0 e 1
fonte
rgba(var(--color), opacity)
. Especialmente porque o valor da sua propriedade personalizada é toda a notação rgb (). Mas também por causa da palavra-chave "opacidade".SCSS / SASS
Vantagem: você pode apenas usar valores de cores hexadecimais, em vez de usar os 8 bits para cada canal (0-255).
É assim que eu fiz isso com a ideia inicial de: https://codyhouse.co/blog/post/how-to-combine-sass-color-functions-and-css-variables
Editar: Você também pode modificar a função alfa para usar
#{$color-name}-rgb
e omitir as variáveis CSS * -r, * -g, * -b geradas.Resultado
Uso:
Mixin e funções
Espero que isso poupe tempo a alguém.
fonte
Você pode definir variáveis / valores específicos para cada cor - o original e o com opacidade:
Se você não pode usar isso e está bem com a solução javascript, pode usar esta:
fonte
Para usar rgba () com a variável css geral, tente o seguinte:
fonte
No CSS, você poderá usar os valores rgba:
ou apenas defina a opacidade:
fonte
Se você gosta de cores hexagonais como eu, há outra solução. O valor hexadecimal é de 6 dígitos depois que esse é o valor alfa. 00 é 100% de transparência 99 é cerca de 75% e, em seguida, usa o alfabeto 'a1-af' e depois 'b1-bf', terminando com 'ff', que é 100% opaco.
fonte