既存のカラー値を取得してアルファ チャネルを適用することはできません。つまり、 などの既存の 16 進値を取得#f0f0f0
してアルファ コンポーネントを指定し、結果の値を別のプロパティで使用することはできません。
ただし、カスタム プロパティを使用すると、16 進値を で使用するために RGB トリプレットに変換しrgba()
、その値をカスタム プロパティに保存し (コンマを含む!)、関数を使用var()
してその値をrgba()
目的のアルファ値に置き換えることができます。ただ働く:
: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>
これは、本当であるには良すぎるように思えます。1仕組みは?
魔法は、プロパティ値の参照を置換するときに、そのプロパティの値が計算される前に、カスタム プロパティの値がそのまま置換されるという事実にあります。これは、カスタム プロパティに関する限り、色の値を期待する式がどこかに現れるまで (そしてそのコンテキストでのみ) 、例の値はまったく色の値ではないことを意味します。css-variables 仕様のセクション 2.1から:var()
--color
var(--color)
カスタム プロパティに許可されている構文は、非常に寛大です。<declaration-value> 生成は、シーケンスに <bad-string-token>、<bad-url-token>、unmatched <)-token>、<]- が含まれていない限り、1 つ以上のトークンの任意のシーケンスと一致します。 token>、または <}-token>、または最上位の <semicolon-token> トークンまたは <delim-token> トークンで、値が "!" です。
たとえば、次は有効なカスタム プロパティです。
--foo: if(x > 5) this.width = 10;
この値は、通常のプロパティでは無効であるため、明らかに変数としては役に立ちませんが、JavaScript によって読み取られ、操作される可能性があります。
そしてセクション3:
プロパティに 1 つ以上の var() 関数が含まれていて、それらの関数が構文的に有効である場合、プロパティの文法全体が解析時に有効であると想定する必要があります。var() 関数が置換された後、計算された値の時間にのみ構文チェックされます。
これは、宣言が計算される前に240, 240, 240
、上記の値がrgba()
関数に直接代入されることを意味します。したがって、この:
#element {
background-color: rgba(var(--color), 0.8);
}
rgba()
コンマで区切られた 4 つ以上の数値が必要なため、最初は有効な CSS ではないように見えますが、次のようになります。
#element {
background-color: rgba(240, 240, 240, 0.8);
}
もちろん、これは完全に有効な CSS です。
さらに一歩進んで、アルファ コンポーネントを独自のカスタム プロパティに格納できます。
:root {
--color: 240, 240, 240;
--alpha: 0.8;
}
同じ結果でそれを置き換えます:
#element {
background-color: rgba(var(--color), var(--alpha));
}
これにより、オンザフライで交換できるさまざまなアルファ値を持つことができます。
1 カスタム プロパティをサポートしていないブラウザでコード スニペットを実行している場合は、そうです。