親要素のスタイルの基づいてスタイルを適用するコンテナスタイルクエリー CSS
CSS の @container ルールは、コンテナ(親要素)の特性に基づいてスタイルを適用するためのルールです。コンテナースタイルクエリーはコンテナサイズクエリーとコンテナスタイルクエリーの 2 種類に分類されます。コンテナスタイルクエリは style() 関数記法で定義されたスタイルを @container ルールで評価し、指定された条件が一致する場合にスタイルが適用されます。
CSS の @container ルールは、コンテナ(親要素)の特性に基づいてスタイルを適用するためのルールです。コンテナースタイルクエリーは以下の 2 種類に分類されます。
- コンテナサイズクエリー:コンテナ要素の現在のサイズに基づいてスタイルを適用する。e.g.
@container (min-width: 30em) { ... } - コンテナスタイルクエリー:コンテナ要素のスタイルに基づいてスタイルを適用する。e.g.
@container style(--color: red) { ... }
この記事では、コンテナースタイルクエリーについて見ていきます。
コンテナスタイルクエリーの概要
コンテナスタイルクエリは style() 関数記法で定義されたスタイルを @container ルールで評価します。@media ルールと同様に、指定された条件が一致する場合にスタイルが適用されます。
例を見てみましょう。ここでは @container() ルールに --bg-color カスタムプロパティが black の場合に、p 要素のテキストカラーを white に変更します。
.wrapper {
background-color: var(--bg-color, white);
}
p {
color: black;
}
@container style(--bg-color: black) {
p {
color: white;
}
}結果は以下のようになります。
現在 style() に渡せるプロパティはカスタムプロパティのみですが、将来的には他のプロパティもサポートされる予定です。
直接の親要素ではない要素を元にスタイルを適用する
要素が入れ子になっている場合について考えてみましょう。以下の HTML は .wrapper > .inner > p の構造を持っています。このとき、.wrapper と .inner にそれぞれ同一のカスタムプロパティが定義されている場合、コンテナスタイルクエリーはどの要素を基準にスタイルを適用するでしょうか?
<div class="wrapper" style="--weather: sunny;">
<div class="inner" style="--weather: rainy;">
<p>Text</p>
</div>
</div>@container style(--weather: sunny) {
p {
color: orange;
}
}
@container style(--weather: rainy) {
p {
color: blue;
}
}このとき、コンテナスタイルクエリの対象の p 要素に最も近い親要素が基準となります。つまり、.inner 要素に定義された --weather: rainy が適用されるため、テキストカラーは青色になります。
常に .wrapper 要素を基準にスタイルを適用したい場合は、container-name プロパティを .wrapper 要素に指定し、@container ルールにおいて container-name で指定した名前を参照します。
.wrapper {
container-name: wrapper;
}
@container wrapper style(--weather: sunny) {
p {
color: orange;
}
}
@container wrapper style(--weather: rainy) {
p {
color: blue;
}
}このようにすることで、.wrapper 要素を基準にスタイルが適用されます。以下のように文字の色がオレンジ色になっていることが確認できます。
まとめ
@containerルールはコンテナ(親要素)の特性に基づいてスタイルを適用するためのルールで、コンテナサイズクエリーとコンテナスタイルクエリーの 2 種類がある- コンテナスタイルクエリーは
@container style(--custom-property: value) { ... }でスタイルを定義し、--custom-propertyが一致する場合にスタイルが適用される - 入れ子になっている要素の場合、最も近い親要素が基準となるが、
container-nameプロパティを使用することで基準を指定できる
