Você não pode pegar um valor de cor existente e aplicar um canal alfa a ele. Nomeadamente, você não pode #f0f0f0usar 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 --colorseu 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, 240valor 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.