CSSスクロールアンカリングモジュール レベル1

W3C作業草案,

このバージョン:
https://www.w3.org/TR/2020/WD-css-scroll-anchoring-1-20201111/
最新公開バージョン:
https://www.w3.org/TR/css-scroll-anchoring-1/
編集者草案:
https://drafts.csswg.org/css-scroll-anchoring
以前のバージョン:
課題追跡:
CSSWG課題リポジトリ
編集者:
Steve Kobes (Google)
Tab Atkins-Bittner (Google)
この仕様への編集提案:
GitHub エディター

概要

可視領域より上にあるスクロールボックス内のDOM要素に変更があると、 ユーザーがコンテンツを閲覧している途中でページが移動してしまう可能性があります。

本仕様では、アンカーノードの位置を追跡し、スクロールオフセットを調整することで、この不快なユーザー体験を軽減する仕組みを提案します。

また、本仕様では、ウェブ開発者がこの挙動をオプトアウトできるAPIも提案します。

CSSは、構造化文書(HTMLやXMLなど)の描画を画面や紙などで記述するための言語です。

この文書のステータス

このセクションは、公開時点でのこの文書のステータスを説明しています。 他の文書がこの文書に取って代わる場合があります。 現在のW3Cの出版物一覧や、この技術レポートの最新版は https://www.w3.org/TR/ のW3C技術レポートインデックスで確認できます。

この文書は、CSSワーキンググループによって作業草案として公開されました。 作業草案として公開されたことは、W3C会員による承認を意味するものではありません。

この文書はドラフトであり、随時更新・差替え・廃止される可能性があります。 進行中の作業以外の文献としてこの文書を引用するのは適切ではありません。

ご意見は、GitHubで課題を提出(推奨)するか、 仕様コード「css-scroll-anchoring」をタイトルに含めてください。例: “[css-scroll-anchoring] …コメント要約…”。 すべての課題とコメントはアーカイブされています。 または、フィードバックはアーカイブされる公開メーリングリスト www-style@w3.orgへ送信できます。

この文書は 2020年9月15日付W3Cプロセス文書に従って管理されています。

この文書は、W3C特許ポリシーの下で活動するグループによって作成されました。 W3Cは、グループの成果物に関連して行われた特許開示の公開リストを管理しています。 このページには特許開示方法の説明も記載されています。 個人が特許の実際の知識を有し、その特許が必須クレームを含むと考える場合は、 W3C特許ポリシー第6節に従って情報を開示する必要があります。

1. はじめに

現在、ウェブの利用者は、ビューポート外で発生する変更によって コンテンツが移動し、注意がそがれることがよくあります。 例としては、スクリプトが広告を含むiframeを挿入したり、 サイズ指定されていない画像が遅いネットワークで読み込まれる場合などです。

従来、ブラウザーのデフォルトの挙動は このような変更が発生した際に絶対的なスクロール位置を維持することでした。 つまり、コンテンツのずれを防ぐには、 ウェブページが後で読み込まれるもののために ページ上にスペースを確保する必要があります。 実際には、このような対応を一貫して行っているサイトは少数です。

スクロールアンカリングは、意外なコンテンツのずれを最小限に抑えることを目的としています。 ビューポート外の変更に対してスクロール位置を調整することで これを実現します。

説明文書では スクロールアンカリングの概要を非公式に説明しています。

1.1. 値の定義

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

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

2. 説明

スクロールアンカリングは、レイアウト変更にまたがってユーザーの文書表示を安定させることを目指します。 DOMノード(アンカーノード)を選択し、 その移動をもとにスクロール位置の調整を行います。

ただし、スクロールコンテナーが現在スナップされている場合 ([CSS-SCROLL-SNAP-1]参照)、 スクロールアンカリングは再スナップで許容される調整に限定されます。

2.1. アンカーノードの選択

スクロールボックスは DOM内で深い位置にあり、重要なDOMノードとして優先されるべきか、 または最適表示領域のブロック開始端に近い アンカーノードを選択しようとします。

注: ユーザーエージェントがscroll-paddingプロパティに対応していない場合、 スクロールボックスの最適表示領域はその内容領域と同じです。

アンカーノードは、非アトミックインライン以外の どのボックスでもかまいません。 アンカーノードは常にスクロールボックスの子孫です。 場合によっては、スクロールボックスがアンカーノードを選択しないこともあります。

要素CがスクロールボックスSのスクロールアンカーとなる 有効な候補となるには、以下のすべての条件を満たす必要があります:

一部の要素は、アンカー選択のための優先候補とみなされます:

  1. 文書のフォーカス領域のDOMアンカー。

  2. find-in-pageユーザーエージェントアルゴリズムの 現在アクティブな選択一致を含む要素。 一致が複数の要素にまたがる場合は、最初の要素のみを考慮します。

なお、優先候補が非アトミックインライン要素の場合は、 その最も近い非アトミックインラインな祖先要素を優先候補として扱います。

アンカーノード選択アルゴリズムは、スクロールボックスSに対して以下の通りです:
  1. Sが、overflow-anchorプロパティの算出値が none となる要素に関連付けられている場合は、Sのアンカーノードを選択しません。

  2. それ以外の場合は、指定された順序で各優先候補PCについて、 PCS有効な候補であれば、アンカーノードとして選択し、終了します。

  3. それ以外の場合、Sに関連付けられた要素または文書の各DOM子Nについて、 候補調査アルゴリズムNSで実行し、 アンカーノードが選択された場合は終了します。

候補調査アルゴリズムは、候補DOMノードNとスクロールボックスSに対して以下の通りです:
  1. N除外サブツリーである場合、またはNS内で 完全にクリップされている場合は、何もしません(Nとその子孫はスキップされます)。

  2. NS内で完全に表示されている場合は、Nをアンカーノードとして選択します。

  3. Nが部分的に表示の場合:

    1. Nの各DOM子Cについて、 候補調査アルゴリズムCSで実行し、 アンカーノードが選択された場合は終了します。

    2. NをDOM親としないが、 N包含ブロックとする絶対位置指定要素Aについても、 候補調査アルゴリズムASで実行し、 アンカーノードが選択された場合は終了します。

    3. Nをアンカーノードとして選択します。 (このステップに達した場合、 Nの子孫の中に適切なアンカーノードが見つからなかったことを意味します。)

    注: より深いノードを選択することで、 アンカーノード内でビューポート外のコンテンツが変更されて表示がずれても、 スクロールアンカリングによる調整が発生しないという事態を最小限に抑えられます。

概念的には、スクロールボックスのスクロール位置が変更されるたびに 新しいアンカーノードが計算されます。 (パフォーマンス最適化のため、 実装ではアンカーノードが必要になるまで計算を遅らせる場合があります。)

DOMノードNは、以下のいずれかの条件に該当する場合、除外サブツリーです:
DOMノードNは、スクロールボックスS内で 完全に表示されているとは、 Nスクロールアンカリング境界矩形S最適表示領域内に完全に含まれている場合です。
DOMノードNは、スクロールボックスS内で 完全にクリップされているとは、 Nスクロールアンカリング境界矩形S最適表示領域の外側に完全にある場合です。
DOMノードNは、スクロールボックスS内で 部分的に表示されているとは、 NS完全に表示でも完全にクリップでもない場合です。
DOMノードNスクロールアンカリング境界矩形は、 Nスクロール可能なオーバーフロー矩形です。

2.2. スクロール調整

アンカーノードが選択された場合、 アンカーノードが移動すると、 ブラウザーはアンカーノードのスクロールアンカリング境界矩形のブロック開始端の 前回のオフセットy0と現在のオフセットy1を、 スクロール対象のコンテンツのブロックフロー方向のブロック開始端に対して計算します。

そして、スクロール位置に対し、ブロックフロー方向にy1 - y0の調整を 抑制ウィンドウの終了時に実行するようキューに入れます。

スクロール調整は、[CSSOM-VIEW]で定義される[[cssom-view-1#scrolling-events#scrolling]]の一種であり、 そこで記載されている方法でscrollイベントを生成します。

2.2.1. 抑制ウィンドウ

アンカーノードの各移動は 抑制ウィンドウと呼ばれる 一定時間内で発生します。抑制ウィンドウは次のように定義されます:

注: 抑制ウィンドウの境界は、スクロールアンカリングAPIが安定したら HTML標準に組み込まれるべきです。

同じ抑制ウィンドウ内で複数回アンカーノードの移動が発生する場合があります。

抑制ウィンドウの終了時、 ユーザーエージェントはウィンドウ中にキューされた全てのスクロール調整を、 ウィンドウ中に抑制トリガーによって抑制されなかったものについて実行します。

2.2.2. 抑制トリガー

抑制トリガーは、 アンカーノードの移動に対するスクロールアンカリング調整を その移動の抑制ウィンドウ内で発生した場合に抑制する操作です。 抑制トリガーは以下の通りです:

注: 抑制トリガーは、スクロールイベントハンドラでコンテンツが移動する既存Webコンテンツとの互換性のために存在します。

3. 除外API

スクロールアンカリングは、導入時にデフォルトの動作となることを目指しており、 ユーザーがレガシーコンテンツでも恩恵を受けられるようにしています。overflow-anchorは、 ページの一部または全体でスクロールアンカリングを無効化したり(オプトアウト)、 DOMの一部をアンカーノード選択アルゴリズムから除外することができます。

名前: overflow-anchor
値: auto | none
初期値: auto
適用対象: 全要素
継承: no
パーセンテージ: n/a
算出値: 指定キーワード
正規順序: 文法通り
アニメーション型: 離散

値の定義は以下の通りです:

auto

要素が自身または祖先によって作成されたスクロールボックスの アンカーノード選択アルゴリズムに 参加する資格があることを宣言します。

none

要素およびその子孫(他のスクロール要素内に入れ子になっていないもの)は、 自身または祖先によって作成されたスクロールボックスの アンカーノード選択アルゴリズム参加しないことを宣言します。

注: overflow-anchor: none要素の子孫に対して スクロールアンカリングを「再度有効化」することはできません。 ただし、子孫のスクロールコンテナーは(自身のスクロールボックスに対して) 明示的にoverflow-anchor: noneが設定されていなければ 自動的に「再度有効化」されます。

注: overflow-anchorプロパティは (異なる値で)CSS Sticky Scrollbars向けにも提案されましたが、 現在は廃止されています。

4. プライバシーとセキュリティの考慮事項

本仕様はスクロール位置の計算方法のみ調整するものであり、 新たなプライバシーやセキュリティ上の考慮事項を導入しません。

変更点

2020年2月11日作業草案以降の変更点

適合性

文書規約

適合要件は、記述的断定とRFC 2119用語の組み合わせで表現されます。規範部分で使われる「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」はRFC 2119の定義に従って解釈してください。ただし、可読性のため、本仕様ではこれらの語句をすべて大文字にはしていません。

本仕様の全てのテキストは、明示的に非規範的とされたセクション・例・注を除き規範的です。[RFC2119]

この仕様の例は「for example」で始まるか、次のようにclass="example"で規範テキストと区別されます:

これは説明用の例です。

説明用の注は「Note」で始まり、次のようにclass="note"で規範テキストと区別されます:

注: これは説明用の注です。

助言は規範的なセクションで、特別な注意を喚起するようスタイリングされ、<strong class="advisement">で他の規範テキストと区別されます。例: UAはアクセシブルな代替手段を提供しなければならない

適合クラス

本仕様への適合は、以下の3つの適合クラスで定義されます:

スタイルシート
CSSスタイルシート
レンダラー
スタイルシートの意味を解釈して、利用する文書をレンダリングするUA
著作ツール
スタイルシートを書くUA

スタイルシートが本仕様に適合するためには、 このモジュールで定義された構文を使った全ての文が 汎用CSS文法および各機能の個別文法に従って有効である必要があります。

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

著作ツールが本仕様に適合するためには、 汎用CSS文法および各機能の個別文法に従って構文的に正しいスタイルシートを書き、 本モジュールで記載されたスタイルシートのその他すべての適合要件を満たす必要があります。

部分的実装

作者が前方互換性のあるパース規則を利用してフォールバック値を割り当てられるようにするため、 CSSレンダラーは、利用可能なレベルのサポートがない@規則・プロパティ・プロパティ値・キーワード・その他構文構成要素を無効(および適切に無視する)として扱わなければなりません。特に、ユーザーエージェントは、マルチ値プロパティ宣言の中でサポートされない値だけを選択的に無視してサポートされる値のみを反映してはなりません。いずれかの値が無効と判断(サポートされない値は必ず)された場合、CSSは宣言全体を無視する必要があります。

不安定・独自機能の実装

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

非実験的実装

仕様が候補勧告段階に達したら、 非実験的な実装が可能となり、実装者は仕様に従って正しく実装できるCRレベルの機能について プレフィックスなしでリリースすべきです。

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

テストケースや実装報告提出の詳細はCSSワーキンググループのウェブサイトhttps://www.w3.org/Style/CSS/Test/で確認できます。 質問はpublic-css-testsuite@w3.orgメーリングリストまで。

索引

本仕様で定義されている用語

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

参考文献

規範的参考文献

[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2020年4月21日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2020年5月19日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2020年6月3日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; 他. CSS Positioned Layout Module Level 3. 2020年5月19日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-SCROLL-SNAP-1]
Matt Rakow; 他. CSS Scroll Snap Module Level 1. 2019年3月19日. CR. URL: https://www.w3.org/TR/css-scroll-snap-1/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2020年10月23日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-TRANSFORMS-1]
Simon Fraser; 他. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2019年1月31日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-VIEW]
Simon Pieters. CSSOM View Module. 2016年3月17日. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; 他. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119

プロパティ一覧

名前 初期値 適用対象 継承 パーセンテージ アニメーション型 正規順序 算出値
overflow-anchor auto | none auto 全要素 no n/a 離散 文法通り 指定キーワード