1. はじめに
これは [css-position-3] に対する初期の差分仕様です。
2. スクロール可能な包含ブロック
スクロールコンテナ が 絶対位置指定包含ブロック を 絶対位置指定ボックス のために確立する場合、 3つの可能な 包含ブロック のうちいずれかが使用されます:- 固定包含ブロック
-
固定包含ブロック は、スクロールコンテナ の スクロールポートに対応します、 すなわち、パディングボックス の内側の端で、 スクロールコンテナの内容ではなく、外部コンテキストとともにスクロールされます。
文書によって確立される 固定包含ブロック は 固定位置指定包含ブロック です。
- ローカル包含ブロック
-
ローカル包含ブロック は、スクロールコンテナ の パディングボックス の端に対応しますが、 スクロール可能オーバーフロー領域に固定されており、 スクロールコンテナの内容とともにスクロールされます。
文書によって確立される ローカル包含ブロック は 初期包含ブロックです。
- スクロール可能包含ブロック
-
スクロール可能包含ブロック は、スクロールコンテナ の パディングエッジに対応し、 スクロールコンテナの スクロール可能オーバーフロー領域の外側の端、 すなわち、パディングの外側の端です。 スクロール可能オーバーフロー領域の範囲を決定する際に使われます。 詳しくは CSS Overflow 3 § 2.2 Scrollable Overflow を参照してください。 いずれの場合も スクロール可能包含ブロックは 少なくとも ローカル包含ブロックを包含します。
注: これには浮動要素(float)が含まれますが、 絶対位置指定された子孫や、 子孫ボックスからオーバーフローした内容、 相対位置指定や変形(transform)の効果は含まれません。 それらはスクロール領域を拡張して表示される場合があります。
文書によって確立される スクロール可能包含ブロック は 初期包含ブロック と マージンボックス を ルート要素が生成する ボックスの合体です。
注: これらはすべてある意味で パディングボックス に対応していますが、 スクロール可能オーバーフローを持つボックスでは一致しません。
トップレイヤーに必要な正確な概念を検討する必要があります。 彼らはおそらく、層に特化した少し異なることをしたいでしょう。
特に指定がない限り、 絶対位置指定ボックスは ローカル包含ブロック を使用します。 特定のCSS機能は他の 包含ブロック を指定できます。 例えば 固定位置指定ボックス は通常文書の 固定包含ブロック を使用し、 position-area の none 以外の値は 絶対位置指定ボックスを スクロール可能包含ブロック に切り替えることができます。
注: 固定包含ブロック を、 固定位置指定包含ブロック以外で参照する方法は現時点ではありませんが、 将来的に追加される可能性があります。
3. トップレイヤー
Documentには
トップレイヤー
があり、
文書からの順序付き集合として 要素を含みます。
トップレイヤー の要素は、
文書内の位置に基づいて通常のレイアウトを行いません。
代わりに、それらはルート要素の兄弟であるかのようにボックスを生成します。
トップレイヤーの要素は
トップレイヤーに現れる順序で描画され、
トップレイヤーの最後の要素が他のすべての上に描画されます。
注: この特別な描画動作により、 トップレイヤーの要素は 文書内の何かによってクリップされたり、 トップレイヤーの後の要素以外によって隠されることがありません。 これにより、ポップオーバーなどが 祖先要素の影響に関係なく確実に表示できるようになります。
トップレイヤールートは、 要素の最も近い祖先要素で トップレイヤー内にあるものです。 それ以外の場合は存在せず(その場合は通常通り文書の一部として描画されます)。
2つの要素は、同じトップレイヤー内 にあるとみなされます。 それらが同じ トップレイヤールート を持つ場合(両方とも存在しない場合も含みます)。 要素Aが より高いトップレイヤー にあるとみなされるのは、 Aに トップレイヤールートがあり、 Bの トップレイヤールートがAのものより トップレイヤー内で早い場合、またはBが トップレイヤールートを持たない場合です。
注: トップレイヤーは完全にユーザーエージェントによって管理されます。 著者が直接操作することはできません。 これにより、トップレイヤーAPIをネストして呼び出した場合(例:ポップアップ内のポップアップなど)が正しく表示されます。
注: トップレイヤーは overlayプロパティと 少し特殊な方法で相互作用します。 詳細は overlay を参照してください。
Documentには
トップレイヤー削除待ち
順序付き集合もあり、
削除待ちの要素が含まれます。
(詳細は下記のアルゴリズムを参照してください。)
トップレイヤー (および トップレイヤー削除待ち) は仕様のアルゴリズムで直接操作すべきではありません。 (トップレイヤーを使用する個別の機能が トップレイヤー内のさまざまな要素(例:ポップオーバー内のポップオーバー)を グループとして並べ替えたり移動したりする所有権を持つ場合があります。) その代わり、仕様は以下のアルゴリズムを使用してください。
3.1. トップレイヤーのスタイリング
すべてのトップレイヤーで描画される要素および対応する::backdrop疑似要素は、以下の特性で描画されます:
-
新しい積み重ねコンテキストを生成します。
-
親の積み重ねコンテキストはルート積み重ねコンテキストです。
-
文書のルートの兄弟としての原子的な単位として描画されます。
-
positionプロパティがfixedに算出される場合、 包含ブロックはビューポートとなり、 それ以外の場合は初期包含ブロックとなります。
-
要素の場合、 その要素と::backdrop疑似要素は、 shadow-including inclusive ancestor がdisplay: noneの場合は描画されません。
-
他の仕様で上書きされない限り、 left、right、およびtopの静的位置はゼロです。
3.2. ::backdrop疑似要素
各トップレイヤーで描画される要素には ::backdrop 疑似要素があり、 その発生元要素となります。
算出されたcontent の値がnoneでない場合、 ::backdrop疑似要素は ルート要素の兄弟としてボックスを生成します。 自動的にトップレイヤー内の別の項目として描画され、 発生元要素の下に表示されます。 (詳細は「文書を描画する」を参照)
注: ::backdrop疑似要素は トップレイヤー内の要素(例えばフルスクリーン表示された要素など)の背後にある文書を隠すために使用できます。
::backdrop疑似要素は 完全にスタイル可能な疑似要素です。
ユーザーエージェントはUAレベルのスタイルシートに下記のルールを含めるべきです:
::backdrop{ position : fixed; inset : 0 ; }
他の仕様はデフォルトの::backdrop 描画に追加プロパティを指定できます。
注: 例えばフルスクリーン要素([FULLSCREEN]) は、その::backdrop をデフォルトで不透明な黒でスタイルします。
さらに詳細については § 3.1 トップレイヤーのスタイリングを参照してください。 ::backdrop要素がどのように描画されるかについて説明しています。
3.3. トップレイヤーの操作
注: 仕様は、トップレイヤー自体を操作する場合は トップレイヤーで描画されるよりもこの概念を使うべきです。 この概念を使うことで、overlayのトランジションがあるかどうかや、 2つの操作が描画更新の間で起こったか、跨いで起こったかによる動作の違いを避けられます。
注: 仕様は、トップレイヤー自体を操作しない場合、 つまり「すべての上に描画される」挙動に応答する場合は トップレイヤー内よりも この概念を使うべきです。 例えば、::backdrop疑似要素の存在は、 要素がトップレイヤーで描画されるかどうかに依存します。 要素が削除待ちであっても、 表示中であれば::backdropを持ちます。
Element
elを与え:
-
doc を el の ノード文書とする。
-
もし el が既に doc の トップレイヤーに 含まれている場合:
-
アサート: el は doc の トップレイヤー削除待ちにも含まれている。 (そうでない場合は仕様のエラーです。)
-
削除 el を doc の トップレイヤー と トップレイヤー削除待ちから。
-
-
UA !important カスケード起点で、 elを対象とした overlay: auto 宣言を含むルールを追加する。
Element
elを与え:
-
doc を el の ノード文書とする。
-
もし el が doc の トップレイヤーに 含まれていない か、または el が既に トップレイヤー削除待ちに 含まれている場合は、終了する。
-
UA !important の overlay: auto ルールで el を対象としたものを削除する。
-
追加 el を doc の トップレイヤー削除待ちへ。
Element
elを与え:
-
doc を el の ノード文書とする。
-
削除 el を doc の トップレイヤーと トップレイヤー削除待ちから。
-
UA !important の overlay: auto ルールで el を対象としたものを削除する(存在する場合)。
注: このアルゴリズムは、 overlayのトランジション等をバイパスして 何かを即座にトップレイヤーから削除する必要がある特殊なケース (例:文書から削除されるモーダルダイアログ)でのみ使用することを意図します。 通常は、トップレイヤーからの削除要求の方が適切です。
Document
docを与え:
-
doc の トップレイヤー削除待ち内の 各要素 el について、 el の overlay の算出値が noneであるか、 el が非描画の場合、 即座にトップレイヤーから削除する el。
注: これはHTMLの描画アルゴリズムの「レンダリング更新」ステップで呼ばれることを想定しています。 他のアルゴリズムから呼ぶことは意図されていません。
注: overlayの判定は 著者レベルのトランジションによって任意の長さ遅延可能です。 詳細は § 3.4 トップレイヤーの制御:overlayプロパティ を参照してください。
3.4. トップレイヤーの制御:overlayプロパティ
| 名前: | overlay |
|---|---|
| 値: | none | auto |
| 初期値: | none |
| 適用対象: | すべての要素 |
| 継承: | no |
| パーセンテージ: | n/a |
| 算出値: | 指定通り |
| 正規順序: | 文法に従う |
| アニメーション型: | 本文参照 |
要素がトップレイヤー内にある場合、 overlayプロパティによって 実際にトップレイヤーで描画されるかどうかが決まります。
- none
-
その要素はトップレイヤーで描画されません。
- auto
-
その要素はトップレイヤー内であれば トップレイヤーで描画されます。
文書内の通常の位置でボックスを生成するのではなく、 ルート要素の兄弟としてボックスを生成し、 「上に」描画されます。
ただし、著者は overlayの値が いつ変わるかに影響を与えることができます。 これはプロパティにtransitionを設定することで可能です。 これにより、アニメーションとトランジションを同期させることができ、 要素がトップレイヤーに移動するタイミングや 通常位置に戻るタイミングをアニメーションの希望するポイントに合わせられます。 例えば、要素がページの通常位置からフェードアウトし、 トップレイヤーの新しい位置でフェードインする、 またはその逆などのアニメーションが可能です。
アニメーションにおいては、
auto
は離散ステップとして補間され、
0 < p < 1 の値は autoとなり、
他の値は端点に近い方となります。
どちらも autoでない場合は離散アニメーションとなります。
注: これはvisibilityのアニメーションに似ています。 多くのイージング関数では、 トランジションの全期間、要素はトップレイヤーで描画されます。 step-start/step-end/linear() で値の切り替えタイミングをより厳密に制御できます。
ユーザーエージェントはUAスタイルシートに下記のルールを持たなければなりません:
*{ overlay : none !important; }
注: これはoverlayプロパティが 著者やユーザーによって設定できないことを意味します。完全にユーザーエージェントによって制御され、 (トップレイヤーにいるときは UA-!importantルールによってoverlay: autoに設定されます)。
ユーザーエージェントは裁量で transitionの overlayを 実行中でも削除しても構いません。 この条件は意図的に未定義です。 (これは transition: overlay 1e9s;などを使って、 要素をトップレイヤーに永久に残そうとする 悪用シナリオを防ぐためです。)
4. 描画順序とスタッキングコンテキスト
この章ではCSSのボックスツリーの描画順序について説明します。
ボックスツリーを走査する際には、 ツリー順序がよく使われます。 フラグメントに関しては、 これはフラグメントの論理順序を指し、 視覚的順序ではありません。 (これは例えば双方向テキストを描画する場合に関連します。)
描画順序は「ペインターモデル」に基づいて定義されており、 要素がスタック状に描画されるものとし、 スタックの下部が「最初」に描画され、 上部の項目よりも下に表示されます。 ユーザーはスタックの最上部より上に存在し、 見下ろしているものとします:
| | |
| | | ⇦ 🧑🎨
| | user
z-index: canvas -1 0 1
スタッキングコンテキストの背景や最も負の位置指定スタッキングコンテキストはスタックの一番下にあり、最も正の位置指定スタッキングコンテキストはスタックの一番上にあります。
キャンバスが他のキャンバス内に含まれている場合は透明であり、そうでない場合はUA定義の色が与えられます。キャンバスは無限の広がりを持ち、ルート要素を含みます。初期状態では、ビューポートはキャンバスの原点の左上隅に固定されます。
-
スタッキングコンテキストを描画する(docのルート要素とcanvasを与える)。
-
docのトップレイヤー内の各要素elについて:
-
スタッキングコンテキストを描画する (elの::backdrop疑似要素とcanvasを与える)。
-
スタッキングコンテキストを描画する(elとcanvasを与え、 elをスタッキングコンテキストとして扱い、 初期包含ブロックを包含ブロックとする)。
-
-
もしrootが要素なら、 スタッキングコンテキストを描画する(rootの主ボックスとcanvasを与える)を実行し、戻る。
-
アサート: rootはボックスであり、 スタッキングコンテキストを生成する。
-
もしrootがルート要素の 主ボックスなら、 rootの背景をキャンバス全体に描画し、 背景の配置領域の原点はcanvas上の、 rootの背景が通常描画される場合の位置とする。
-
もしrootがブロックレベルボックスなら、 ブロックの装飾を描画する(rootとcanvasを与える)。
-
rootの負(ゼロ以外)のz-index値を持つ位置指定子孫について、 それらをz-index順(最も負が最初)、 次にツリー順序で並べ、 各子孫ごとにスタッキングコンテキストを描画する(子孫とcanvas)を実行する。
-
rootのインフローかつ非位置指定かつブロックレベルの子孫について、 ツリー順序で、 ブロックの装飾を描画する(子孫とcanvas)を実行する。
-
rootの非位置指定の浮動子孫について、 ツリー順序で、 スタッキングコンテナを描画する (子孫とcanvasを与える)を実行する。
-
- もしrootがインラインレベルボックスなら
-
rootが属する各ラインボックスについて、 ラインボックス内のボックスを描画する (root、ラインボックス、canvasを与える)。
- それ以外の場合
-
まずrootについて、 その後、インフローかつ非位置指定かつブロックレベルの子孫ボックス全てについて、 ツリー順序で:
-
もしそのボックスが置換要素なら、 置換コンテンツをcanvasへ原子的に描画する。
-
それ以外の場合、各ラインボックスについて、 ラインボックス内のボックスを描画する (ボックス、ラインボックス、canvasを与える)。
-
UAがインバンドアウトラインを使う場合、 ボックスのアウトラインを canvasへ描画する。
-
-
rootの位置指定子孫で z-index: autoまたはz-index: 0の場合、 ツリー順序で:
- 子孫がz-index: autoの場合
-
スタッキングコンテナを描画する (子孫とcanvas)を実行する。
- 子孫がz-index: 0の場合
-
スタッキングコンテキストを描画する (子孫とcanvas)を実行する。
-
rootの位置指定子孫で 正(ゼロ以外)のz-index値を持つものについて、 それらをz-index順(最小が最初)、 次にツリー順序で並べ、 各子孫ごとにスタッキングコンテキストを描画する(子孫とcanvas)を実行する。
-
UAがアウトオブバンドアウトラインを使う場合、 rootの全アウトライン (このアルゴリズムの今回の呼び出しでインバンドアウトラインを使わなかったため描画しなかったもの)を canvasへ描画する。
-
もしrootがテーブルラッパーボックスでない場合:
-
もしrootがテーブルラッパーボックスの場合:
-
rootのフラグメントでline box内にあるものの背景をcanvasへ描画する。
-
rootのフラグメントでline box内にあるものの枠線をcanvasへ描画する。
-
- もしrootがインラインボックスなら
-
インフローかつ非位置指定かつインラインレベルの子で、line box内にフラグメントを生成するもの、 およびline box内にフラグメントを生成する 子テキストシーケンス全てについて、 ツリー順序で:
- この子がテキストシーケンスなら:
-
-
テキストに影響する下線を、 下線を適用する要素のツリー順序で(最も深い要素の下線が最上に、ルート要素の下線が最下に)、 canvasへ描画する。
-
テキストに影響する上線を、 上線を適用する要素のツリー順序で(最も深い要素の上線が最上に、ルート要素の上線が最下に)、 canvasへ描画する。
-
テキストをcanvasへ描画する。
-
テキストに影響する取り消し線(ラインスルー)を、 ラインスルーを適用する要素のツリー順序で(最も深い要素のラインスルーが最上に、ルート要素のラインスルーが最下に)、 canvasへ描画する。
-
- この子がボックスなら:
-
ラインボックス内のボックスを描画する (子、line box、canvasを与える)。
- もしrootがインラインレベルのブロック またはテーブルラッパーボックスなら
-
スタッキングコンテナを描画する (rootとcanvasを与える)。
- もしrootがインラインレベルの置換要素なら
-
置換コンテンツをcanvasへ原子的に描画する。
-
UAがインバンドアウトラインを使う場合、 rootのフラグメントでline box内にあるもののアウトラインをcanvasへ描画する。
注: インラインボックスのフラグメントの視覚順序は 双方向並べ替えにより 行内で並び替えられることがあっても、フラグメントはツリー順序で描画されます。
-
スタッキングコンテキストを描画する(rootとcanvasを与え、 rootが新しいスタッキングコンテキストを作成するかのように扱うが、 位置指定子孫や実際にスタッキングコンテキストを作成する子孫は除外する (親スタッキングコンテキストがそれらを描画する)。
UAはoutline プロパティによるアウトラインを インバンド (各要素に沿って描画し、後続の内容に隠されたり重なったりする可能性あり) またはアウトオブバンド (スタッキングコンテキストの最後にすべてのアウトラインを描画するので、 スタッキングコンテキスト内の何もアウトラインを隠せない)いずれかで描画できます。 UAはアウトオブバンドアウトラインを使うことが推奨されます。 なぜならアウトラインを見やすくすることは重要なアクセシビリティ機能だからです。
5. 変更点
2025年7月8日 初回公開作業草案以降の主な変更点:
-
なし(マークアップおよびリンクの修正のみ)。
プライバシーに関する考慮事項
この仕様に関して新たなプライバシーに関する考慮事項は報告されていません。
セキュリティに関する考慮事項
この仕様に関して新たなセキュリティに関する考慮事項は報告されていません。