CSSアンカーポジショニング

W3C作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/WD-css-anchor-position-1-20251007/
最新公開バージョン:
https://www.w3.org/TR/css-anchor-position-1/
編集者ドラフト:
https://drafts.csswg.org/css-anchor-position-1/
履歴:
https://www.w3.org/standards/history/css-anchor-position-1/
フィードバック:
CSSWG イシューレポジトリ
仕様内に記載
編集者:
Tab Atkins-Bittner (Google)
Elika J. Etemad / fantasai (Apple)
Ian Kilpatrick (Google)
前編集者:
Jhey Tompkins (Google)
この仕様への編集提案:
GitHub エディター

概要

この仕様は、アンカーポジショニングを定義します。 配置された要素が、ページ上の1つ以上の「アンカー要素」を基準にして サイズや位置を決定できるようにします。

CSSは、構造化された文書(HTMLやXMLなど)の 表示方法を画面や印刷などで記述するための言語です。

この文書のステータス

このセクションは、公開時点におけるこの文書のステータスを説明します。 現在のW3C出版物一覧や、この技術レポートの最新改訂版は W3C標準・草案インデックスで確認できます。

この文書はCSSワーキンググループによって 作業草案として 勧告作業トラックを用いて公開されました。 作業草案として公開されたことは、 W3Cおよびそのメンバーによる承認を意味するものではありません。

この文書はドラフトであり、 更新、置き換え、または他の文書によって廃止される可能性があります。 この文書を進行中の作業以外のものとして引用するのは不適切です。

フィードバックは GitHubでIssueを提出(推奨)してください。 その際、仕様コード「css-anchor-position」をタイトルに含め、例: 「[css-anchor-position] …コメントの概要…」 すべてのIssueやコメントはアーカイブされています。 または、(アーカイブ済み)の公開メーリングリスト www-style@w3.org に送信できます。

この文書は 2025年8月18日版W3Cプロセス文書 に従って管理されています。

この文書は W3C特許ポリシー のもとで運用されているグループによって作成されました。 W3Cは、グループの成果物に関連して 公開特許開示リスト を維持しています。 そのページには特許を開示するための手順も記載されています。 個人が特許に関する実際の知識を持ち、その特許が 必須クレーム を含むと考える場合、 W3C特許ポリシー第6節 に従って情報を開示する必要があります。

1. はじめに

CSSの絶対位置指定は、 著者がボックスをページ上のどこにでも配置できるようにします。 これは、他のボックスのレイアウト(包含ブロック以外)を考慮しません。 この柔軟性は非常に便利ですが、 制限もあり、しばしば何らかの他のボックスを基準に配置したい場合があります。 アンカーポジショニングposition-anchorプロパティ、 position-areaプロパティ、 または アンカー関数 anchor()anchor-size() を用いることで) 著者はこの目的を達成できます。 絶対位置指定されたボックスを ページ上の1つ以上の他のボックス(アンカー参照)に「アンカー」し、 重なりやオーバーフローを避けるために複数の配置位置を試すことも可能です。

例えば、著者がツールチップを 対象要素の中央上部に配置したいが、 その位置だとツールチップが画面外になってしまう場合は、 代わりに対象要素の下に配置したい場合があります。 これは次のCSSで実現できます:
.anchor {
  anchor-name: --tooltip;
}
.tooltip {
  /* Fixposにより、包含ブロックの関係を気にする必要がありません。
     ツールチップはDOMのどこにでも存在できます。 */
  position: fixed;

  /* すべてのアンカー動作はデフォルトで--tooltipアンカーを参照します。 */
  position-anchor: --tooltip;

  /* ツールチップの下端をアンカーの上端に揃えます。
     水平方向書字モードでは、ツールチップとアンカーの水平方向中央揃えもデフォルトです。 */
  position-area: block-start;

  /* ウィンドウからはみ出した場合、自動的に切り替わり、
     ツールチップの上端がアンカーの下端に揃います。 */
  position-try: flip-block;

  /* 幅が広くなりすぎないようにする */
  max-inline-size: 20em;
}

Popover APIを使用すると、 positionが自動的に設定され、 anchor-nameposition-anchor値を 明示的に設定しなくてもアンカー関係が作成されます (暗黙的アンカー要素の定義による)。 そのため、適切なマークアップでこの例は次のように簡略化できます:

.tooltip {
  /* popover + popovertarget属性を使うと 'position: fixed'が設定され、
     必要なposition-anchor関係も作成されます。 */
  position-area: block-start;
  position-try: flip-block;
  max-inline-size: 20em;
}

1.1. 値の定義

この仕様は、[CSS2]のCSSプロパティ定義規約に従い、 [CSS-VALUES-3]の値定義構文を使用します。 この仕様で定義されていない値型は、CSS Values & Units [CSS-VALUES-3]で定義されています。 他のCSSモジュールと組み合わせることで、これらの値型定義が拡張される場合もあります。

各プロパティの定義に記載された値に加え、 この仕様で定義されたすべてのプロパティは CSS全体キーワードもプロパティ値として受け付けます。 可読性のため、明示的に繰り返して記載していません。

CSSのセレクタマッチング以外の大半の処理と同様に、 この仕様の機能は フラット化された要素ツリー上で動作します。

2. アンカーの決定

2.1. アンカーの作成:anchor-nameプロパティ

名前: anchor-name
値: none | <dashed-ident>#
初期値: none
適用対象: 主ボックスを生成するすべての要素
継承: no
パーセンテージ: n/a
算出値: 指定通り
標準順序: 構文通り
アニメーション型: 離散

anchor-nameプロパティは、 要素がアンカー要素であることを宣言します。 その主ボックスアンカーボックスとなり、 ターゲットとなるアンカー名のリストを指定します。 値は次のように定義されます:

none

このプロパティは効果を持ちません。

<dashed-ident>#

要素が主ボックスを生成する場合、 その要素はアンカー要素となり、 指定されたアンカー名リストを持ちます。 各アンカー名ゆるやかに一致する ツリースコープ名です。

それ以外の場合、このプロパティは効果を持ちません。

アンカー名は一意である必要はありません。 すべての要素が、あるボックスのターゲットアンカー要素になれるわけではありません。 したがって、スコープを適切に設定すれば、同じ名前を複数箇所で再利用できます。

注: 複数の要素が同じアンカー名を共有し、 すべてが特定の配置ボックスから見える場合、 ターゲットアンカー要素はDOM順で最後のものになります。 anchor-scopeプロパティで、 参照ボックスから見える名前をさらに制限することもできます。

アンカー名はデフォルトでは containmentによってスコープされません。 要素がスタイルレイアウトcontainment (または類似のcontainment)を持っていても、 子孫のアンカー名はページ内の他の要素から参照可能です。

注: 要素が他の要素の スキップされた内容 (例: content-visibility: hidden)にある場合、 有効なアンカー要素とはみなされず、 実質的に名前を持たないものとして扱われます。

注: シャドウツリー内の配置要素は、 「上位」ツリーで定義されたアンカー名を参照できます。 現状では「下位」シャドウツリーで定義されたアンカー名は参照できません。

2.1.1. 暗黙的アンカー要素

一部の仕様では、特定の状況下で ある要素が他の要素に対して 暗黙的アンカー要素 となることを定義できます。

TODO: 新しいポップオーバー関連仕様がHTML仕様に追加されたタイミングで、例を記載予定

暗黙的アンカー要素autoキーワードを position-anchorで使ったり、 アンカー関数でアンカー参照を省略することで参照できます。

暗黙的アンカー要素疑似要素の場合、 その発生源要素となります(別途指定がない限り)。

2.1.2. アンカーボックス

この仕様のいくつかの機能は、アンカーボックスの位置とサイズを参照します。 別途指定がない限り、 これはborder box境界、 主ボックスアンカー要素について指します。 アンカーボックスの位置とサイズはレイアウト後に決定されます。

この位置とサイズには、zoompositionによる調整 (position: relativeposition: stickyなど)、 さらにtransformoffset-pathによる変形も含まれます。 この場合、アンカーボックスの座標空間での軸揃えバウンディング矩形が 絶対位置指定要素の 包含ブロックで使われます。 変形はしばしば別スレッドで最適化されるため、 アンカーボックスの位置の変形による更新は数フレーム遅れる場合があります。 著者は、可能な場合は絶対または相対位置指定を使うことでこの遅延を回避できます。

アンカーボックス分割されていて、 包含ブロック絶対位置指定ボックスの アンカーボックス参照で関連する 分割コンテキストの外にある場合、 ボックス分割の 軸揃えバウンディング矩形が使われます。 (絶対位置指定ボックスが 分割コンテキスト内にある場合、 アンカーボックスは分割されていないものとして扱われ、 分割コンテキストによって自分自身も分割される可能性があります。)

パフォーマンス上の理由から、 スクロールは特別に扱われます(詳しくは § 3.3 スクロールの考慮 を参照)。 その他のレイアウト後の効果(フィルターなど)は、 アンカーボックスの位置に影響しません。

2.2. アンカー名のスコープ指定:anchor-scopeプロパティ

名前: anchor-scope
値: none | all | <dashed-ident>#
初期値: none
適用対象: すべての要素
継承: no
パーセンテージ: n/a
算出値: 指定通り
標準順序: 構文通り
アニメーション型: 離散

このプロパティは、指定されたアンカー名およびそれらのアンカー名への参照を、 この要素のサブツリー内にスコープします。 詳しくは§2 アンカーの決定を参照してください。

値の意味は以下の通りです:

none
アンカー名のスコープは変更されません。
all
この要素または子孫によって定義されたすべてのアンカー名 (子孫がanchor-scopeで既にスコープを制限していない場合のみ)が、 この要素の子孫のみで参照可能になるようスコープします。 また、子孫はこのサブツリー内のアンカー要素のみ アンカー名に一致できるよう制限されます。

この値は同じツリースコープ内のアンカー名だけに影響し、 厳密一致ツリースコープ名と同じように動作します。 (つまり、anchor-scope: allanchor-scope: --foo, --bar, ...として すべての関連するアンカー名を列挙するのと同じ挙動になります。)

<dashed-ident>
この要素または子孫によって定義された一致するアンカー名 (子孫がanchor-scopeで既にスコープを制限していない場合のみ)が、 この要素の子孫のみで参照可能になるようスコープします。 また、子孫はこのサブツリー内のアンカー要素のみ アンカー名に一致できるよう制限されます。

<dashed-ident>厳密一致ツリースコープ名を表します。 つまり、同じシャドウツリー内のアンカー名のみ一致可能です。[CSS-SCOPING-1]

このプロパティは暗黙的アンカー要素には影響しません。

デザインパターンを再利用する場合、anchor-scopeを使うことで、同じコンポーネント間での名前の衝突を防げます。 例えば、リスト内の各リストアイテムに配置要素が含まれ、 それぞれが自分のリストアイテムを基準に配置したい場合は、
li {
  anchor-name: --list-item;
  anchor-scope: --list-item;
}
li .positioned {
  position: absolute;
  position-anchor: --list-item;
  position-area: inline-start;
}

anchor-scopeがない場合、 すべての li 要素がすべての配置要素から見えるため、 すべてが最後の li を基準に配置され、重なってしまいます。

2.3. アンカーの検索

この仕様のいくつかの機能は、アンカー指定子 を元に、ターゲットアンカー要素を検索します。 アンカー指定子は、<dashed-ident>ツリースコープ参照)であり、 ページ上の他のanchor-name値を一致させるもの、 またはキーワードauto、 あるいは空(指定なし)となります。

注: これらの条件で示される一般的なルールは、 要素が配置ボックスのターゲットアンカー要素になれるのは、 そのボックス自体が、参照しようとする配置ボックスよりも先に完全にレイアウトされている場合のみです。 CSSのレイアウト規則は、アンカーと配置ボックス、およびそれぞれの包含ブロックの関係によって 有用な保証をもたらします。 下記の条件リストは、スタッキングコンテキスト規則を この目的に関連する内容だけに言い換えたもので、 アンカーポジショニングで循環が起きないことを保証します。

ターゲットアンカー要素を、 クエリ要素query elと オプションのアンカー指定子 anchor spec を元に決定する方法:
  1. anchor specが渡されなかった場合、 デフォルトアンカー要素があればそれを返し、 なければ何も返しません。

  2. anchor specautoの場合:

    1. query el暗黙的アンカー要素を持ち、 それが有効なアンカー要素であれば、 その要素を返します。

    2. それ以外の場合は何も返しません。

    注: 将来のAPIも暗黙的アンカー要素を定義する可能性があります。 その場合は、このアルゴリズム内で明示的に扱われ、 協調が確保されます。

  3. それ以外の場合、anchor spec<dashed-ident>です。 以下の条件をすべて満たす ツリー順で最後の要素elを返します:

    条件を満たす要素がなければ、何も返しません。

    注: anchor-scopeによって 特定のアンカー名の可視範囲が制限され、 どの要素がアンカー要素になれるかに影響します。

注: あるanchor-nameが一つのシャドウツリーで スタイルによって定義されていても、他のシャドウツリーの スタイルでのアンカー関数からは 見えません(カプセル化が維持されます)。 ただし、異なるシャドウツリー間の要素は どちらも、anchor-nameアンカー関数の両方が 同じツリーのスタイルから来る場合(例:::part()でシャドウ内の要素をスタイル指定)、 相互にアンカーすることも可能です。 (暗黙的アンカー要素も 単一ツリーのみに限定されるわけではありませんが、割り当てAPIの仕様に依存します。)

要素possible anchorが、 絶対位置指定要素positioned elに対して 有効なアンカー要素であるための条件:

2.4. デフォルトアンカー:position-anchorプロパティ

名前: position-anchor
値: auto | <anchor-name>
初期値: auto
適用対象: 絶対位置指定ボックス
継承: no
パーセンテージ: n/a
算出値: 指定通り
標準順序: 構文通り
アニメーション型: 離散

position-anchorプロパティは、デフォルトアンカー要素を指定します。 この要素はposition-areaposition-try、 および(デフォルトで)この要素に適用されるすべてのアンカー関数で使用されます。 position-anchorリセット専用サブプロパティであり、 positionの一部です。

auto

暗黙的アンカー要素が存在する場合はそれを使い、存在しない場合はボックスにデフォルトアンカー要素がありません。

<anchor-name>

指定されたターゲットアンカー要素が選択され、 そのボックスがデフォルトアンカー要素となります。

主ボックスデフォルトアンカー要素の ボックスのデフォルトアンカーボックスとなります。

例えば、次のコードでは .foo.barの両方の要素が 同じ位置指定プロパティを使うことができ、 参照するアンカー要素だけを変更します:
.anchored {
  position: absolute;
  top: calc(.5em + anchor(outside));
  /* アンカー名を指定しない場合、
     デフォルトアンカーボックスを自動的に参照します。 */
}

.foo.anchored {
  position-anchor: --foo;
}
.bar.anchored {
  position-anchor: --bar;
}

2.5. アンカーの関連性

要素elユーザーに関連するかどうかを判定する際、 elの子孫が配置ボックスのターゲットアンカー要素であり (その配置ボックス自身がスキップされておらず、 その包含ブロックelやその子孫でない場合)、 elユーザーに関連するとみなされます。

注: 例えば、 content-visibility: autoサブツリー内のアンカーは それを頼りにする配置ボックスがスキップされていなければ サブツリーの内容がスキップされるのを防ぎます。 (アンカーと配置ボックスが同じcontent-visibility: auto要素の下に両方いる場合は、 循環的に相互を可視化し続けることはできません。)

3. アンカー基準の配置

絶対位置指定ボックスは、 ページ上の1つ以上のアンカーボックスを基準に自分自身を配置できます。

position-areaプロパティは、 デフォルトアンカーボックスを基準とした グリッドベースの配置を簡便に提供します。 より複雑な配置や複数ボックスを基準とする場合は、 anchor()関数を インセットプロパティ で使い、特定のアンカーボックスの辺を明示的に参照できます。

3.1. position-areaプロパティ

名前: position-area
値: none | <position-area>
初期値: none
適用対象: デフォルトアンカーボックスを持つ配置ボックス
継承: no
パーセンテージ: n/a
算出値: キーワードnoneまたはキーワードのペア。詳細は§ 3.1.3 <position-area>の算出値とシリアライズを参照。
標準順序: 構文通り
アニメーション型: TBD

アンカーポジショニングの一般的なユースケースは、 配置ボックスの包含ブロックの端や デフォルトアンカーボックスの端のみを気にするものです。 これらの線は3×3のグリッドを定義するものとして考えられます。 position-areaを使うことで、 このposition-areaグリッドのどの領域に配置するかを簡単に指定できます。

position-area: top leftによる配置の例 (horizontal-tb ltr 書字モードの場合)。
none

このプロパティは効果を持ちません。

<position-area>

ボックスにデフォルトアンカーボックスがない場合や、 絶対位置指定ボックスでない場合は効果を持ちません。

それ以外の場合、position-areaグリッドの領域を選択し、 それをボックスの包含ブロックとします。

注: これは、インセットプロパティがposition-areaからのオフセットを指定することや、 max-height: 100%などの値が position-areaに対する相対値になることを意味します。

none以外の値は追加で以下の効果を持ちます:

3.1.1. ポジションエリアグリッドの解決

ポジションエリアグリッドは、各軸に4本のグリッド線からなる3×3のグリッドです。 (包含ブロック書字モードを用いる順序で):

注: デフォルトアンカーボックスが 修正前の包含ブロックの外側に部分的または完全に存在する場合、 ポジションエリアグリッドの行や列がサイズ0になることがあります。

3.1.2. <position-area>値の構文

位置は値のペアとして指定されます。 これはフロー相対または物理用語で表現できます。 <position-area>値の許容構文は次の通りです:

<position-area> = [
  [ left | center | right | span-left | span-right
  | x-start | x-end | span-x-start | span-x-end
  | self-x-start | self-x-end | span-self-x-start | span-self-x-end
  | span-all ]
  ||
  [ top | center | bottom | span-top | span-bottom
  | y-start | y-end | span-y-start | span-y-end
  | self-y-start | self-y-end | span-self-y-start | span-self-y-end
  | span-all ]
|
  [ block-start | center | block-end | span-block-start | span-block-end | span-all ]
  ||
  [ inline-start | center | inline-end | span-inline-start | span-inline-end
  | span-all ]
|
  [ self-block-start | center | self-block-end | span-self-block-start
  | span-self-block-end | span-all ]
  ||
  [ self-inline-start | center | self-inline-end | span-self-inline-start
  | span-self-inline-end | span-all ]
|
  [ start | center | end | span-start | span-end | span-all ]{1,2}
|
  [ self-start | center | self-end | span-self-start | span-self-end | span-all ]{1,2}
]

<position-area>値は、以下のように領域が占める行と列を指定することでポジションエリアグリッドの領域を選択します:

start, end, self-start, self-end
top, bottom, left, right
y-start, y-end, self-y-start, self-y-end
x-start, x-end, self-x-start, self-x-end
block-start, block-end, self-block-start, self-block-end
inline-start, inline-end, self-inline-start, self-inline-end
center

指定した軸における対応する単一の行または列。

anchor()と同様に、 論理キーワード(startendなど)は ボックスの包含ブロックの書字モードを基準とします。 x-startなどは 指定された物理軸に従って方向を決定します。

self-*論理キーワード(self-startself-x-endなど)は同じですが、 ボックス自身の書字モードを基準にします。

span-start, span-end, span-self-start, span-self-end
span-top, span-bottom, span-left, span-right
span-y-start, span-y-end, span-self-y-start, span-self-y-end
span-x-start, span-x-end, span-self-x-start, span-self-x-end
span-block-start, span-block-end, span-self-block-start, span-self-block-end
span-inline-start, span-inline-end, span-self-inline-start, span-self-inline-end

指定した軸における隣接する2つの行または列:中央の行/列と、単一トラックキーワードで示されるもう一方の行/列。

(例:span-topは最初の2行(中央行+top行)を含みます。)

span-all

指定した軸における3つすべての行または列。

いくつかのキーワードはどの軸を指すか曖昧です: centerspan-all、 また、block軸やinline軸を明示しないstartなどのキーワード。 もう一方のキーワードが軸に関して明確であれば、 曖昧な方は反対軸を指します。 (例:block-start centerの場合、centerはinline軸を指します。) 両方とも曖昧な場合は、最初がボックスのblock軸、 2番目がinline軸を指します。 (例:span-all startspan-all inline-startと同義です。)

キーワードが1つだけの場合、軸が明確なら2番目はspan-allとして扱い、 軸が不明瞭なら指定キーワードを繰り返したものとして扱います。 (例:toptop span-allと同義、 centercenter centerと同義。)

3.1.3. <position-area>の算出値とシリアライズ

算出値は、<position-area>値として 各軸で選択されたトラックを示す2つのキーワードです。 長い(block-start)・短い(start)論理キーワードは同義とみなします。 シリアライズ時は上記文法の順序で、論理キーワードは短縮形(例:start startblock-start inline-startではなく)で出力されます。

3.2. アンカー相対インセット:anchor()関数

絶対位置指定ボックスは、 anchor()関数を、 インセットプロパティの値として利用し、 1つ以上のアンカーボックスの位置を参照できます。 anchor()関数は <length>に解決されます。 この関数はインセットプロパティのみで使用可能(それ以外では無効)です。

名前: top, left, right, bottom
新しい値: <anchor()>
<anchor()> = anchor( <anchor-name>? && <anchor-side>, <length-percentage>? )
<anchor-name> = <dashed-ident>
<anchor-side> = inside | outside
       | top | left | right | bottom
       | start | end | self-start | self-end
       | <percentage> | center

anchor()関数は3つの引数があります:

anchor()関数が 解決可能なアンカー関数の場合、 算出値の時点(スタイル・レイアウトインターリーブを利用)で、 配置ボックスのinset-modified包含ブロックの対応する辺と 指定されたターゲットアンカー要素アンカーボックスの辺を揃える<length>に解決されます。

注: これはトランジションアニメーションでアンカー関数を使っている場合、 あらゆる変化に対して「期待通り」に動作することを意味します。 例えばアンカーボックスの移動や、 アンカー要素のドキュメントからの追加・削除、 anchor-nameプロパティの変更などです。

例えば、 .bar { inset-block-start: anchor(--foo block-start); }では、 anchor().bar要素のblock-start辺と --fooアンカーのblock-start辺を揃える長さに解決されます。

一方、 .bar { inset-block-end: anchor(--foo block-start); }では、 .bar要素のblock-end辺と --fooアンカーのblock-start辺を揃える長さになります。

inset-block-startinset-block-endは異なる辺(要素の包含ブロックのblock-start/block-end)からのインセット値なので、 同じanchor()でもそれぞれ異なる長さになります。

anchor()関数は<length>に解決されるため、 他のlengthと同様に数式関数内で利用できます。

より良い例を追加すること; この例はanchor-centerで簡単に実現できる。 [Issue #10776]

例えば、次のようにすると 要素のinset-modified包含ブロックがアンカーボックスの中央に揃い、 包含ブロックからはみ出さない最大幅になります:

.centered-message {
  position: fixed;
  max-width: max-content;
  justify-self: center;

  --center: anchor(--x 50%);
  --half-distance: min(
    abs(0% - var(--center)),
    abs(100% - var(--center))
  );
  left: calc(var(--center) - var(--half-distance));
  right: calc(var(--center) - var(--half-distance));
  bottom: anchor(--x top);
}

これは例えば、 input 要素上のエラーメッセージに適しており、 中央揃えによってどのinputが参照されているかが発見しやすくなります。

3.2.1. anchor()の解決

anchor()関数は、 以下すべての条件を満たす場合のみ 解決可能なアンカー関数となります。

これらの条件のいずれかが偽の場合、 anchor()関数は 指定されたフォールバック値で算出されます。 フォールバック値が指定されていない場合、 それを参照する宣言は算出値時点で無効となります。

3.3. スクロールの考慮

パフォーマンス上の理由から、 実装は通常、スクロール処理を別のスクロール/「合成」スレッドで行います。 このスレッドは能力が非常に限られており (単純な移動や変形などは可能ですが、レイアウトなど高コストな処理は不可)、 そのためスクロールへの応答は人間の知覚上「瞬時」となるほど高速です。

スクロールによってアンカーポジション要素が単に移動するだけなら、 理論的には問題ありません。 移動はスクロールスレッドで実行できるので、 配置要素はスクロールコンテンツとともに滑らかに動きます。 しかし、アンカーポジショニングは 要素が自分自身の反対側の辺の位置を 異なるスクロールコンテキストの要素に依存させることができます。 これにより、スクロールで一方の辺だけが動いてサイズが変わり、 レイアウトが発生する可能性があります。 これはスクロールスレッドでは処理できません!

この問題を補うため、 かつ可能な限り多様なアンカーへの自由な参照を可能にするために、 アンカーポジショニング記憶されたスクロールオフセットスクロール補正の組み合わせを利用します。

技術的な詳細ですが、要点は以下の通りです:

結果として、アンカーポジショニングは通常「そのまま動作」しますが、 スクロールへの応答には制限がある場合があります。

アンカー再計算ポイントは、 絶対位置指定要素において ボックス生成が開始されたとき (display:noneまたはdisplay:contentsから 他のdisplay値に切り替わるとき)に発生します。 これはCSSアニメーション開始時と同じタイミングです。

また、アンカー再計算ポイントは、 要素の位置フォールバックスタイル決定時にも発生し、 フォールバックスタイルが変更された場合は選択されたスタイルに対応する アンカー再計算ポイントを使用します。

要素absposに対して アンカー再計算ポイントが発生すると、 absposアンカー参照で参照される各要素anchorごとに 記憶されたスクロールオフセットを関連付けます。 これは、anchorのすべてのスクロールコンテナ祖先の スクロールオフセットの合計値 (ただしabspos包含ブロックより上は除く)です。 記憶されたスクロールオフセットは、 position: stickyなど 他のスクロール依存の位置変更も考慮します。 absposデフォルトアンカー要素を持つ場合は、 記憶されたスクロールオフセットを必ず計算します。 (実際にアンカー参照がなくても。)

すべてのアンカー参照は、 すべてのスクロールコンテナ初期スクロール位置にあるかのように計算し、 その後で関連付けられた記憶されたスクロールオフセットを加算します。

変形(transform)もスクロールと同様の問題があるため、 アンカーポジショニングは通常それらを考慮しません。 ここでtransformの効果も取り込めるか再検討してください。

上記により、配置要素はアンカー参照のスクロール位置に一度だけ応答できますが、 いずれかがスクロールされると配置要素はもはやその要素にアンカーされているようには見えません (非スクロールの移動には引き続き応答します)。 この問題は一般的には解決できませんが、 1つアンカー参照のスクロールには応答できます。 具体的には、デフォルトアンカー要素です:

絶対位置指定ボックス absposは、 水平・垂直軸それぞれについて以下2つの条件を満たす場合 スクロール補正を行います。

注: absposposition options listを持つ場合、 その軸でスクロール補正を行うかどうかは 適用されたフォールバックスタイルにも影響されます。

absposデフォルトスクロールシフトは、 水平・垂直軸それぞれの長さのペアです。 各長さは以下で計算されます:

レイアウト処理後、absposデフォルトスクロールシフト分だけ追加的にシフトされます。 このシフトは他のtransformよりも前に transformのように適用されます。

スナップショットの正確なタイミングを定義してください: 毎フレーム更新、スタイル再計算の前。

記憶されたスクロールオフセットと同様に、 デフォルトアンカー要素のtransformも考慮できますか?

注: 記憶されたスクロールオフセットanchor()関数の値に影響しますが、 デフォルトスクロールシフトは 要素自体を直接シフトします。 これはインセットプロパティの値決定、アラインメント適用などのになります。 通常は区別できませんが、 round(anchor(outside), 50px)のように デフォルトアンカー要素の位置を非線形に変形する場合は挙動の違いが現れます。

4. アンカー基準の整列

4.1. エリア固有のデフォルト整列

position-areanoneでない場合、 normalセルフアラインメント値の挙動は <position-area>値に応じて変化し、 ボックスはアンカー側へ整列されます:

ただし、関連軸のインセットプロパティinset propertyが1つだけautoの場合、 デフォルト整列は非autoインセットの辺に向かい、 これはunsafeな整列です。

注: この単一auto挙動は、 1つだけ指定されたインセットが絶対位置ボックスの位置を制御する従来の方法を維持します。

例えば、英語相当の書字モード(horizontal-tb, ltr)の場合、 span-x-start topという値は 垂直軸のstart領域、 および水平軸のstartcenter領域に解決されます。 したがって、デフォルトの整列はalign-self: end (ボックスの下端マージン端top領域の下端と揃う) およびjustify-self: end (ボックスの終端側マージン端span-start領域の終端側と揃う)となります。
ボックスがinset-modified包含ブロックからはみ出した場合でも、 元の包含ブロック内には収まる場合、 デフォルトでは「元の包含ブロック」内に収まるようシフトします(通常の整列を破る場合も)。 詳細はCSS Box Alignment 3 § 4.4 オーバーフロー整列:safe/unsafeキーワードとスクロール安全制限参照。

この挙動により、配置ボックスが意図した範囲内に収まり可視性が保たれやすくなります。 例えばposition-area: bottom span-rightでは、 配置ボックスがアンカー左端から包含ブロック右端まで伸び、左揃えになります。 ただしボックスがその領域より大きい場合(アンカーが画面右端近い場合など)は、 左側へシフトして表示を保ちます。

4.2. アンカー中央揃え:anchor-center整列値

名前: justify-self, align-self, justify-items, align-items
新しい値: anchor-center

セルフアラインメントプロパティは、 絶対位置指定ボックスinset-modified包含ブロック内で自身を整列することを可能にします。 既存値と適切なインセットプロパティの組み合わせで 多くの整列が実現できますが、 アンカー基準配置の典型例である「アンカー中央揃え」は複雑な設定が必要でした。

新しいanchor-center値により、 このケースが非常に簡単になります。 配置ボックスがデフォルトアンカーボックスを持つ場合、 可能な限りその上で中央揃えされます。

さらに、 autoインセットプロパティ0に解決されます。

ボックスが絶対位置指定でない、またはデフォルトアンカーボックスを持たない場合は、 この値はcenterと同じ挙動となり、 インセットプロパティの解決に追加効果はありません。

注: anchor-center使用時、 アンカーがボックスの元の包含ブロック端付近にある場合は、 完全な中央揃えから「シフト」し、 元の包含ブロック内に収めます。 詳細はCSS Box Alignment 3 § 4.4 オーバーフロー整列:safe/unsafeキーワードとスクロール安全制限を参照。

4.3. 条件付き中央揃え:dialog整列値

名前: justify-self, align-self, justify-items, align-items
新しい値: dialog

ダイアログボックスは多くの場合、画面中央に表示されますが、 他の要素にアンカーされている場合はその限りではありません。

新しいdialog値により、 この挙動を指定できます。 ボックスが絶対位置指定position-area値がnoneでない場合、 normalとして整列されます (§ 4.1 エリア固有のデフォルト整列参照)。 それ以外はcenterとして整列されます。

5. アンカー基準のサイズ指定

絶対位置指定ボックスは、 anchor-size()関数を サイズ指定プロパティで利用し、 1つ以上のアンカーボックスのサイズを参照できます。 anchor-size()関数は <length>に解決されます。 この関数は許可された@position-tryプロパティでのみ使用可能(それ以外では無効)です。

5.1. anchor-size()関数

名前: width, height, min-width, min-height, max-width, max-height, top, left, right, bottom, margin-top, margin-left, margin-right, margin-bottom
新しい値: <anchor-size()>
anchor-size() = anchor-size( [ <anchor-name> || <anchor-size> ]? , <length-percentage>? )
<anchor-size> = width | height | block | inline | self-block | self-inline

anchor-size()関数はanchor()関数に似ていて 同じ引数を取りますが、<anchor-side>キーワードの代わりに<anchor-size>を使い、 対向する2辺の距離を参照します。

物理<anchor-size>キーワード (width およびheight) はそれぞれターゲットアンカー要素の 幅・高さを指します。 anchor()とは異なり、軸一致の制約はありません。 例えばwidth: anchor-size(--foo height);も有効です。

論理<anchor-size>キーワード (block, inline, self-block, self-inline) は、物理キーワードのどれに対応するか ボックス自身の書字モード (self-block/self-inline)または ボックスの包含ブロック書字モード(block/inline)により決定されます。

<anchor-size>キーワードを省略した場合、 使用しているプロパティの軸に合うキーワードとして動作します (例:width: anchor-size()width: anchor-size(width)と同じ意味)。

anchor-size()関数が 解決可能なanchor-size関数の場合、 算出値の時点(スタイル・レイアウトインターリーブ利用)で、 <length>、 つまり該当軸の両端(左右または上下)の距離で ターゲットアンカー要素アンカーボックスの辺を分離します。

5.1.1. anchor-size()の解決

anchor-size()関数は、 以下すべての条件を満たす場合のみ 解決可能なanchor-size関数となります。

これらの条件のいずれかが偽の場合、 anchor-size()関数は指定されたフォールバック値に解決されます。 フォールバック値が指定されていない場合、 それを参照する宣言は算出値時点で無効となります。

6. オーバーフロー管理

アンカーポジショニングは強力ですが、 予測不可能な場合もあります。 アンカーボックスはページ上のどこにでもあり得るため、 (例えばアンカーの上側や右側など)特定の方法でボックスを配置しようとすると、 配置ボックスが包含ブロックからはみ出したり、 画面の一部が見切れてしまうことがあります。

これを緩和するため、絶対位置指定ボックスは position-try-fallbacksプロパティを使って、 複数の配置・整列プロパティのバリアントセット (既存のスタイルから生成するか、 @position-tryルールで指定)を参照できます。 UAは、初期位置でボックスがはみ出した場合にこれらを順に適用し、 包含ブロックからはみ出さない最初のものを採用します。

position-try-orderは、 これらの選択肢を定義される空間の広さでソートすることもでき、 ボックスができるだけ広いスペースを持つことが重要な場合に 宣言順よりも優先できます。

6.1. フォールバック指定:position-try-fallbacksプロパティ

名前: position-try-fallbacks
値: none | [ [<dashed-ident> || <try-tactic>] | <position-area> ]#
初期値: none
適用対象: 絶対位置指定ボックス
継承: no
パーセンテージ: n/a
算出値: 指定通り
標準順序: 構文通り
アニメーション型: 離散

このプロパティは、絶対位置指定ボックスinset-modified包含ブロックからはみ出したときに 試行する代替配置スタイルのリストを提供します。 この位置オプションリストは 初期状態では空です。

リスト内の各カンマ区切りエントリが個別のオプションです: @position-tryブロックの名前か、 ボックスの既存算出スタイルを自動変形する <try-tactic>です。

値の意味は以下の通りです:

none

このプロパティは効果を持ちません。 ボックスの位置オプションリストは空です。

<dashed-ident>

指定名の@position-tryルールがあれば、 その関連する位置オプション位置オプションリストに追加されます。

なければ、この値は効果を持ちません。

<try-tactic>

指定キーワードに従いtry-tacticによる値入れ替えを行い、 ボックスの算出スタイルから自動で位置オプションを作成し、 位置オプションリストに追加します。

<try-tactic> = flip-block || flip-inline || flip-start
flip-block

block軸の値(例:margin-block-startmargin-block-endなど)を入れ替え、 本質的にinline軸上で鏡像化します。

flip-inline

inline軸の値を入れ替え、 本質的にblock軸上で鏡像化します。

flip-start

startプロパティ同士、 及びendプロパティ同士 (例:margin-block-startmargin-inline-startなど)を入れ替え、 start-startコーナーから end-endコーナーへの対角線上で鏡像化します。

複数キーワードが指定された場合、 変形を順に合成して1つの位置オプションを作成します。

<dashed-ident> || <try-tactic>

前2つの効果を組み合わせます。 指定名の@position-tryルールがあれば、 その位置オプションを ベーススタイルに適用した上で、 指定<try-tactic>で変形し、 結果を位置オプションリストに追加します。

なければ何もしません。

<position-area>

指定値のposition-areaプロパティのみで構成される 位置オプションを自動生成します。

try-tacticによる値入れ替えを 要素elの2つの方向directions間で行い、 スタイルセットを返します:
  1. directionsが同軸の反対方向なら「opposing」、 異なる軸指定なら「perpendicular」とします。

  2. 許可された@position-tryプロパティelについて指定値を取得し、stylesとします。

  3. 変数代入env()関数、 その他任意の置換関数styles内で代入します。

    env()関数の場合、 参照する環境変数が方向や軸に関連している場合 (例:safe-area-inset-top)、 directionsに対応する参照先環境変数を切り替えます。

    例:top: env(safe-area-inset-top);が指定され、 directionsがupとleftの場合、 env()env(safe-area-inset-left)と指定されたかのように解決されます。 (次のステップで、実際にleftプロパティに値を入れ替えます。)
  4. directionsに対応する関連プロパティ同士でstylesの値を入れ替えます。

    例:"top"と"left"を入れ替えるなら、 margin-topmargin-leftwidthheightなどを入れ替えます。

    注: 方向が同軸の反対方向の場合、 widthalign-selfなど、 方向間で値が変わらないものもあり、次のステップで値が修正される場合もあります。

  5. 入れ替えた新しい方向に合わせてプロパティ値を修正します:

  6. stylesを返します。

6.2. フォールバックの順序決定:position-try-orderプロパティ

名前: position-try-order
値: normal | <try-size>
初期値: normal
適用対象: 絶対位置指定ボックス
継承: no
パーセンテージ: n/a
算出値: 指定通り
標準順序: 構文通り
アニメーション型: 離散

このプロパティは位置オプションリストが試行される順序を指定します。

<try-size> = most-width | most-height | most-block-size | most-inline-size
normal

位置オプションposition-try-fallbacksで指定した順に試みます。

most-width
most-height
most-block-size
most-inline-size

位置オプションリストの各エントリについて、 その位置オプションを適用し、 そのスタイルで得られるinset-modified包含ブロックのサイズを調べます。 このサイズでリストを安定ソートし、最大のものを先頭にします。

例えば、次のスタイルは ポップアップリストをアンカーボタンの下に配置しますが、 はみ出す場合は、下に維持するか上に移動するかを、 どちらがより広いスペースを確保できるかで決定します。
.anchor { anchor-name: --foo; }
.list {
  position: fixed;
  position-anchor: --foo;
  position-area: block-end span-inline-end;
  align-self: start;
  position-try-fallbacks: --bottom-scrollable, flip-block, --top-scrollable;
  position-try-order: most-height;
}
@position-try --bottom-scrollable {
  align-self: stretch;
}
@position-try --top-scrollable {
  position-area: block-start span-inline-end;
  align-self: stretch;
}

flip-blockの自動生成オプションと --top-scrollableオプションは どちらも包含ブロックの上端からアンカーの上端まで垂直に伸びるため、 利用可能な高さは常に同じになり、指定順のままとなります。 これにより、まずアンカーに自然な高さで揃え (align-self: end、ベーススタイルから自動逆転)を試し、 それでもはみ出す場合は、スペースを埋めてスクロール可能な状態にフォールバックします。

6.3. ショートハンド:position-try

名前: position-try
値: <'position-try-order'>? <'position-try-fallbacks'>
初期値: 個々のプロパティ参照
適用対象: 個々のプロパティ参照
継承: 個々のプロパティ参照
パーセンテージ: 個々のプロパティ参照
算出値: 個々のプロパティ参照
アニメーション型: 個々のプロパティ参照
標準順序: 構文通り

このショートハンドはposition-try-fallbacksposition-try-order両方を設定します。 <'position-try-order'>を省略した場合、 プロパティの初期値が設定されます。

6.4. @position-tryルール

@position-tryルールは、 名前付きの位置オプションを定義し、 1つ以上の配置プロパティセットを指定して、 position-try-fallbacks経由でボックスに適用できます。

@position-tryルールの構文は以下の通りです:

@position-try <dashed-ident> {
  <declaration-list>
}

前置部で指定された<dashed-ident>がルール名です。 同名の@position-tryルールが複数ある場合、 カスケード@keyframeルールと同様に動作します。

@position-tryルールは、許可プロパティのみ受け付けます:

<declaration-list>内のプロパティで!importantを使うのは無効です。 そうするとそのプロパティ自体が無効になりますが、 ルール全体が無効になるわけではありません。

@position-try内のすべてのプロパティは 位置フォールバック起点の一部としてボックスに適用されます。 これは新しいカスケード起点で、 著者起点アニメーション起点の間に位置します。

アニメーション起点と同様、 revert値は あたかも著者起点の一部であるかのように動作し、 代わりにユーザー起点に戻ります。 (ただしアニメーション起点と同じく revert-layerは特別な挙動はなく指定通りです。)

注: 許可プロパティは ボックス自体のサイズと位置だけに影響する最小限のグループです。 これによりフォールバック実装が大幅に簡素化され、 空間に合わせてアンカーポジションボックスを移動するという根本ニーズに対応できます。 これらのルールは著者起点の通常宣言を上書きするため、 @position-try宣言と 通常のカスケード・継承の悪影響も限定されます。 将来的にはコンテナクエリ拡張により、 使用中のフォールバックスタイルに基づく要素のクエリが可能になることが期待され、 この制限リストでは許可されない条件付きスタイリングも実現できるでしょう。

注: 異なるアンカーを使う複数ボックスが 同じフォールバック配置を使いたい場合は、 <anchor-name>anchor()で省略し、 それぞれのボックスのアンカーはposition-anchorで指定します。

注: フォールバック配置として最も一般的なタイプ (通常はアンカーの一方に配置し、必要なら反対側に反転する)は、 position-try-fallbacksのキーワードだけで自動実装可能で、 @position-tryは不要です。

6.5. フォールバックの適用

配置ボックスが (default scroll shiftでシフト済み)、 inset-modified包含ブロックからはみ出し、 かつ非空の位置オプションリストを持つ場合、 フォールバックスタイル決定を行い、 はみ出しを回避できるオプションを探します。

これらの修正スタイルはインターリーブで要素に適用され、 算出値(トランジション等も可能)に影響し、 レイアウトや使用値にも依存します。

このセクションをより明確かつ正確に書きなおしてください。 Issue 12818, Issue 12890参照。

位置オプションを適用するには、 ボックス要素el位置オプション new stylesを与えて:
  1. new styles位置フォールバック起点にカスケード挿入し、 カスケードを解決し、el使用スタイルが判定できるまでレイアウトします。

    これらのスタイル計算では、 仮想アンカー再計算ポイントを計算し、 その結果得られた仮想記憶スクロールオフセットを使って elのスタイルを決定します。

  2. el使用スタイルを返します。

要素abspos位置フォールバックスタイル決定
  1. current stylesabsposの現在の使用スタイル(以前のフォールバック結果の場合もある)とする。

  2. optionposition options listから:

    1. optionが現在abspos最後に成功した位置オプションなら、 次へ

    2. adjusted styles位置オプション適用optionabsposに適用した結果とする。

    3. el rectabsposのmargin boxのサイズ・位置、 cb rectabsposinset-modified包含ブロックのサイズ・位置とし、 adjusted stylesでレイアウトした値とする。

    4. cb rectがどちらかの軸で負のサイズでゼロサイズに補正された場合、 次へ

      注: これはゼロサイズのel rectが 負のサイズのcb rect内に「入っている」とみなされて成功オプションに選ばれるのを防ぎます。

    5. el rectcb rectに完全に含まれていなければ、 次へ

    6. adjusted stylesとその仮想的に計算された記憶されたスクロールオフセットのセットを返す。

  3. アサート: 前ステップがoverflowしない位置オプションを見つけずに終了した。

  4. current stylesを返す。

注: 子孫がelからはみ出していても この計算には影響しません。el自身のmargin boxのみ判定対象です。

注: 現在有効な位置オプションは 意図的にスキップするため、 それの記憶されたスクロールオフセットは更新されません。 他のフォールバックが機能せず現在のスタイルを維持する場合、 記憶されたスクロールオフセットは全て同じままとなります。

完全なレイアウトパス中、 ボックスがフォールバックスタイルを決定(または使用しないと決定)した後は、 後でレイアウトされる他のボックスがこの決定を変更することはできません。

例えば、配置ボックスAとBがあるとしてAがBより先にレイアウトされる場合。 Bがはみ出してAの包含ブロックにスクロールバーが付き、 それによってAが再度フォールバックスタイル判定をやり直すことはない。 (最悪の場合、レイアウトコストが指数的に増え、 最悪の場合、循環して永遠に安定しません。)

つまりレイアウトは「後戻り」しません。

ResizeObserver イベントの判定・配信時:

注: この記録・削除のタイミングは last remembered sizesの扱いと意図的に同じです。

実装は、位置オプションリストの長さに実装定義の上限を設けてもよいですが、 この制限は最低5以上でなければなりません。

例えば、次のCSSはまず「popover」を要素下に配置しようとし、 画面に収まらなければ上へ切り替えます。 デフォルトは左揃えですが、収まらなければ右揃えに切り替えます。
#myPopover {
  position: fixed;
  top: anchor(--button bottom);
  left: anchor(--button left);
  position-try-fallbacks: flip-inline, flip-block, flip-block flip-inline;

  /* ポップオーバーはボタンと同じ幅以上 */
  min-width: anchor-size(--button width);

  /* ポップオーバーは最低2メニュー項目分の高さ */
  min-height: 6em;
}

6.6. 条件付き非表示:position-visibility プロパティ

名前: position-visibility
値: always | [ anchors-valid || anchors-visible || no-overflow ]
初期値: anchors-visible
適用対象: 絶対位置指定ボックス
継承: no
パーセンテージ: n/a
算出値: 指定通り
標準順序: 構文通り
アニメーション型: 離散

絶対位置指定ボックス(absolutely positioned box)の表示が 意味を持たない場合があります。 このプロパティは、よく必要とされるレイアウト条件に応じて そのようなボックスを条件付きで表示することを可能にします。

always

このプロパティは効果を持ちません。 (アンカーやオーバーフロー状態に関係なくボックスが表示されます。)

anchors-valid

ボックスの必須アンカー参照のいずれかが ターゲットアンカー要素に解決されない場合、 ボックスのvisibilityプロパティはforce-hiddenに算出されます。

必須アンカー参照とは何か? フォールバック値のないanchor()関数? デフォルトアンカーは「時々」? ここは要詳細化。

どれかアンカーが不足か、 すべてアンカーが不足か? どちらもユースケースが考えられる。 決定するか制御可能にすべきか?

anchors-visible

ボックスにデフォルトアンカーボックスがある場合、 そのアンカーボックス不可視または 介在ボックスによりクリップされている場合、 ボックスのvisibilityプロパティはforce-hiddenに算出されます。

no-overflow

ボックスがinset-modified包含ブロックから position-try適用後もはみ出している場合、 ボックスのvisibilityプロパティはforce-hiddenに算出されます。

アンカーボックスanchorが その上に配置されたボックスabsposに対して 介在ボックスによりクリップ されているとは、 anchorインクオーバーフロー矩形anchorの祖先であり かつabsposの包含ブロックの子孫であるボックスによって 完全にクリップされている場合を指します。 ここでのクリップは、overflowペイントcontainmentなど overflow clip edgeへのクリップのみを指します。

可視性判定のタイミング定義要。 [Issue #12732]

注: 例えばabsposがアンカー要素の隣にDOM上存在する場合、 デフォルトアンカーがスクロールアウトしても 同じスクローラーでクリップされるため可視性が維持されます。

このクリップ定義が View Transitionsで使う類似概念と整合するか要確認。

注: 「連鎖アンカー」状況では、 最初のabsposがこのプロパティで(アンカーがスクロールアウトして)非表示となれば、 それをアンカーにしている他のabsposも非表示となり、 同じく意味不明な位置に浮かぶことがなくなります。

7. アクセシビリティへの影響

アンカーポジショニングは 配置ボックスとアンカー間に セマンティックな関係を自動的に確立するものではありません。 様々な用途で使えるためです。 著者は、単なる視覚的な配置だけで 要素同士をセマンティックに関連付けることに依存してはなりません。 追加的な支援なしでは、 要素間に意味のあるDOM関係が全くないことが多く、 スクリーンリーダー等の非視覚的ユーザーエージェントで利用困難になります。

ウェブプラットフォームには、 既存・新規ともに このような関係を明示的に確立できる機能が多数あります。 そのため非視覚的ユーザーエージェントでも恩恵を受けられます。

例えば、HTMLのPopover APIは 呼び出しボタンとポップオーバー要素を自動的にリンクし、 タブ順も自動調整されます。 さらに呼び出しボタンが ポップオーバーの暗黙的アンカー要素となり、 アンカーポジショニングも簡単に利用できます。

ポップオーバーの例を追加すること。

より一般的な場合には、 ARIAのaria-detailsaria-describedby属性を アンカー要素に付与することで 少し手動の方法で情報を提供できます。 配置要素側で role 属性を指定すれば、 非視覚的ユーザーエージェントは 要素間の関係をユーザーに通知し、 要素間の自動ナビゲーションも可能になります。

8. DOMインターフェイス

8.1. CSSPositionTryRuleインターフェイス

CSSPositionTryRule インターフェイスは @position-tryルールを表します:

[Exposed=Window]
interface CSSPositionTryRule : CSSRule {
  readonly attribute CSSOMString name;
  [SameObject, PutForwards=cssText] readonly attribute CSSPositionTryDescriptors style;
};

[Exposed=Window]
interface CSSPositionTryDescriptors : CSSStyleDeclaration {
  attribute CSSOMString margin;
  attribute CSSOMString marginTop;
  attribute CSSOMString marginRight;
  attribute CSSOMString marginBottom;
  attribute CSSOMString marginLeft;
  attribute CSSOMString marginBlock;
  attribute CSSOMString marginBlockStart;
  attribute CSSOMString marginBlockEnd;
  attribute CSSOMString marginInline;
  attribute CSSOMString marginInlineStart;
  attribute CSSOMString marginInlineEnd;
  attribute CSSOMString margin-top;
  attribute CSSOMString margin-right;
  attribute CSSOMString margin-bottom;
  attribute CSSOMString margin-left;
  attribute CSSOMString margin-block;
  attribute CSSOMString margin-block-start;
  attribute CSSOMString margin-block-end;
  attribute CSSOMString margin-inline;
  attribute CSSOMString margin-inline-start;
  attribute CSSOMString margin-inline-end;
  attribute CSSOMString inset;
  attribute CSSOMString insetBlock;
  attribute CSSOMString insetBlockStart;
  attribute CSSOMString insetBlockEnd;
  attribute CSSOMString insetInline;
  attribute CSSOMString insetInlineStart;
  attribute CSSOMString insetInlineEnd;
  attribute CSSOMString top;
  attribute CSSOMString left;
  attribute CSSOMString right;
  attribute CSSOMString bottom;
  attribute CSSOMString inset-block;
  attribute CSSOMString inset-block-start;
  attribute CSSOMString inset-block-end;
  attribute CSSOMString inset-inline;
  attribute CSSOMString inset-inline-start;
  attribute CSSOMString inset-inline-end;
  attribute CSSOMString width;
  attribute CSSOMString minWidth;
  attribute CSSOMString maxWidth;
  attribute CSSOMString height;
  attribute CSSOMString minHeight;
  attribute CSSOMString maxHeight;
  attribute CSSOMString blockSize;
  attribute CSSOMString minBlockSize;
  attribute CSSOMString maxBlockSize;
  attribute CSSOMString inlineSize;
  attribute CSSOMString minInlineSize;
  attribute CSSOMString maxInlineSize;
  attribute CSSOMString min-width;
  attribute CSSOMString max-width;
  attribute CSSOMString min-height;
  attribute CSSOMString max-height;
  attribute CSSOMString block-size;
  attribute CSSOMString min-block-size;
  attribute CSSOMString max-block-size;
  attribute CSSOMString inline-size;
  attribute CSSOMString min-inline-size;
  attribute CSSOMString max-inline-size;
  attribute CSSOMString placeSelf;
  attribute CSSOMString alignSelf;
  attribute CSSOMString justifySelf;
  attribute CSSOMString place-self;
  attribute CSSOMString align-self;
  attribute CSSOMString justify-self;
  attribute CSSOMString positionAnchor;
  attribute CSSOMString position-anchor;
  attribute CSSOMString positionArea;
  attribute CSSOMString position-area;
};

そのname属性は、 規則プレリュードで宣言された名前を表します。

そのstyle属性は、 規則本体で宣言されたプロパティを 指定順で表します。 取得時には、CSSPositionTryDescriptors オブジェクトを返します。 @position-tryアトルール用であり、 以下のプロパティを持ちます:

computed flag

未設定

readonly flag

未設定

declarations

規則中で宣言された記述子を指定順で並べたもの。

parent CSS rule

コンテキストオブジェクト

owner node

Null

9. 付録:スタイルとレイアウトのインターリーブ

スタイルとレイアウトのインターリーブとは、 レイアウト処理中にサブツリーにスタイル更新が発生し、 要素の算出スタイルが遡って更新される技法です。

この概念はこの仕様書の正しい場所ではなく、 Cascadeに入るべきですが、 参照用のスケッチが必要なので暫定で記載しています。

注: スタイルとレイアウトのインターリーブコンテナクエリコンテナクエリ長ですでに使われています。 10cqwのような長さは クエリコンテナのサイズ情報を用いて算出長に解決され、 コンテナサイズがレイアウト間で変化すると トランジションが発生します。

許可された@position-tryプロパティも フォールバック解決時にインターリーブされます (position-try参照)。

当然詳細化が必要ですが、 今は「コンテナクエリと同様に振る舞う」で十分です。 この挙動も未定義ですが、少なくともある程度は相互運用されているようです。

10. セキュリティに関する考慮事項

この文書に対してセキュリティ上の問題は報告されていません。

11. プライバシーに関する考慮事項

この文書に対してプライバシー上の問題は報告されていません。

12. 変更点

2025年5月9日作業草案以降の主な変更点:

以前の変更点はPrevious Changes参照。

適合性

文書の規約

適合性要件は、記述的な断言とRFC 2119の用語の組み合わせで表現されています。規範的な部分で使われている “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” というキーワードはRFC 2119で記載された通りに解釈してください。 ただし、読みやすさのため、この仕様書ではこれらの単語はすべて大文字ではありません。

この仕様書の本文は、明示的に非規範と記載されたセクション、例、および注釈以外はすべて規範的です。[RFC2119]

この仕様書内の例は「例えば」という導入語で始まるか、class="example"として規範文から区別されます。例えば:

これは情報提供的な例です。

情報提供的な注釈は「注:」で始まり、class="note"で区別されます。例えば:

注: これは情報提供的な注釈です。

アドバイス文は規範的なセクションとして特別な注意を喚起するスタイルになっており、<strong class="advisement">で他の規範文と区別されます。例えば: UAはアクセシブルな代替手段を必ず提供しなければなりません。

適合性クラス

この仕様書への適合性は 3つの適合クラスで定義されています:

スタイルシート
CSSスタイルシート
レンダラー
UA(ユーザーエージェント)。 スタイルシートの意味を解釈し、それを使った文書をレンダリングします。
オーサリングツール
UA。 スタイルシートを作成するツール。

スタイルシートは、 このモジュールで定義された文法を使った全ての記述が 一般CSS文法と各機能固有の文法に従い有効である場合、 この仕様に適合しているとみなされます。

レンダラーは、 スタイルシートを適切な仕様通りに解釈することに加え、 この仕様で定義された全ての機能を正しくパースし、 それに従い文書をレンダリングする場合に この仕様に適合しているとみなされます。ただし、UAがデバイスの制限により 文書を正しくレンダリングできない場合でも、非適合とはなりません。 (例:UAはモノクロモニターで色をレンダリングする必要はありません。)

オーサリングツールは、 一般CSS文法およびこのモジュールの各機能固有文法に従い 構文的に正しいスタイルシートを作成し、 本モジュールで記載されたスタイルシートの適合要件も満たす場合、 この仕様に適合しているとみなされます。

部分的実装

著者が将来互換性のあるパース規則を利用して フォールバック値を割り当てられるようにするため、 CSSレンダラーは必ず 利用できるレベルのサポートがない@規則、プロパティ、プロパティ値、キーワード、 その他の構文要素を無効として(適切に無視)しなければなりません。 特に、ユーザーエージェントは絶対に サポートされていない部分値のみを選択的に無視し、 サポートされている値だけを複数値プロパティ宣言で適用してはいけません。 どれかの値が無効(サポートされていない値は必ず無効です)なら、 CSS仕様では宣言全体を無視する必要があります。

不安定機能・独自拡張の実装

将来安定するCSS機能との衝突を避けるため、 CSSWGはベストプラクティスに従い 不安定な機能独自拡張の実装を推奨します。

非実験的実装

仕様がCandidate Recommendation段階に達したら 非実験的実装が可能となり、実装者は 仕様通り正しく実装できているCRレベル機能について ベンダープレフィックス無しの実装を公開するべきです。

CSSの相互運用性を確立・維持するため、 CSSワーキンググループは、非実験的CSSレンダラーに対し 実装報告(必要に応じてそのテストケースも)をW3Cへ提出するよう要請しています。 W3Cに提出されたテストケースはCSSワーキンググループによるレビューと修正の対象となります。

テストケースや実装報告の提出方法の詳細は、 CSSワーキンググループのウェブサイト https://www.w3.org/Style/CSS/Test/ を参照してください。 質問はpublic-css-testsuite@w3.org メーリングリストへ。

索引

この仕様で定義される用語

参照によって定義される用語

参考文献

規範的参考文献

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSSボックスアラインメントモジュール レベル3。2025年3月11日。WD。URL: https://www.w3.org/TR/css-align-3/
[CSS-BOX-4]
Elika Etemad。CSSボックスモデルモジュール レベル4。2024年8月4日。WD。URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad。CSSフラグメンテーションモジュール レベル4。2018年12月18日。FPWD。URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSSカスケーディングと継承 レベル5。2022年1月13日。CR。URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CASCADE-6]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSSカスケーディングと継承 レベル6。2024年9月6日。WD。URL: https://www.w3.org/TR/css-cascade-6/
[CSS-CONTAIN-2]
Tab Atkins Jr.; Florian Rivoal; Vladimir Levin。CSSコンテインメントモジュール レベル2。2022年9月17日。WD。URL: https://www.w3.org/TR/css-contain-2/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSSディスプレイモジュール レベル3。2023年3月30日。CR。URL: https://www.w3.org/TR/css-display-3/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSSディスプレイモジュール レベル4。2024年12月19日。FPWD。URL: https://www.w3.org/TR/css-display-4/
[CSS-ENV-1]
CSS環境変数モジュール レベル1。2025年9月23日。FPWD。URL: https://www.w3.org/TR/css-env-1/
[CSS-LOGICAL-1]
Rossen Atanassov; Elika Etemad。CSS論理プロパティと値 レベル1。2018年8月27日。WD。URL: https://www.w3.org/TR/css-logical-1/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal。CSSオーバーフローモジュール レベル3。2023年3月29日。WD。URL: https://www.w3.org/TR/css-overflow-3/
[CSS-OVERFLOW-4]
David Baron; Florian Rivoal; Elika Etemad。CSSオーバーフローモジュール レベル4。2023年3月21日。WD。URL: https://www.w3.org/TR/css-overflow-4/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS配置レイアウトモジュール レベル3。2025年3月11日。WD。URL: https://www.w3.org/TR/css-position-3/
[CSS-POSITION-4]
CSS配置レイアウトモジュール レベル4。2025年7月8日。FPWD。URL: https://www.w3.org/TR/css-position-4/
[CSS-PSEUDO-4]
Elika Etemad; Alan Stearns。CSS疑似要素モジュール レベル4。2025年6月27日。WD。URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad。CSSスコーピングモジュール レベル1。2014年4月3日。FPWD。URL: https://www.w3.org/TR/css-scoping-1/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad。CSSボックスサイズモジュール レベル3。2021年12月17日。WD。URL: https://www.w3.org/TR/css-sizing-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin。CSS構文モジュール レベル3。2021年12月24日。CRD。URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TRANSFORMS-1]
Simon Fraser; 他。CSSトランスフォームモジュール レベル1。2019年2月14日。CR。URL: https://www.w3.org/TR/css-transforms-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad。CSS値と単位モジュール レベル3。2024年3月22日。CRD。URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad。CSS値と単位モジュール レベル4。2024年3月12日。WD。URL: https://www.w3.org/TR/css-values-4/
[CSS-VALUES-5]
Tab Atkins Jr.; Elika Etemad; Miriam Suzanne。CSS値と単位モジュール レベル5。2024年11月11日。WD。URL: https://www.w3.org/TR/css-values-5/
[CSS-VARIABLES-1]
Tab Atkins Jr.. CSSカスタムプロパティ(カスケーディング変数)モジュール レベル1。2022年6月16日。CR。URL: https://www.w3.org/TR/css-variables-1/
[CSS-VIEWPORT-1]
Florian Rivoal; Emilio Cobos Álvarez。CSSビューポートモジュール レベル1。2024年1月25日。FPWD。URL: https://www.w3.org/TR/css-viewport-1/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii。CSS書字モード レベル4。2019年7月30日。CR。URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; 他。カスケーディングスタイルシート レベル2改訂1(CSS 2.1)仕様。2011年6月7日。REC。URL: https://www.w3.org/TR/CSS2/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez。CSSオブジェクトモデル(CSSOM)。2021年8月26日。WD。URL: https://www.w3.org/TR/cssom-1/
[DOM]
Anne van Kesteren。DOM標準。リビングスタンダード。URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; 他。HTML標準。リビングスタンダード。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola。Infra標準。リビングスタンダード。URL: https://infra.spec.whatwg.org/
[MOTION-1]
Tab Atkins Jr.; Dirk Schulze; Jihye Hong。モーションパスモジュール レベル1。2024年11月5日。WD。URL: https://www.w3.org/TR/motion-1/
[RESIZE-OBSERVER-1]
Aleks Totic; Greg Whitworth。Resize Observer。2020年2月11日。FPWD。URL: https://www.w3.org/TR/resize-observer-1/
[RFC2119]
S. Bradner。RFCで要件レベルを示すキーワード。1997年3月。Best Current Practice。URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. セレクター レベル4。2022年11月11日。WD。URL: https://www.w3.org/TR/selectors-4/
[STREAMS]
Adam Rice; 他。Streams標準。リビングスタンダード。URL: https://streams.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu。Web IDL標準。リビングスタンダード。URL: https://webidl.spec.whatwg.org/

参考情報文献

[CSS-CONDITIONAL-5]
Chris Lilley; 他。CSS条件付きルールモジュール レベル5。2024年11月5日。WD。URL: https://www.w3.org/TR/css-conditional-5/
[CSS-SHADOW-PARTS-1]
Tab Atkins Jr.; Fergal Daly。CSSシャドウパーツ。2018年11月15日。FPWD。URL: https://www.w3.org/TR/css-shadow-parts-1/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons。CSSボックスサイズモジュール レベル4。2021年5月20日。WD。URL: https://www.w3.org/TR/css-sizing-4/
[CSS-TRANSITIONS-1]
David Baron; 他。CSSトランジション。2018年10月11日。WD。URL: https://www.w3.org/TR/css-transitions-1/
[WEB-ANIMATIONS-1]
Brian Birtles; 他。Web Animations。2023年6月5日。WD。URL: https://www.w3.org/TR/web-animations-1/

プロパティ索引

プロパティ名 初期値 適用対象 継承 %指定 アニメーション型 標準順序 算出値
anchor-name none | <dashed-ident># none 主ボックスを生成するすべての要素 no n/a discrete 構文通り 指定通り
anchor-scope none | all | <dashed-ident># none すべての要素 no n/a discrete 構文通り 指定通り
position-anchor auto | <anchor-name> auto 絶対位置指定ボックス no n/a discrete 構文通り 指定通り
position-area none | <position-area> none デフォルトアンカーボックスを持つ配置ボックス no n/a TBD 構文通り キーワードnoneまたはキーワードペア、詳細は参照
position-try <'position-try-order'>? <'position-try-fallbacks'> 個々のプロパティ参照 個々のプロパティ参照 個々のプロパティ参照 個々のプロパティ参照 個々のプロパティ参照 構文通り 個々のプロパティ参照
position-try-fallbacks none | [ [<dashed-ident> || <try-tactic>] | <position-area> ]# none 絶対位置指定ボックス no n/a discrete 構文通り 指定通り
position-try-order normal | <try-size> normal 絶対位置指定ボックス no n/a discrete 構文通り 指定通り
position-visibility always | [ anchors-valid || anchors-visible || no-overflow ] anchors-visible 絶対位置指定ボックス no n/a discrete 構文通り 指定通り

IDL索引

[Exposed=Window]
interface CSSPositionTryRule : CSSRule {
  readonly attribute CSSOMString name;
  [SameObject, PutForwards=cssText] readonly attribute CSSPositionTryDescriptors style;
};

[Exposed=Window]
interface CSSPositionTryDescriptors : CSSStyleDeclaration {
  attribute CSSOMString margin;
  attribute CSSOMString marginTop;
  attribute CSSOMString marginRight;
  attribute CSSOMString marginBottom;
  attribute CSSOMString marginLeft;
  attribute CSSOMString marginBlock;
  attribute CSSOMString marginBlockStart;
  attribute CSSOMString marginBlockEnd;
  attribute CSSOMString marginInline;
  attribute CSSOMString marginInlineStart;
  attribute CSSOMString marginInlineEnd;
  attribute CSSOMString margin-top;
  attribute CSSOMString margin-right;
  attribute CSSOMString margin-bottom;
  attribute CSSOMString margin-left;
  attribute CSSOMString margin-block;
  attribute CSSOMString margin-block-start;
  attribute CSSOMString margin-block-end;
  attribute CSSOMString margin-inline;
  attribute CSSOMString margin-inline-start;
  attribute CSSOMString margin-inline-end;
  attribute CSSOMString inset;
  attribute CSSOMString insetBlock;
  attribute CSSOMString insetBlockStart;
  attribute CSSOMString insetBlockEnd;
  attribute CSSOMString insetInline;
  attribute CSSOMString insetInlineStart;
  attribute CSSOMString insetInlineEnd;
  attribute CSSOMString top;
  attribute CSSOMString left;
  attribute CSSOMString right;
  attribute CSSOMString bottom;
  attribute CSSOMString inset-block;
  attribute CSSOMString inset-block-start;
  attribute CSSOMString inset-block-end;
  attribute CSSOMString inset-inline;
  attribute CSSOMString inset-inline-start;
  attribute CSSOMString inset-inline-end;
  attribute CSSOMString width;
  attribute CSSOMString minWidth;
  attribute CSSOMString maxWidth;
  attribute CSSOMString height;
  attribute CSSOMString minHeight;
  attribute CSSOMString maxHeight;
  attribute CSSOMString blockSize;
  attribute CSSOMString minBlockSize;
  attribute CSSOMString maxBlockSize;
  attribute CSSOMString inlineSize;
  attribute CSSOMString minInlineSize;
  attribute CSSOMString maxInlineSize;
  attribute CSSOMString min-width;
  attribute CSSOMString max-width;
  attribute CSSOMString min-height;
  attribute CSSOMString max-height;
  attribute CSSOMString block-size;
  attribute CSSOMString min-block-size;
  attribute CSSOMString max-block-size;
  attribute CSSOMString inline-size;
  attribute CSSOMString min-inline-size;
  attribute CSSOMString max-inline-size;
  attribute CSSOMString placeSelf;
  attribute CSSOMString alignSelf;
  attribute CSSOMString justifySelf;
  attribute CSSOMString place-self;
  attribute CSSOMString align-self;
  attribute CSSOMString justify-self;
  attribute CSSOMString positionAnchor;
  attribute CSSOMString position-anchor;
  attribute CSSOMString positionArea;
  attribute CSSOMString position-area;
};

課題索引

より良い例を追加してください;この例はanchor-centerで簡単に実現できます。 [Issue #10776]
transformはスクロールと同じ問題を持つため、 アンカーポジショニングも通常はそれらを考慮しません。 ここでtransformの効果も取り込めるか?
スナップショットの正確なタイミングを定義してください: 毎フレーム更新、スタイル再計算の前。
記憶されたスクロールオフセット同様に、 デフォルトアンカー要素のtransformも考慮できますか?
このセクションをより分かりやすく、正確に書き直してください。 Issue 12818Issue 12890参照。
必須アンカー参照とは何か? anchor()関数でフォールバック値がないもの? デフォルトアンカーは「時々」? 詳細化必要。
どれかアンカーが不足か、 すべてアンカーが不足か? どちらもユースケースが考えられる。 決定するか制御可能にすべきか?
可視性判定のタイミング定義要。 [Issue #12732]
このクリップ定義がView Transitionsの類似概念と整合するか要確認。
ポップオーバーの例を追加すること。
この概念はこの仕様書の正しい場所ではなく、 Cascadeに入るべきですが、 参照用のスケッチが必要なので暫定で記載しています。
当然詳細化が必要ですが、 今は「コンテナクエリと同様に振る舞う」で十分です。 この挙動も未定義ですが、少なくともある程度は相互運用されているようです。