CSSでオーバーレイのスタイルが期待通りに表示されない、::backdrop疑似要素の変更された使い方
Post on:2024年2月29日
ダイアログやモーダルを表示する時に、コンテンツの上にオーバーレイを使用します。このオーバーレイはコンテンツの上に表示されるように::backdrop
疑似要素で最上位レイヤーにするのが簡単です。
先日アップデートされたChrome 122でこの::backdrop
疑似要素の値の継承ルールが変更されました。
Changes to CSS ::backdrop inheritance
by Bramus
下記は各ポイントを意訳したものです。
※元サイト様のライセンスに基づいて翻訳しています。基づいてというのは、貢献部分に関して同ライセンスも含みます。
これまでの::backdrop疑似要素
フルスクリーンに表示する要素用のAPIを定義するFullscreen APIでは、最上位レイヤーや::backdrop
疑似要素といった新しいコンセプトが導入されました。
- 最上位レイヤーは、ビューポート内でユーザーにもっとも近い位置(最上位)にレンダリングされる新しいスタッキングレイヤーです。これはビューポートのサイズと同じで、他のすべてのレイヤーの上に表示されます。
::backdrop
疑似要素は、ビューポートのサイズと同じサイズのボックスで、最上位レイヤーに表示される要素のすぐ下にレンダリングされます。
さらに詳しくは、先日の記事をご覧ください。
CSSのz-index: 10000;はいらなくなる、要素を最上位に表示する「最上位レイヤー(top layer)」の基礎知識と使い方
::backdrop
疑似要素の元の仕様にある特徴の一つは、次のようなものでした。
どの要素からも継承されず、どの要素からも継承されません。
この仕様は::backdrop
疑似要素のスタイルを分離するのには便利でしたが、::backdrop
疑似要素が:root
で宣言されたカスタムプロパティにアクセスできないことも意味しました。このため、デベロッパーの間で混乱が生じました。
回避策として、カスタムプロパティを:root
だけでなく、::backdrop
にも明示的に宣言して利用可能にする必要がありました。
1 2 3 4 5 6 7 8 |
/* Chrome 121以前 */ :root, ::backdrop { --back-color: #333; } ::backdrop { background-color: var(--back-color); } |
アップデートされた::backdrop疑似要素
::backdrop
疑似要素のこの問題を解決するために、CSS Working Groupはこれらのコンセプトを採用し、CSS Positioned Layout Module Level 4に明記しました。
定義を新しい仕様に移行するとともに、定義自体もアップデートされました。
デベロッパーに直接的な影響を与えるアップデートは、::backdrop
疑似要素がツリー永続要素になり、元の要素から継承可能なプロパティをすべて継承することです。
この変更はChrome 122でサポートされ、特定の要素のカスタムプロパティ値を上書きすることが可能になり、::backdrop
疑似要素はそのプロパティにアクセスできるようになりました。たとえば、開いている<dialog>
要素に関連付けられた::backdrop
疑似要素は、その<dialog>
要素で使用可能なカスタムプロパティにアクセスできるようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 |
/* Chrome 122以降 */ :root { --backdrop-color: #333; /* あらゆる::backdropがアクセスできるカスタムプロパティ */ } dialog { --backdrop-color: #6300ff33; /* dialogの::backdropがアクセスできるカスタムプロパティ */ } ::backdrop { background-color: var(--backdrop-color); } |
実際の動作は、デモページでご覧ください。
Chrome 122以降は、背景が薄紫色になります。これは::backdrop
疑似要素が<dialog>
要素から継承可能なプロパティ(カスタムプロパティを含む)を継承しているからです。
See the Pen
dialog::backdrop by coliss (@coliss)
on CodePen.
最上位レイヤーで開く<dialog>
要素のデモ。
Chrome 122以降では::backdrop
疑似要素は--backdrop-color
にアクセスして、背景に色を付けることができます。
sponsors