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 usando var()
em uma rgba()
função com o valor alfa desejado e ele apenas trabalhe:
: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>
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 uma var(--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:
A sintaxe permitida para propriedades personalizadas é extremamente permissiva. A produção <declaration-value> corresponde a qualquer sequência de um ou mais tokens, desde que a sequência não contenha <bad-string-token>, <bad-url-token>, inigualável <) - token>, <] - token> ou <} - token> ou tokens <semicolon-token> de nível superior ou tokens <delim-token> com o valor "!".
Por exemplo, a seguir é uma propriedade customizada válida:
--foo: if(x > 5) this.width = 10;
Embora esse valor seja obviamente inútil como uma variável, pois seria inválido em qualquer propriedade normal, ele pode ser lido e utilizado pelo JavaScript.
E seção 3 :
Se uma propriedade contiver uma ou mais funções var () e essas funções forem sintaticamente válidas, a gramática da propriedade inteira deverá ser considerada válida no momento da análise. Ele é verificado apenas na sintaxe no tempo do valor calculado, após a substituição das funções var ().
Isso significa que o 240, 240, 240
valor que você vê acima é substituído diretamente na rgba()
função antes que a declaração seja computada. Então, é isso:
#element {
background-color: rgba(var(--color), 0.8);
}
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:
#element {
background-color: rgba(240, 240, 240, 0.8);
}
que, é claro, é CSS perfeitamente válido.
Indo um passo adiante, você pode armazenar o componente alfa em sua própria propriedade customizada:
:root {
--color: 240, 240, 240;
--alpha: 0.8;
}
e substitua-o, com o mesmo resultado:
#element {
background-color: rgba(var(--color), var(--alpha));
}
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.