CSSOM ビューモジュール

W3C 作業草案,

この文書の詳細
この版:
https://www.w3.org/TR/2025/WD-cssom-view-1-20250916/
最新公開版:
https://www.w3.org/TR/cssom-view-1/
編集者草案:
https://drafts.csswg.org/cssom-view/
以前の版:
変更履歴:
https://www.w3.org/standards/history/cssom-view-1/
フィードバック:
CSSWG イシューリポジトリ
仕様内のインライン問題
編集者:
(Apple Inc)
(Mozilla)
以前の編集者:
(Opera Software AS)
Glenn Adams (Cox Communications, Inc.)
Anne van Kesteren (Opera Software ASA)
この仕様への編集提案:
GitHub エディター
旧イシュー一覧:
Bugzilla
テストスイート:
https://wpt.fyi/results/css/cssom-view/

要約

この仕様で導入される API は、文書の視覚的ビューを検査・操作する手段を著者に提供する。これには要素のレイアウトボックスの位置取得、スクリプトによるビューポート幅の取得、要素のスクロール操作などが含まれる。

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

この文書のステータス

この節は公開時点での本書のステータスを説明する。 現在の W3C 公開物の一覧と この技術報告書の最新改訂は W3C 標準および草案一覧で参照できる。

この文書は CSS 作業グループ により 作業草案 として 勧告トラックを用いて公開された。 作業草案としての公開は W3C およびそのメンバーによる支持を意味しない。

これは草案文書であり、 いつでも更新・置換・他文書により廃止される可能性がある。 進行中の作業以外として引用するのは適切ではない。

フィードバックは GitHub で issue を登録(推奨)して送ってほしい。その際、タイトルに仕様コード “cssom-view” を含め、次のようにする: “[cssom-view] …コメントの要約…”. すべての issue とコメントは アーカイブされる。 あるいは、(アーカイブされる)公開メーリングリスト www-style@w3.org に送ることもできる。

この文書は 2025年8月18日 W3C プロセス文書 に従っている。

この文書は W3C 特許ポリシー の下で活動するグループにより作成された。 W3C はグループの成果物に関連して行われた 特許開示の公開一覧 を維持しており、 同ページには特許を開示するための手続きも含まれる。 ある特許に関し、その特許が Essential Claim(s) を含むと信じる実際の知識を有する個人は、 W3C 特許ポリシー第 6 節 に従って情報を開示しなければならない。

1. 背景

この仕様で定義されている多くの機能は、長期間にわたりブラウザでサポートされてきました。本仕様の目的は、これらの機能をすべてのブラウザが相互運用可能な方法で実装できるように定義することです。また、スクロールのカスタマイズを可能にするいくつかの新しい機能も定義しています。

テスト

基本的なIDLテスト


2. 用語

本仕様で用いられる用語は、DOM、CSSOM、HTMLからのものです。[DOM] [CSSOM] [HTML]

要素 body(これは body 要素)は、以下すべての条件が真である場合、スクロール可能性があるとみなされます:

注: body 要素が スクロール可能性がある場合でも、スクロールボックスを持たない場合があります。 例えば、overflow の使用値が auto であっても、内容がそのコンテンツ領域からはみ出していない場合などです。

スクロールボックスは、ビューポートまたは要素のものであり、2つのオーバーフロー方向を持ちます。これらはそのビューポートや要素に対してのブロックエンド方向とインラインエンド方向です。 初期スクロール位置は、スクロール領域の原点に必ずしも揃うとは限りません。これは内容分布プロパティに依存するためです。詳しくはCSS ボックスアラインメント 3 § 5.3 アラインメントのオーバーフローとスクロールコンテナを参照してください。

スクロール領域とは、 ビューポートや要素のボックスであり、 ビューポートや要素の スクロールボックスオーバーフロー方向に応じて、以下のようなエッジを持ちます。

オーバーフロー方向が… ビューポートの場合 要素の場合
右方向・下方向
上端
初期包含ブロックの上端。
右端
初期包含ブロックの右端と、全ての ビューポートの子孫ボックスの右 マージン端の最も右端。
下端
初期包含ブロックの下端と、全ての ビューポートの子孫ボックスの下 マージン端の最も下端。
左端
初期包含ブロックの左端。
上端
要素の上 パディング端
右端
要素の右 パディング端と、要素の子孫ボックスの右 マージン端の最も右端(要素の祖先を包含ブロックとするボックスは除く)。
下端
要素の下 パディング端と、要素の子孫ボックスの下 マージン端の最も下端(要素の祖先を包含ブロックとするボックスは除く)。
左端
要素の左 パディング端
左方向・下方向
上端
初期包含ブロックの上端。
右端
初期包含ブロックの右端。
下端
初期包含ブロックの下端と、全ての ビューポートの子孫ボックスの下 マージン端の最も下端。
左端
初期包含ブロックの左端と、全ての ビューポートの子孫ボックスの左 マージン端の最も左端。
上端
要素の上 パディング端
右端
要素の右 パディング端
下端
要素の下 パディング端と、要素の子孫ボックスの下 マージン端の最も下端(要素の祖先を包含ブロックとするボックスは除く)。
左端
要素の左 パディング端と、要素の子孫ボックスの左 マージン端の最も左端(要素の祖先を包含ブロックとするボックスは除く)。
左方向・上方向
上端
初期包含ブロックの上端と、全ての ビューポートの子孫ボックスの上 マージン端の最も上端。
右端
初期包含ブロックの右端。
下端
初期包含ブロックの下端。
左端
初期包含ブロックの左端と、全ての ビューポートの子孫ボックスの左 マージン端の最も左端。
上端
要素の上 パディング端と、要素の子孫ボックスの上 マージン端の最も上端(要素の祖先を包含ブロックとするボックスは除く)。
右端
要素の右 パディング端
下端
要素の下 パディング端
左端
要素の左 パディング端と、要素の子孫ボックスの左 マージン端の最も左端(要素の祖先を包含ブロックとするボックスは除く)。
右方向・上方向
上端
初期包含ブロックの上端と、全ての ビューポートの子孫ボックスの上 マージン端の最も上端。
右端
初期包含ブロックの右端と、全ての ビューポートの子孫ボックスの右 マージン端の最も右端。
下端
初期包含ブロックの下端。
左端
初期包含ブロックの左端。
上端
要素の上 パディング端と、要素の子孫ボックスの上 マージン端の最も上端(要素の祖先を包含ブロックとするボックスは除く)。
右端
要素の右 パディング端と、要素の子孫ボックスの右 マージン端の最も右端(要素の祖先を包含ブロックとするボックスは除く)。
下端
要素の下 パディング端
左端
要素の左 パディング端

原点とは、 スクロール領域の原点を指し、 初期包含ブロックの原点が スクロール領域ビューポートである場合の原点です。 それ以外の場合は、要素のデフォルトスクロール位置における左上パディング端です。 x座標は右方向に増加し、y座標は下方向に増加します。

開始端とは、 ボックスや要素の特定の端集合において、以下の端を指します:

オーバーフロー方向が右方向・下方向の場合
上端および左端。
オーバーフロー方向が左方向・下方向の場合
上端および右端。
オーバーフロー方向が左方向・上方向の場合
下端および右端。
オーバーフロー方向が右方向・上方向の場合
下端および左端。

終了端とは、 ボックスや要素の特定の端集合において、以下の端を指します:

オーバーフロー方向が右方向・下方向の場合
下端および右端。
オーバーフロー方向が左方向・下方向の場合
下端および左端。
オーバーフロー方向が左方向・上方向の場合
上端および左端。
オーバーフロー方向が右方向・上方向の場合
上端および右端。

ビジュアルビューポートは、 ビューポートの一種であり、その スクロール領域は別の ビューポートとなり、 それを レイアウトビューポートと呼びます。

スクロールに加えて、ビジュアルビューポートレイアウトビューポートにスケール変換も適用する場合があります。 この変換は レイアウトビューポートキャンバスに適用され、 内部座標空間には影響しません。

注: ビジュアルビューポートのスケール変換は、一般的に「ピンチズーム」と呼ばれます。概念的には、この変換は CSS の 基準ピクセルのサイズを変更しますが、レイアウトビューポートのサイズも比例的に変更されるため、ページ内容のリフローを引き起こしません。

このスケール変換の大きさは、ビジュアルビューポートスケールファクターと呼ばれます。

このアニメーションは、ズームされたビジュアルビューポートが(ユーザーがタッチドラッグするなどして)パンされる例を示しています。ページはスケールされ、レイアウトビューポートがビジュアルビューポートよりも大きくなっています。

スクロールの差分はまずビジュアルビューポートに適用されます。ビジュアルビューポートがその範囲に到達すると、スクロール差分はレイアウトビューポートに適用されます。この挙動は スクロールを実行する手順によって実装されています。

Document Layout Viewport Visual Viewport

VisualViewport オブジェクトには 関連付けられた文書 があり、これは Document オブジェクトである。 これは、Window関連付けられた文書 であり、 VisualViewport の所有者である。 レイアウトビューポートは、 所有者 Windowビューポート である。

この仕様の要件において、 display プロパティの算出値が table-column または table-column-group である要素は、 関連付けられた ボックス (それぞれカラムまたはカラムグループ)を持つものとして扱わなければならない。

SVG レイアウトボックス とは、SVG 要素によって生成され、 CSS で定義された display 型に対応しない ボックス を指す。 (例えば、rect 要素によって生成される ボックス など。)

変形(transforms) とは、 SVG 変形および CSS 変形を指す。[SVG11] [CSS-TRANSFORMS-1]

あるメソッドや属性が他のメソッドや属性を呼び出すと言われた場合、ユーザーエージェントはその属性やメソッドの内部 API を実行しなければならない。 例えば、著者が ECMAScript で属性やメソッドをカスタムプロパティや関数で上書きしても挙動を変更できないようにするためである。

特に明記がない限り、すべての文字列比較は is を用いる。

2.1. CSS ピクセル

この仕様で定義される API のすべての座標や寸法は、特に記載がない限り CSS ピクセル で表される。[CSS-VALUES]

注: これは、例えば matchMedia() など、単位が明示的に指定されている場合には適用されない。

2.2. ズーム

ズームには2種類あり、初期ビューポートのサイズに影響する ページズーム、 および初期ビューポートや実際のビューポートには影響せず虫眼鏡のように作用する ビジュアルビューポートの スケールファクター がある。 [CSS-DEVICE-ADAPT]

注: 「スケールファクター」は「ピンチズーム」と呼ばれることが多いが、 ピンチズーム以外でも影響を受ける場合がある。例: ユーザーエージェントがフォーカスされた入力要素を拡大表示して判読しやすくするためにズームすることがある。

2.3. Web に公開されるスクリーン情報

ユーザーのプライバシーを守るため、ユーザーエージェントは出力デバイスのスクリーン情報を隠すことを選択できる。 API 間で一貫した方法でこれを行うため、この仕様では以下の用語を定義する。 それぞれ幅・高さを持ち、原点は左上隅、x座標とy座標はそれぞれ右方向と下方向に増加する。

Web に公開されるスクリーン領域 は以下のいずれかである:

Web に公開される利用可能スクリーン領域 は以下のいずれかである:

3. 共通インフラストラクチャ

この仕様は WHATWG Infra 標準に依存する。[INFRA]

3.1. スクロール

ユーザーエージェントが スクロールボックス box を ある位置 position に、 関連付けられた要素または 疑似要素 element と、オプションのスクロール挙動 behavior(省略時は "auto")で スクロールを実行する際は、以下の手順を実行する:

  1. 進行中の スムーズスクロールbox について中断する。
  2. ユーザーエージェントが scroll-behavior プロパティを考慮し、次のいずれかが真の場合:
    • behavior が "auto" かつ element が null ではなく、その算出値 scroll-behaviorsmooth
    • behaviorsmooth
    ...であれば スムーズスクロールboxposition へ実行する。 位置の更新が完了したら scrollend イベントを発火する。 それ以外の場合は 即時スクロールboxposition へ実行する。 即時スクロールの後は scrollend イベントを発火する。

    注: behavior: "instant" は必ずこのアルゴリズムで 即時スクロール を実行する。

    注: ユーザー操作やプログラムによる呼び出しの結果、スクロール位置が変化しなかった場合(つまり変換が発生しなかった場合)、 スクロールが発生しなかったため scrollend イベントは発火しない。

ユーザーエージェントが ビューポート を ある位置 position へ、オプションのスクロール挙動 behavior(省略時は "auto")で スクロールを実行する際は、以下の協調スクロール手順を実行する:

  1. docビューポートの関連付けられた Document とする。

  2. vv を、関連付けられた文書doc である VisualViewport とする。

  3. maxX を、ビューポートスクロールボックス の幅から vvwidth 属性の値を引いたものとする。

  4. maxY を、ビューポートスクロールボックス の高さから vvheight 属性の値を引いたものとする。

  5. dx を、position の水平方向成分 - vvpageLeft 属性の値とする。

  6. dy を、position の垂直方向成分 - vvpageTop 属性の値とする。

  7. visual xvvoffsetLeft 属性の値とする。

  8. visual yvvoffsetTop 属性の値とする。

  9. visual dx を min(maxX, max(0, visual x + dx)) - visual x とする。

  10. visual dy を min(maxY, max(0, visual y + dy)) - visual y とする。

  11. layout dxdx - visual dx とする。

  12. layout dydy - visual dy とする。

  13. elementdoc のルート要素があればそれ、なければ null とする。

  14. スクロールを実行ビューポートスクロールボックス を、現在のスクロール位置 + (layout dx, layout dy) へ element を関連付け要素として、behavior をスクロール挙動として実行。

  15. スクロールを実行vvスクロールボックス を、現在のスクロール位置 + (visual dx, visual dy) へ element を関連付け要素として、behavior をスクロール挙動として実行。

注: 概念的には、ビジュアルビューポートはレイアウトビューポートの端に「ぶつかる」までスクロールされ、その後スクロールデルタがレイアウトビューポートに「プッシュ」される。 しかし、上記の手順ではスクロールは先に計算され、逆順で適用される―つまりレイアウトビューポートが先にスクロールされる。これは履歴的理由およびスクロールイベントの順序を一定にするため。上の で視覚的に説明されている。

ユーザーが文書をピンチズームし、マウスホイールを回して 50px 下へのスクロールを要求する。 文書がピンチズームされているため、ビジュアルビューポートには 20px のスクロール余地がある。 ユーザーエージェントはスクロールを分配し、ビジュアルビューポートを 20px 下に、レイアウトビューポートを 30px 下にスクロールする。
ユーザーがモバイルユーザーエージェントで文書を閲覧している。 文書がオフスクリーンのテキスト入力要素にフォーカスし、仮想キーボードが表示されてビジュアルビューポートが縮小される。 ユーザーエージェントは要素をビジュアルビューポート内に見えるようにする必要がある。 ユーザーエージェントは、まずレイアウトビューポート内で要素が見えるようスクロールし、次にビジュアルビューポート内でユーザーに要素が見えるようスクロールする。

スクロールは、スクロール位置に保留中の更新や変換がなくなり、ユーザーがジェスチャーを完了したときに 完了する。 スクロール位置の更新にはスムーズまたは即時のマウスホイールスクロール、キーボードスクロール、スクロールスナップイベント、その他スクロール位置を更新・補間する API やジェスチャが含まれる。 タッチパンやトラックパッドスクロールなどのユーザー操作は、ポインタやキーが解放されるまで完了しない。

ユーザーエージェントが スクロールボックス boxpositionスムーズスクロール する場合、 box のスクロール位置をユーザーエージェント独自の方法で一定時間かけて更新する。 スクロールが 完了したら、 box のスクロール位置は position になっている必要がある。 スクロールはアルゴリズムやユーザーによって 中断されることもある。

ユーザーエージェントが スクロールボックス boxposition即時スクロールする場合、box のスクロール位置を position に更新する。

文書 document文書の先頭へスクロールするには、次の手順を実行する:

  1. viewportdocument に関連付けられたビューポートとする。
  2. positionviewportスクロール領域始端viewport始端 に合わせたときのスクロール位置とする。
  3. positionviewport の現在のスクロール位置と同じで、かつ viewport に進行中の スムーズスクロール がなければ、これらの手順を中断する。
  4. スクロールを実行viewportposition へ、 documentルート要素があればそれ、なければ null を関連付け要素として実行。

注: このアルゴリズムは HTML で定義される #top フラグメント識別子へのナビゲーション時に使用される。[HTML]

テスト

3.2. WebIDL 値

非有限値を正規化するよう要求されたとき、値 x が 3つの特別な浮動小数点リテラル値のいずれか(Infinity, -Infinity, NaN) であれば、x0 に変更されなければならない。 [WEBIDL]

4. Window インターフェイスへの拡張

enum ScrollBehavior { "auto", "instant", "smooth" };

dictionary ScrollOptions {
    ScrollBehavior behavior = "auto";
};
dictionary ScrollToOptions : ScrollOptions {
    unrestricted double left;
    unrestricted double top;
};

partial interface Window {
    [NewObject] MediaQueryList matchMedia(CSSOMString query);
    [SameObject, Replaceable] readonly attribute Screen screen;
    [SameObject, Replaceable] readonly attribute VisualViewport? visualViewport;

    // browsing context
    undefined moveTo(long x, long y);
    undefined moveBy(long x, long y);
    undefined resizeTo(long width, long height);
    undefined resizeBy(long x, long y);

    // viewport
    [Replaceable] readonly attribute long innerWidth;
    [Replaceable] readonly attribute long innerHeight;

    // viewport scrolling
    [Replaceable] readonly attribute double scrollX;
    [Replaceable] readonly attribute double pageXOffset;
    [Replaceable] readonly attribute double scrollY;
    [Replaceable] readonly attribute double pageYOffset;
    undefined scroll(optional ScrollToOptions options = {});
    undefined scroll(unrestricted double x, unrestricted double y);
    undefined scrollTo(optional ScrollToOptions options = {});
    undefined scrollTo(unrestricted double x, unrestricted double y);
    undefined scrollBy(optional ScrollToOptions options = {});
    undefined scrollBy(unrestricted double x, unrestricted double y);

    // client
    [Replaceable] readonly attribute long screenX;
    [Replaceable] readonly attribute long screenLeft;
    [Replaceable] readonly attribute long screenY;
    [Replaceable] readonly attribute long screenTop;
    [Replaceable] readonly attribute long outerWidth;
    [Replaceable] readonly attribute long outerHeight;
    [Replaceable] readonly attribute double devicePixelRatio;
};

メソッド matchMedia(query) が呼び出されたとき、次の手順を実行しなければならない:

  1. Let parsed media query list be the result of parsing query.
  2. 新しい MediaQueryList オブジェクトを返す。this関連付けられた Document をその document とし、 parsed media query list をその関連付けられた media query list とする。
テスト

screen 属性は、その Screen オブジェクトを 当該 Window オブジェクトに関連付けられたものとして返さなければならない。

注: screenWindowProxy 経由でアクセスすると、Document がナビゲーションされたときに異なる結果を返す場合がある。

関連付けられた documentfully active であれば、visualViewport 属性は当該 VisualViewport オブジェクトを、当該 Window オブジェクトの 関連付けられた文書 に関連付けられたものとして返さなければならない。そうでなければ null を返す。

注: VisualViewport オブジェクトは、その Document が現在表示されているウィンドウに対してのみ返され有用である。 関連付けられた Document が現在表示されていない VisualViewport への参照が保持されている場合、その VisualViewport の値はブラウジングコンテキストに関する情報を明らかにしてはならない。

テスト

moveTo(x, y) メソッドは次の手順に従わなければならない:

  1. 任意で、返す。

  2. targetthisrelevant global objectbrowsing context とする。

  3. target がスクリプトによって作成された auxiliary browsing context でない場合(ユーザーの操作によって作成された場合など)、返す。

  4. 任意で、ウィンドウが利用可能領域の外に移動しないように xy をユーザーエージェント定義の方法でクランプする。

  5. target のウィンドウの左上隅が出力デバイスの左上隅に対して座標 (x, y) になるようにウィンドウを移動させる。測定単位は CSS pixels で、正の軸は右方向と下方向である。

moveBy(x, y) メソッドは次の手順に従わなければならない:

  1. 任意で、返す。

  2. targetthisrelevant global objectbrowsing context とする。

  3. target がスクリプトによって作成された auxiliary browsing context でない場合、返す。

  4. 任意で、ウィンドウが利用可能領域の外に移動しないように xy をユーザーエージェント定義の方法でクランプする。

  5. target のウィンドウを x だけ右方向に、y だけ下方向に移動する。単位は CSS pixels である。

resizeTo(width, height) メソッドは次の手順に従わなければならない:

  1. 任意で、返す。

  2. targetthisrelevant global objectbrowsing context とする。

  3. target がスクリプトによって作成された auxiliary browsing context でない場合、返す。

  4. 任意で、ウィンドウが小さくなりすぎたり利用可能領域を超えたりしないように widthheight をユーザーエージェント定義の方法でクランプする。

  5. ビューポートの左端と右端の間の距離が widthCSS pixels)になり、上端と下端の間の距離が heightCSS pixels)になるように、右端と下端を動かして target のウィンドウをリサイズする。

  6. 任意で、ウィンドウが利用可能領域の外に広がらないように移動するなどの処理をユーザーエージェント定義の方法で行う。

テスト

resizeBy(x, y) メソッドは次の手順に従わなければならない:

  1. 任意で、返す。

  2. targetthisrelevant global objectbrowsing context とする。

  3. target がスクリプトによって作成された auxiliary browsing context でない場合、返す。

  4. 任意で、ウィンドウが小さくなりすぎたり利用可能領域を超えたりしないように xy をユーザーエージェント定義の方法でクランプする。

  5. target のウィンドウをリサイズする:右端を xCSS pixels)だけ右方向に、下端を yCSS pixels)だけ下方向に動かす。

  6. 任意で、ウィンドウが利用可能領域の外に広がらないように移動するなどの処理をユーザーエージェント定義の方法で行う。

innerWidth 属性は、レンダリングされたスクロールバー(存在する場合)のサイズを含む ビューポート の幅を返さなければならない。ビューポートが存在しない場合はゼロを返す。

ビューポートの幅を取得する方法の例:
var viewportWidth = innerWidth

innerHeight 属性は、レンダリングされたスクロールバー(存在する場合)のサイズを含む ビューポート の高さを返さなければならない。ビューポートが存在しない場合はゼロを返す。

scrollX 属性は、初期包含ブロックの原点に対する x 座標で表した、initial containing block 原点を基準としたビューポートの左端の位置を返す。ビューポートが存在しない場合はゼロを返す。

pageXOffset 属性は、scrollX 属性が返す値を返さなければならない。

scrollY 属性は、初期包含ブロックの原点に対する y 座標で表した、initial containing block 原点を基準としたビューポートの上端の位置を返す。ビューポートが存在しない場合はゼロを返す。

pageYOffset 属性は、scrollY 属性が返す値を返さなければならない。

メソッド scroll() が呼び出されたとき、次の手順を実行しなければならない:

  1. 引数が1つで呼び出された場合、次のサブステップに従う:

    1. options をその引数とする。

    2. x を、引数 optionsleft 辞書メンバーの値(存在する場合)とする。存在しない場合はビューポートの現在の x 軸方向のスクロール位置とする。

    3. y を、引数 optionstop 辞書メンバーの値(存在する場合)とする。存在しない場合はビューポートの現在の y 軸方向のスクロール位置とする。

  2. 引数が2つで呼び出された場合、次のサブステップに従う:

    1. options を null を 変換して ScrollToOptions 辞書とする。 [WEBIDL]

    2. xy をそれぞれ引数とする。

  3. 非有限値を正規化するxy に対して行う。

  4. ビューポートが存在しない場合、これらの手順を中止する。

  5. viewport width を、スクロールバーの幅(存在する場合)を除いたビューポートの幅とする。

  6. viewport height を、スクロールバーの高さ(存在する場合)を除いたビューポートの高さとする。

  7. ビューポートのオーバーフロード方向が右方向である場合
    x を max(0, min(x, ビューポートのスクロール領域幅 - viewport width)) にする。
    ビューポートのオーバーフロード方向が左方向である場合
    x を min(0, max(x, viewport width - ビューポートのスクロール領域幅)) にする。
  8. ビューポートのオーバーフロード方向が下方向である場合
    y を max(0, min(y, ビューポートのスクロール領域高さ - viewport height)) にする。
    ビューポートのオーバーフロード方向が上方向である場合
    y を min(0, max(y, viewport height - ビューポートのスクロール領域高さ)) にする。
  9. position を、ビューポートのスクロール領域の x 座標 x をビューポートの左に、y 座標 y をビューポートの上に合わせたときにビューポートが持つであろうスクロール位置とする。

  10. position がビューポートの現在のスクロール位置と同じであり、かつビューポートに進行中の スムーズスクロール がなければ、これらの手順を中止する。

  11. document をビューポートに関連付けられた Document とする。

  12. スクロールを実行:ビューポートを position へ、 documentルート要素 を関連付け要素(存在する場合)として、optionsbehavior 辞書メンバーの値をスクロール挙動として行う。

    ユーザーエージェント間で、この処理が(協調された)viewportperform a scroll を使うべきか、あるいはレイアウトビューポートのスクロールボックスに対して perform a scroll を使うべきかで合意が得られていない。

テスト

メソッド scrollTo() が呼び出された場合、ユーザーエージェントは同じ引数で scroll() が呼び出されたかのように振る舞わなければならない。

テスト

メソッド scrollBy() が呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:

  1. 引数が2つで呼び出された場合、次のサブステップに従う:

    1. options を null を 変換して ScrollToOptions 辞書とする。 [WEBIDL]

    2. xy をそれぞれ引数とする。

    3. optionsleft 辞書メンバーに値 x を設定する。

    4. optionstop 辞書メンバーに値 y を設定する。

  2. 非有限値を正規化するlefttop 辞書メンバーに対して行う。

  3. scrollX の値を left 辞書メンバーに加える。

  4. scrollY の値を top 辞書メンバーに加える。

  5. その後、scroll() メソッドが options を唯一の引数として呼び出されたかのように振る舞う。

screenX および screenLeft 属性は、クライアントウィンドウの左端の位置を Web に公開されるスクリーン領域 の原点に対する x 座標として返さなければならない。単位は CSS pixels で、存在しない場合はゼロを返す。

テスト

screenY および screenTop 属性は、クライアントウィンドウの上端の位置を Web に公開されるスクリーン領域 の原点に対する y 座標として返さなければならない。単位は CSS pixels で、存在しない場合はゼロを返す。

outerWidth 属性はクライアントウィンドウの幅を返さなければならない。 クライアントウィンドウが存在しない場合はゼロを返す。

outerHeight 属性はクライアントウィンドウの高さを返さなければならない。 クライアントウィンドウが存在しない場合はゼロを返す。

devicePixelRatio 属性は、次の determine the device pixel ratio アルゴリズムの結果を返さなければならない:

  1. 出力デバイスが存在しない場合、1 を返して手順を中止する。

  2. CSS pixel size を、現在の page zoom での CSS pixel のサイズ(scale factor を 1.0 とした場合)とする。

  3. device pixel size を、出力デバイスの垂直方向のデバイスピクセルのサイズとする。

  4. CSS pixel sizedevice pixel size で割った結果を返す。

4.1. features 引数 — open() メソッドへの指定

HTML は open() メソッドを定義する。この節は features 引数で指定された位置およびサイズに関する振る舞いを定義する。[HTML]

ブラウジングコンテキスト機能を設定するには、 map 型の tokenizedFeatures が与えられたとき、ターゲットとなるブラウジングコンテキスト target に対して次を行う:

  1. x を null にする。

  2. y を null にする。

  3. width を null にする。

  4. height を null にする。

  5. もし tokenizedFeatures["left"] が 存在するならば:

    1. xtokenizedFeatures["left"] に対して 整数パース規則 を適用した結果に設定する。

    2. もし x がエラーなら、x を 0 に設定する。

    3. 任意で、ウィンドウが Web に公開される利用可能スクリーン領域 の外に移動しないように、 ユーザーエージェント定義の方法で x をクランプする。

    4. 任意で、target のウィンドウを移動し、ウィンドウの左端が Web に公開されるスクリーン領域 の左端に対して 水平座標 x に来るようにする。測定単位は CSS ピクセルtarget の基準)である。正の軸は右方向である。

  6. もし tokenizedFeatures["top"] が 存在するならば:

    1. ytokenizedFeatures["top"] に対して 整数パース規則 を適用した結果に設定する。

    2. もし y がエラーなら、y を 0 に設定する。

    3. 任意で、ウィンドウが Web に公開される利用可能スクリーン領域 の外に移動しないように、 ユーザーエージェント定義の方法で y をクランプする。

    4. 任意で、target のウィンドウを移動し、ウィンドウの上端が Web に公開されるスクリーン領域 の上端に対して 垂直座標 y に来るようにする。測定単位は CSS ピクセルtarget の基準)である。正の軸は下方向である。

  7. もし tokenizedFeatures["width"] が 存在するならば:

    1. widthtokenizedFeatures["width"] に対して 整数パース規則 を適用した結果に設定する。

    2. もし width がエラーなら、width を 0 に設定する。

    3. もし width が 0 でないなら:

      1. 任意で、ウィンドウが小さくなりすぎたり Web に公開される利用可能スクリーン領域 より大きくならないように、 ユーザーエージェント定義の方法で width をクランプする。

      2. 任意で、target のウィンドウの右端を移動させ、ビューポートの左右端の間の距離が width CSS ピクセル になるようにウィンドウをサイズ変更する(target 基準)。

      3. 任意で、target のウィンドウが Web に公開される利用可能スクリーン領域 の外に広がらないようにユーザーエージェント定義の方法で移動する。

  8. もし tokenizedFeatures["height"] が 存在するならば:

    1. heighttokenizedFeatures["height"] に対して 整数パース規則 を適用した結果に設定する。

    2. もし height がエラーなら、height を 0 に設定する。

    3. もし height が 0 でないなら:

      1. 任意で、ウィンドウが小さくなりすぎたり Web に公開される利用可能スクリーン領域 より大きくならないように、 ユーザーエージェント定義の方法で height をクランプする。

      2. 任意で、target のウィンドウの下端を移動させ、ビューポートの上下端の間の距離が height CSS ピクセル になるようにウィンドウをサイズ変更する(target 基準)。

      3. 任意で、target のウィンドウが Web に公開される利用可能スクリーン領域 の外に広がらないようにユーザーエージェント定義の方法で移動する。

サポートされる open() の機能名 は次のいずれかである:

width
ビューポートの幅。
height
ビューポートの高さ。
left
ウィンドウの左位置。
top
ウィンドウの上位置。

4.2. MediaQueryList インターフェイス

この節は HTML で定義される イベントループ と統合される。[HTML]

MediaQueryList オブジェクトは作成時に関連付けられた media query list と関連付けられた document を持つ。

MediaQueryList オブジェクトは関連付けられた media直列化 形式である media を持つ。

MediaQueryList オブジェクトは関連付けられた media query list がドキュメントの状態に一致するかどうかを示す matches state を持つ。 一致していれば true、そうでなければ false である。

メディアクエリを評価して変更を報告するよう要求されたとき、 ドキュメント Document doc について次の手順を実行する:

  1. MediaQueryList オブジェクト target を、doc をその document として持つものすべてについて、 作成された順序(古い順)で、それぞれ次のサブステップを実行する:

    1. もし targetmatches state が前回この手順を実行した時から変化しているなら、 イベントを発火する。 発火するイベント名は change で、対象は target、 使用するイベントは MediaQueryListEvent である。 その際、isTrusted 属性は true に初期化され、media 属性は targetmedia に、 matches 属性は targetmatches state に初期化される。
ビューポートの向きの変化を検出する簡単なコード例は次のように書ける:
function handleOrientationChange(event) {
    if(event.matches) // landscapeelse}
var mql = matchMedia("(orientation:landscape)");
mql.onchange = handleOrientationChange;
[Exposed=Window]
interface MediaQueryList : EventTarget {
  readonly attribute CSSOMString media;
  readonly attribute boolean matches;
  undefined addListener(EventListener? callback);
  undefined removeListener(EventListener? callback);
           attribute EventHandler onchange;
};

media 属性は関連付けられた media を返さなければならない。

matches 属性は関連付けられた matches state を返さなければならない。

addListener(callback) メソッドが呼ばれたとき、 次の手順を実行しなければならない:

  1. イベントリスナーを追加するthis を対象とし、タイプが changeイベントリスナー を追加し、そのコールバックに callback を使う。

removeListener(callback) メソッドが呼ばれたとき、 次の手順を実行しなければならない:

  1. もし thisイベントリスナー一覧 が、タイプが change、 コールバックが callback、capture が false の イベントリスナー を含んでいるなら、 そのイベントリスナーを削除する(remove an event listener)。

注: 本仕様は当初、addListener()removeListener() の専用コールバック機構を持ち、コールバックは関連付けられた MediaQueryList を引数として呼ばれていた。 現在は通常のイベント機構が使われる。 後方互換のため、addListener() および removeListener() はそれぞれ addEventListener()removeEventListener() のエイリアスのように振る舞い、change イベントは MediaQueryList として偽装される。

次に示すのは イベントハンドラ(および対応する イベントハンドライベントタイプ)で、MediaQueryList インターフェイスを実装するすべてのオブジェクトが イベントハンドラ IDL 属性 としてサポートしなければならないものを示す:

Event handler Event handler event type
onchange change
Tests
[Exposed=Window]
interface MediaQueryListEvent : Event {
  constructor(CSSOMString type, optional MediaQueryListEventInit eventInitDict = {});
  readonly attribute CSSOMString media;
  readonly attribute boolean matches;
};

dictionary MediaQueryListEventInit : EventInit {
  CSSOMString media = "";
  boolean matches = false;
};

media 属性は初期化された値を返さなければならない。

matches 属性は初期化された値を返さなければならない。

4.2.1. イベント概要

この節は非規範的である。

イベント インターフェイス 注目すべきターゲット 説明
change MediaQueryListEvent MediaQueryList MediaQueryList に対して、 matches state が変化したときに発火する。

4.3. Screen インターフェイス

名前が示すとおり、Screen インターフェイスは 出力デバイスのスクリーンに関する情報を表す。

[Exposed=Window]
interface Screen {
  readonly attribute long availWidth;
  readonly attribute long availHeight;
  readonly attribute long width;
  readonly attribute long height;
  readonly attribute unsigned long colorDepth;
  readonly attribute unsigned long pixelDepth;
};

availWidth 属性は Web に公開される利用可能スクリーン領域 の幅を返さなければならない。

availHeight 属性は Web に公開される利用可能スクリーン領域 の高さを返さなければならない。

width 属性は Web に公開されるスクリーン領域 の幅を返さなければならない。

height 属性は Web に公開されるスクリーン領域 の高さを返さなければならない。

colorDepth および pixelDepth 属性は、出力デバイスのピクセル当たりの色(アルファチャネルを除く)に割り当てられたビット数を返すべきである。 ユーザーエージェントが出力デバイスのビット数を返せない場合、フレームバッファや内部表現など、出力デバイスに最も近い推定値を返すべきである。 ユーザーエージェントはこれらの属性に対して、少なくとも color メディア機能の値を三倍した値以上を返さなければならない。 もし色の各成分が同じビット数で表現されていない場合、返される値は color メディア機能の三倍以上になることがあり得る。 プライバシー上の理由などで色深度を返せない場合、24 を返すべきである。

注: 互換性のために colorDepthpixelDepth は同じ値を返す。

注: 一部の非準拠実装では 24 の代わりに 32 を返すことが知られている。

Tests

5. Document インターフェイスへの拡張

partial interface Document {
  Element? elementFromPoint(double x, double y);
  sequence<Element> elementsFromPoint(double x, double y);
  CaretPosition? caretPositionFromPoint(double x, double y, optional CaretPositionFromPointOptions options = {});
  readonly attribute Element? scrollingElement;
};

dictionary CaretPositionFromPointOptions {
  sequence<ShadowRoot> shadowRoots = [];
};

elementFromPoint(x, y) メソッドは以下の手順に従う必要があります:

  1. いずれかの引数が負の場合、xビューポートの幅(表示されたスクロールバーのサイズを除く)より大きい場合、または yビューポートの高さ(表示されたスクロールバーのサイズを除く)より大きい場合、または文書に関連付けられた ビューポート が存在しない場合は、null を返してこれらの手順を終了する。

  2. ボックスビューポート内にあり、座標 x,y でヒットテストのターゲットとなる場合、 descendants of the ビューポート に適用される変形 を適用したときに、関連付けられた要素を返してこれらの手順を終了する。

  3. 文書が ルート要素 を持つ場合は、ルート要素 を返してこれらの手順を終了する。

  4. null を返す。

注: elementFromPoint() メソッドは必ずしも最上位に描画された要素を返すとは限りません。 例えば、pointer-events CSSプロパティを使うことで、要素がヒットテストのターゲットから除外されることがあります。

テスト

elementsFromPoint(x, y) メソッドは以下の手順に従う必要があります:

  1. sequence を新しい空のシーケンスとして作成する。

  2. いずれかの引数が負の場合、xビューポートの幅(表示されたスクロールバーのサイズを除く)より大きい場合、または yビューポートの高さ(表示されたスクロールバーのサイズを除く)より大きい場合、または文書に関連付けられた ビューポート が存在しない場合は、 sequence を返してこれらの手順を終了する。

  3. ボックスごとに ビューポート内で、ペイント順で最上位から、座標 x,y で何も重なっていなくてもヒットテストのターゲットとなる場合、descendants of the ビューポート に適用される変形 を適用したときに、関連付けられた要素を sequence に追加する。

  4. 文書が ルート要素 を持ち、sequence の最後の項目が ルート要素 でない場合、ルート要素sequence に追加する。

  5. sequence を返す。

テスト

caretPositionFromPoint(x, y, options) メソッドは以下の手順を実行した結果を返す必要があります:

  1. 文書に関連付けられた ビューポート が存在しない場合、null を返す。

  2. いずれかの引数が負の場合、xビューポートの幅(表示されたスクロールバーのサイズを除く)より大きい場合、yビューポートの高さ(表示されたスクロールバーのサイズを除く)より大きい場合は null を返す。

  3. 座標 x,yビューポートで、descendants of the ビューポート に適用される 変形 を適用したときに、テキスト挿入ポイントインジケーターが挿入されない場合、null を返す。

  4. 座標 x,yビューポートで、テキスト挿入ポイントインジケーターがテキスト入力ウィジェット(かつ置換要素でもある)に挿入される場合、descendants of the ビューポート に適用される 変形 を適用したとき、以下のプロパティを設定した キャレット位置 を返す:

    キャレットノード
    テキスト入力ウィジェットに対応するノード。
    キャレットオフセット
    テキスト挿入ポイントインジケーターが挿入される位置の左側の16ビット単位の数。
  5. それ以外の場合:

    1. caretPosition を、タプルとし、caretPositionNodeノード)および caretPositionOffset(非負整数)から構成されます。これは、テキスト挿入ポイントインジケーターが transformビューポート の子孫に適用した場合に挿入される位置を示します。

    2. startNodecaretPositioncaretPositionNode に、startOffsetcaretPositioncaretPositionOffset に設定する。

    3. startNodeノードであり、startNodeルートシャドウルートであり、さらに startNodeルートshadow-including inclusive ancestor でない場合、options["shadowRoots"] のいずれかについて、以下の手順を繰り返す:

      1. startOffsetindex に、startNodeルートホストに設定する。

      2. startNodestartNodeルートホストに設定する。

    4. 以下のプロパティを設定した キャレット位置 を返す:

      1. キャレットノードstartNode に設定する。

      2. キャレットオフセットstartOffset に設定する。

注: この キャレット位置ライブではありません。

注: ヒットテストの詳細はこの仕様の範囲外であり、したがって elementFromPoint()caretPositionFromPoint() の正確な詳細も範囲外です。ヒットテストは今後 CSS または HTML の改訂で定義される予定です。

scrollingElement 属性は、取得時に以下の手順を実行する必要があります:

  1. Documentquirks モードの場合、以下のサブステップに従う:

    1. body 要素が存在し、かつ potentially scrollable でない場合、body 要素を返し、これらのステップを中止する。

      この目的のために、body 要素の親要素に overflow:clip が指定されている場合は、overflow:hidden として扱わなければならない。

    2. null を返し、これらのステップを中止する。

  2. root 要素が存在する場合、root 要素を返し、これらのステップを中止する。

  3. null を返す。

注記: scrollTop および scrollLeft に対して常に quirks モードの挙動を使用する非準拠なユーザーエージェントの場合、scrollingElement 属性も常に body 要素(存在しなければ null)を返すことが期待される。 この API は、Web 開発者が特定のユーザーエージェントの挙動を推測せずに、スクロール API に使うべき要素を取得できるように、またどの要素がビューポートをスクロールするかを判定するためにスクロールを発生させる必要がないように存在している。

注記: body 要素は HTML の document.body とは異なり、後者は frameset 要素を返す場合がある。

テスト

5.1. CaretPosition インターフェイス

caret positionは、テキスト挿入ポイントインジケーターの位置を表します。常に関連付けられたcaret nodecaret offsetを持ちます。これはCaretPosition オブジェクトによって表現されます。

[Exposed=Window]
interface CaretPosition {
  readonly attribute Node offsetNode;
  readonly attribute unsigned long offset;
  [NewObject] DOMRect? getClientRect();
};

offsetNode 属性は、caret nodeを返さなければならない。

offset 属性は、caret offsetを返さなければならない。

getClientRect() メソッドは、以下のステップに従い、最初に値を返すステップで中止する:

  1. caret nodeが置換要素であるテキスト入力ウィジェットであり、かつそれがドキュメント内に存在する場合、ウィジェット内のキャレットに対応するscaled DOMRect オブジェクトをcaret offset値で返す。要素およびその祖先に適用されるtransformsを適用する。

  2. それ以外の場合:

    1. caretRange を、start nodeおよびend nodecaret nodestart offsetおよびend offsetcaret offsetに設定された、collapsedな Range オブジェクトとする。

    2. caretRange に対して DOMRect オブジェクトを、getBoundingClientRect() メソッドを呼び出して返す。

注記: この DOMRect オブジェクトは live ではない。

テスト

6. Element インターフェイスの拡張

enum ScrollLogicalPosition { "start", "center", "end", "nearest" };
dictionary ScrollIntoViewOptions : ScrollOptions {
  ScrollLogicalPosition block = "start";
  ScrollLogicalPosition inline = "nearest";
  ScrollIntoViewContainer container = "all";
};

enum ScrollIntoViewContainer { "all", "nearest" };

dictionary CheckVisibilityOptions {
    boolean checkOpacity = false;
    boolean checkVisibilityCSS = false;
    boolean contentVisibilityAuto = false;
    boolean opacityProperty = false;
    boolean visibilityProperty = false;
};

partial interface Element {
  DOMRectList getClientRects();
  [NewObject] DOMRect getBoundingClientRect();

  boolean checkVisibility(optional CheckVisibilityOptions options = {});

  undefined scrollIntoView(optional (boolean or ScrollIntoViewOptions) arg = {});
  undefined scroll(optional ScrollToOptions options = {});
  undefined scroll(unrestricted double x, unrestricted double y);
  undefined scrollTo(optional ScrollToOptions options = {});
  undefined scrollTo(unrestricted double x, unrestricted double y);
  undefined scrollBy(optional ScrollToOptions options = {});
  undefined scrollBy(unrestricted double x, unrestricted double y);
  attribute unrestricted double scrollTop;
  attribute unrestricted double scrollLeft;
  readonly attribute long scrollWidth;
  readonly attribute long scrollHeight;
  readonly attribute long clientTop;
  readonly attribute long clientLeft;
  readonly attribute long clientWidth;
  readonly attribute long clientHeight;
  readonly attribute double currentCSSZoom;
};

注記: checkOpacity および checkVisibilityCSS プロパティは歴史的な名称です。これらのプロパティには新しい命名規則に合わせたエイリアスがあり、opacityProperty および visibilityProperty です。

getClientRects() メソッドが呼び出されたとき、以下のアルゴリズムの結果を返さなければならない:

  1. 呼び出された要素に関連付けられたboxがない場合、空の DOMRectList オブジェクトを返し、このアルゴリズムを終了する。

  2. 要素が関連付けられたSVGレイアウトボックスを持っている場合、SVG仕様で定義されるバウンディングボックスを記述する scaled DOMRectList オブジェクトを返す。このとき、要素および祖先に適用されるtransformsを適用する。

  3. DOMRectList オブジェクトを返し、DOMRect オブジェクトをコンテンツ順で含める。各ボックスフラグメントごとに、そのborder領域(高さまたは幅が0の場合も含む)を記述し、以下の制約を適用する:

    • 要素および祖先に適用されるtransformsを適用する。

    • 呼び出された要素の display プロパティの算出値が table または inline-table の場合、テーブルボックスとキャプションボックス(存在する場合)を含め、匿名コンテナボックスは含めない。

    • 匿名 ブロックボックスをその子ボックスで置き換え、最終リストに匿名ブロックボックスがなくなるまで繰り返す。

注記: DOMRect オブジェクトは getClientRects() によって返された場合、live ではない。

テスト

getBoundingClientRect() メソッドは、 要素 element 上で呼び出された場合、バウンディングボックスの取得element に対して実行した結果を返さなければならない。

要素 elementバウンディングボックスの取得 を行うには、以下のステップを実行する:
  1. list を、element に対して getClientRects() を呼び出した結果とする。

  2. list が空の場合、DOMRect オブジェクトを返す。その xywidthheight メンバーは全てゼロとする。

  3. list 内の全ての矩形が幅または高さがゼロの場合、list の最初の矩形を返す。

  4. それ以外の場合、list 内の高さまたは幅がゼロでないすべての矩形を包含する最小の矩形を表す DOMRect オブジェクトを返す。

注記: DOMRect オブジェクトは getBoundingClientRect() で返された場合、ライブ ではない。

次のコードスニペットは、文書内の最初の div 要素の寸法を取得する例です:
var example = document.getElementsByTagName("div")[0].getBoundingClientRect();
var exampleWidth = example.width;
var exampleHeight = example.height;
テスト
注記: checkVisibility() メソッドは、 要素が潜在的に「可視」であるかどうかを簡易的に判定する一連のチェックを提供します。 デフォルトでは ボックスツリー に基づく非常にシンプルかつ直接的な方法ですが、 「可視性」の具体的な定義に応じて、いくつかの追加チェックを選択的に有効にできます。

checkVisibility(options) メソッドは、 要素 this 上で呼び出された場合、以下のステップを実行しなければならない:

  1. this に対応する ボックス がない場合、 false を返す。

  2. this の祖先が フラットツリー 上で content-visibility: hidden を持つ場合、 false を返す。

  3. optionsopacityProperty または checkOpacity のいずれかが true であり、 this またはその祖先が フラットツリー 上で 計算された opacity の値が 0 の場合、 false を返す。

  4. optionsvisibilityProperty または checkVisibilityCSS のいずれかが true であり、 this不可視 である場合、 false を返す。

  5. optionscontentVisibilityAuto が true であり、 this の祖先が フラットツリー 上で content-visibility: auto により内容をスキップする 場合、 false を返す。

  6. true を返す。

テスト

scrollIntoView(arg) メソッドは、以下のステップを実行しなければならない:

  1. behavior を "auto" にする。

  2. block を "start" にする。

  3. inline を "nearest" にする。

  4. containernull にする。

  5. argScrollIntoViewOptions 辞書の場合、次を行う:

    1. behavioroptionsbehavior に設定する。

    2. blockoptionsblock に設定する。

    3. inlineoptionsinline に設定する。

    4. optionscontainer が "nearest" の場合、container をその要素に設定する。

  6. それ以外で arg が false の場合、block を "end" に設定する。

  7. 要素に関連する ボックス がない場合、 またはユーザーエージェントの機能で利用できない場合、何もせず return する。

  8. 要素をビュー内へスクロールbehavior, block, inline, container で行う。

  9. 必要に応じて、ユーザーの注意を引くための追加動作を行ってもよい。

コンポーネントは scrollIntoView を使って、関心のある内容を指定された位置にスクロールできます:
<style>
    .scroller { overflow: auto; scroll-padding: 8px; }
    .slide { scroll-margin: 16px; scroll-snap-align: center; }
</style>
<div class="carousel">
    <div class="slides scroller">
        <div id="s1" class="slide">
        <div id="s2" class="slide">
        <div id="s3" class="slide">
    </div>
    <div class="markers">
        <button data-target="s1">1</button>
        <button data-target="s2">2</button>
        <button data-target="s3">3</button>
    </div>
</div>
<script>
    document.querySelector('.markers').addEventListener('click', (evt) => {
        const target = document.getElementById(evt.target.dataset.target);
        if (!target) return;
        // scrollIntoView は scroll-snap-align、scroll-margin、スクロールコンテナの scroll-padding を尊重してターゲット要素を正しく配置します。
        target.scrollIntoView({
            // 最も近いスクロールコンテナだけをスクロールします。
            container: 'nearest',
            behavior: 'smooth'
        });
    });
</script>
テスト

scroll() メソッドは次の手順を実行しなければならない:

  1. 引数が1つの場合、以下のサブステップに従う:

    1. options を引数とする。

    2. optionslefttop 辞書メンバー(存在する場合)に対して 非有限値の正規化 を行う。

    3. xoptionsleft 辞書メンバーの値(存在する場合)、 それ以外は要素の現在の x 軸スクロール位置とする。

    4. yoptionstop 辞書メンバーの値(存在する場合)、 それ以外は要素の現在の y 軸スクロール位置とする。

  2. 引数が2つの場合、以下のサブステップに従う:

    1. options を null 変換した ScrollToOptions 辞書とする。

    2. xy をそれぞれ引数とする。

    3. xy に対して 非有限値の正規化 を行う。

    4. optionsleft 辞書メンバーに x を設定する。

    5. optionstop 辞書メンバーに y を設定する。

  3. document を要素の ノード文書とする。

  4. documentアクティブ文書でない場合、これらの手順を終了する。

  5. windowdocumentdefaultView 属性の値とする。

  6. window が null の場合、これらの手順を終了する。

  7. 要素が root 要素 かつ documentquirks モードの場合、これらの手順を終了する。

  8. 要素が root 要素 の場合、window 上で scroll()scrollX(第1引数)と y(第2引数)で呼び出し、これらの手順を終了する。

  9. 要素が body 要素 かつ documentquirks モードかつ要素が potentially scrollable でない場合、window 上で scroll()options を引数として呼び出し、これらの手順を終了する。

  10. 要素に関連付けられた box がない場合、要素に関連付けられた scrolling box がない場合、または要素にオーバーフローがない場合、これらの手順を終了する。

  11. 要素をスクロールし、x,y に移動する。スクロールの挙動は optionsbehavior 辞書メンバーの値とする。

scrollTo() メソッドが呼び出された場合、ユーザーエージェントは scroll() メソッドが同じ引数で呼び出されたかのように動作しなければならない。

scrollBy() メソッドが呼び出された場合、ユーザーエージェントは次の手順を実行しなければならない:

  1. 引数が1つの場合、以下のサブステップに従う:

    1. options を引数とする。

    2. optionslefttop 辞書メンバー(存在する場合)に対して 非有限値の正規化 を行う。

  2. 引数が2つの場合、以下のサブステップに従う:

    1. options を null 変換した ScrollToOptions 辞書とする。

    2. xy をそれぞれ引数とする。

    3. xy に対して 非有限値の正規化 を行う。

    4. optionsleft 辞書メンバーに x を設定する。

    5. optionstop 辞書メンバーに y を設定する。

  3. scrollLeft の値を left 辞書メンバーに加算する。

  4. scrollTop の値を top 辞書メンバーに加算する。

  5. scroll() メソッドが options を唯一の引数として呼び出されたかのように動作する。

テスト

scrollTop 属性は、取得時に次の手順を実行した結果を返さなければならない:

  1. document を要素の ノード文書とする。

  2. documentアクティブ文書でない場合、0 を返しこれらの手順を終了する。

  3. windowdocumentdefaultView 属性の値とする。

  4. window が null の場合、0 を返しこれらの手順を終了する。

  5. 要素が root 要素 かつ documentquirks モード の場合、0 を返しこれらの手順を終了する。

  6. 要素が root 要素 の場合、windowscrollY の値を返す。

  7. 要素が body 要素 かつ documentquirks モード、かつ要素が potentially scrollable でない場合、windowscrollY の値を返す。

  8. 要素に関連付けられた box がない場合、0 を返しこれらの手順を終了する。

  9. 要素の scrolling area の y 座標(要素の padding edge の上端との揃え位置)を返す。

scrollTop 属性を設定する場合、次の手順を実行しなければならない:

  1. y を与えられた値とする。

  2. y に対して 非有限値の正規化 を行う。

  3. document を要素の ノード文書とする。

  4. documentアクティブ文書 でない場合、これらの手順を終了する。

  5. windowdocumentdefaultView 属性の値とする。

  6. window が null の場合、これらの手順を終了する。

  7. 要素が root 要素 かつ documentquirks モード の場合、これらの手順を終了する。

  8. 要素が root 要素 の場合、window 上で scroll()scrollX(第1引数)と y(第2引数)で呼び出し、これらの手順を終了する。

  9. 要素が body 要素 かつ documentquirks モード、かつ要素が potentially scrollable でない場合、window 上で scroll()scrollX(第1引数)と y(第2引数)で呼び出し、これらの手順を終了する。

  10. 要素に関連付けられた box がない場合、要素に関連付けられた scrolling box がない場合、または要素にオーバーフローがない場合、これらの手順を終了する。

  11. 要素をスクロールし、scrollLeft,y に移動する。スクロールの挙動は "auto" とする。

テスト

scrollLeft 属性は、取得時に以下の手順を実行した結果を返さなければならない:

  1. document を要素の ノード文書とする。

  2. documentアクティブ文書でない場合、0 を返してこれらの手順を終了する。

  3. windowdocumentdefaultView 属性の値とする。

  4. window が null の場合、0 を返してこれらの手順を終了する。

  5. 要素が root 要素 かつ documentquirks モードの場合、0 を返してこれらの手順を終了する。

  6. 要素が root 要素 の場合、windowscrollX の値を返す。

  7. 要素が body 要素であり、documentquirks モード、かつ要素が potentially scrollable でない場合、windowscrollX の値を返す。

  8. 要素に関連付けられた box がない場合、0 を返してこれらの手順を終了する。

  9. 要素の scrolling area の x 座標(要素の padding edge の左端との揃え位置)を返す。

scrollLeft 属性を設定する場合は、以下の手順を実行しなければならない:

  1. x を与えられた値とする。

  2. x に対して 非有限値の正規化 を行う。

  3. document を要素の ノード文書とする。

  4. documentアクティブ文書でない場合、これらの手順を終了する。

  5. windowdocumentdefaultView 属性の値とする。

  6. window が null の場合、これらの手順を終了する。

  7. 要素が root 要素 かつ documentquirks モードの場合、これらの手順を終了する。

  8. 要素が root 要素 の場合、window 上で scroll() を第1引数 x、第2引数 windowscrollY の値で呼び出し、これらの手順を終了する。

  9. 要素が body 要素であり、documentquirks モード、かつ要素が potentially scrollable でない場合、window 上で scroll() を第1引数 x、第2引数 windowscrollY の値で呼び出し、これらの手順を終了する。

  10. 要素に関連付けられた box がない場合、要素に関連付けられた scrolling box がない場合、または要素にオーバーフローがない場合、これらの手順を終了する。

  11. 要素をスクロールし、x,scrollTop に移動する。スクロールの挙動は "auto" とする。

テスト

scrollWidth 属性は、以下の手順を実行した結果を返さなければならない:

  1. document を要素の ノード文書とする。

  2. documentアクティブ文書でない場合、0 を返してこれらの手順を終了する。

  3. viewport widthviewport の幅(スクロールバーの幅を除く。なければ0)とし、viewport がなければ0とする。

  4. 要素が root 要素 かつ documentquirks モードでない場合、max(viewportscrolling area の幅, viewport width) を返す。

  5. 要素が body 要素であり、documentquirks モード、かつ要素が potentially scrollable でない場合、max(viewportscrolling area の幅, viewport width) を返す。

  6. 要素に関連付けられた box がない場合、0 を返してこれらの手順を終了する。

  7. 要素の scrolling area の幅を返す。

テスト

scrollHeight 属性は、以下の手順を実行した結果を返さなければならない:

  1. document を要素の ノード文書とする。

  2. documentアクティブ文書でない場合、0 を返してこれらの手順を終了する。

  3. viewport heightviewport の高さ(スクロールバーの高さを除く。なければ0)とし、viewport がなければ0とする。

  4. 要素が root 要素 かつ documentquirks モードでない場合、max(viewportscrolling area の高さ, viewport height) を返す。

  5. 要素が body 要素であり、documentquirks モード、かつ要素が potentially scrollable でない場合、max(viewportscrolling area の高さ, viewport height) を返す。

  6. 要素に関連付けられた box がない場合、0 を返してこれらの手順を終了する。

  7. 要素の scrolling area の高さを返す。

clientTop 属性は、以下の手順を実行しなければならない:

  1. 要素に関連付けられた box がない、または box がインラインの場合、0 を返す。

  2. unscaledborder-top-width プロパティの算出値に、上側の padding edge と上側の border edge の間にレンダリングされたスクロールバーの高さを加算した値を返す。要素および祖先に適用される transforms は無視する。

テスト

clientLeft 属性は、以下の手順を実行しなければならない:

  1. 要素に関連付けられた box がない、または box がインラインの場合、0 を返す。

  2. unscaledborder-left-width プロパティの算出値に、左側の padding edge と左側の border edge の間にレンダリングされたスクロールバーの幅を加算した値を返す。要素および祖先に適用される transforms は無視する。

clientWidth 属性は、以下の手順を実行しなければならない:

  1. 要素に関連付けられた box がない、または box がインラインの場合、0 を返す。

  2. 要素が root 要素 かつ要素の ノード文書quirks モードでない場合、または要素が body 要素であり、要素の ノード文書quirks モードの場合、viewport の幅(スクロールバーのサイズを除く)を返す。

  3. unscaledpadding edge の幅から、padding edgeborder edge の間にレンダリングされたスクロールバーの幅を除いた値を返す。要素および祖先に適用される transforms は無視する。

clientHeight 属性は、以下の手順を実行しなければならない:

  1. 要素に関連付けられた box がない、または box がインラインの場合、0 を返す。

  2. 要素が root 要素 かつ要素の ノード文書quirks モードでない場合、または要素が body 要素であり、要素の ノード文書quirks モードの場合、viewport の高さ(スクロールバーのサイズを除く)を返す。

  3. unscaledpadding edge の高さから、padding edgeborder edge の間にレンダリングされたスクロールバーの高さを除いた値を返す。要素および祖先に適用される transforms は無視する。

currentCSSZoom 属性は、要素の effective zoom を返す。要素が being rendered でない場合は 1.0 を返す。

テスト

6.1. Element スクロール関連メンバー

scroll-into-view の位置を決定するには、 targetElement疑似要素、または Range) とスクロール動作 behavior、ブロックフロー方向位置 block、インライン基底方向位置 inlineスクロールボックス scrolling box を用いて、次の手順を実行する:

  1. target bounding border box を、targetElement の場合は Element の getBoundingClientRect()targetRange の場合は Range の getBoundingClientRect() を呼び出した返り値で表されるボックスとする。

  2. scrolling box edge Aスクロールボックスのブロックフロー方向における開始端とし、element edge Atarget bounding border box の同じ物理的側の端とする。

  3. scrolling box edge Bスクロールボックスのブロックフロー方向における終了端とし、element edge Btarget bounding border box の同じ物理的側の端とする。

  4. scrolling box edge Cスクロールボックスのインライン基底方向における開始端とし、element edge Ctarget bounding border box の同じ物理的側の端とする。

  5. scrolling box edge Dスクロールボックスのインライン基底方向における終了端とし、element edge Dtarget bounding border box の同じ物理的側の端とする。

  6. element heightelement edge Aelement edge B の距離とする。

  7. scrolling box heightscrolling box edge Ascrolling box edge B の距離とする。

  8. element widthelement edge Celement edge D の距離とする。

  9. scrolling box widthscrolling box edge Cscrolling box edge D の距離とする。

  10. position を、以下の手順に従って scrolling box が持つスクロール位置とする:

    1. block が "start" の場合、element edge Ascrolling box edge A に合わせる。

    2. それ以外で block が "end" の場合、element edge Bscrolling box edge B に合わせる。

    3. それ以外で block が "center" の場合、target bounding border box の中央を scrolling box の中央に合わせる(scrolling boxブロックフロー方向で)。

    4. それ以外の場合、block は "nearest" である:

      element edge Aelement edge B がともに scrolling box edge Ascrolling box edge B の外側にある場合
      何もしない。
      element edge Ascrolling box edge A の外側にあり、かつ element heightscrolling box height より小さい場合
      element edge Bscrolling box edge B の外側にあり、かつ element heightscrolling box height より大きい場合
      element edge Ascrolling box edge A に合わせる。
      element edge Ascrolling box edge A の外側にあり、かつ element heightscrolling box height より大きい場合
      element edge Bscrolling box edge B の外側にあり、かつ element heightscrolling box height より小さい場合
      element edge Bscrolling box edge B に合わせる。
    5. inline が "start" の場合、element edge Cscrolling box edge C に合わせる。

    6. それ以外で inline が "end" の場合、element edge Dscrolling box edge D に合わせる。

    7. それ以外で inline が "center" の場合、target bounding border box の中央を scrolling box の中央に合わせる(scrolling boxインライン基底方向で)。

    8. それ以外の場合、inline は "nearest" である:

      element edge Celement edge D がともに scrolling box edge Cscrolling box edge D の外側にある場合
      何もしない。
      element edge Cscrolling box edge C の外側にあり、かつ element widthscrolling box width より小さい場合
      element edge Dscrolling box edge D の外側にあり、かつ element widthscrolling box width より大きい場合
      element edge Cscrolling box edge C に合わせる。
      element edge Cscrolling box edge C の外側にあり、かつ element widthscrolling box width より大きい場合
      element edge Dscrolling box edge D の外側にあり、かつ element widthscrolling box width より小さい場合
      element edge Dscrolling box edge D に合わせる。
    9. targetElement の場合で、その要素が scroll snap position を定義している場合、 ユーザーエージェントは、その最近接の スクロールコンテナscroll snap container である場合、 結果の position をその要素のいずれかの scroll snap positionスナップしなければならない。 scroll containerscroll-snap-type: none の場合も、ユーザーエージェントはこれを行ってもよい。

    10. position を返す。

ターゲットを表示領域にスクロールするには、 targetElement疑似要素、または Range) とスクロール動作 behavior、ブロックフロー方向位置 block、インライン基底方向位置 inline、 およびオプションの Elementcontainer)を指定してスクロールを止めるため、以下の手順を実行する:

  1. 各祖先要素または viewportスクロールボックス scrolling box を確立するものについて、内側から外側の順に次のサブステップを実行する:

    1. target に関連付けられた Document が、 要素または viewport に関連付けられた Document同一オリジンでない場合、これらの手順を終了する。

    2. position を、targetscroll-into-view の位置を決定する の手順を、 behavior(スクロール動作)、block(ブロックフロー位置)、inline(インライン基底方向位置)、scrolling box(スクロールボックス)で呼び出した結果とする。

    3. positionscrolling box の現在のスクロール位置と異なる場合、または scrolling boxスムーズスクロール が進行中の場合、

      1. scrolling box が要素に関連付けられている場合
        スクロールを実行する(要素の scrolling boxposition に、要素を関連付け要素として、behavior をスクロール動作として)。
        scrolling boxviewport に関連付けられている場合
        1. documentviewport に関連付けられている Document とする。

        2. root elementdocumentroot 要素(存在しなければ null)とする。

        3. viewport のスクロールを実行するviewportposition に、root element を関連付け要素として、behavior をスクロール動作として)。

    4. container が null でなく、かつ scrolling boxshadow-including inclusive ancestor である場合、 または scrolling boxviewport であり、その documentshadow-including inclusive ancestorcontainer の場合は、 これ以降の手順を終了する。

要素をスクロールする(または 疑似要素elementx,y に(省略時は "auto" のスクロール動作 behavior で)移動するには、次の通り:

  1. boxelement に関連付けられた スクロールボックスとする。

  2. box が右方向の オーバーフロー方向 を持つ場合
    x を max(0, min(x, elementスクロール領域の幅 - elementパディングエッジの幅)) とする。
    box が左方向の オーバーフロー方向 を持つ場合
    x を min(0, max(x, elementパディングエッジの幅 - elementスクロール領域の幅)) とする。
  3. box が下方向の オーバーフロー方向 を持つ場合
    y を max(0, min(y, elementスクロール領域の高さ - elementパディングエッジの高さ)) とする。
    box が上方向の オーバーフロー方向 を持つ場合
    y を min(0, max(y, elementパディングエッジの高さ - elementスクロール領域の高さ)) とする。
  4. positionbox が持つスクロール位置(スクロール領域の x 座標 xbox の左端に、スクロール領域の y 座標 ybox の上端に揃える)とする。

  5. positionbox の現在のスクロール位置と同じであり、かつ boxスムーズスクロール が進行中でない場合は、これらの手順を終了する。

  6. スクロールを実行するboxposition に、element を関連付け要素として、behavior をスクロール動作として)。

7. HTMLElement インターフェイスへの拡張

partial interface HTMLElement {
  readonly attribute Element? scrollParent;
  readonly attribute Element? offsetParent;
  readonly attribute long offsetTop;
  readonly attribute long offsetLeft;
  readonly attribute long offsetWidth;
  readonly attribute long offsetHeight;
};

scrollParent 属性は、以下の手順を実行した結果を返さなければならない:

  1. 以下のいずれかに該当する場合、null を返し、このアルゴリズムを終了する:

    • 要素に関連付けられた box がない。

    • 要素が root 要素 である。

    • 要素が body 要素 である。

    • 要素の position プロパティの算出値が fixed であり、いずれの祖先も fixed 位置の containing block を確立しない場合。

  2. ancestor を要素の containing blockフラットツリー内)とし、以下のサブステップを繰り返す:

    1. ancestor初期 containing block の場合、要素の文書の scrollingElement を返す。ただし、要素から closed-shadow-hidden であれば null を返す。

    2. ancestor が要素から closed-shadow-hidden でなく、かつ スクロールコンテナ である場合、このアルゴリズムを終了し ancestor を返す。

    3. ancestorposition プロパティの算出値が fixed であり、いずれの祖先も fixed 位置の containing block を確立しない場合、このアルゴリズムを終了し null を返す。

    4. ancestorcontaining blockフラットツリー内)の ancestor とする。

テスト

offsetParent 属性は、以下の手順を実行した結果を返さなければならない:

  1. 以下のいずれかに該当する場合、null を返し、このアルゴリズムを終了する:

    • 要素に関連付けられた box がない。

    • 要素が root 要素 である。

    • 要素が body 要素 である。

    • 要素の position プロパティの算出値が fixed であり、いずれの祖先も fixed 位置の containing block を確立しない場合。

  2. ancestor を要素の フラットツリー内の親要素とし、以下のサブステップを繰り返す:

    1. ancestor が要素から closed-shadow-hidden であり、ancestorposition プロパティの算出値が fixed で、いずれの祖先も fixed 位置の containing block を確立しない場合、このアルゴリズムを終了し null を返す。

    2. ancestor が要素から closed-shadow-hidden でなく、かつ以下のいずれかを満たす場合、このアルゴリズムを終了し ancestor を返す。

      • 要素が fixed 位置の containing block 内にあり、ancestor が fixed 位置の子孫の containing block である。

      • 要素が fixed 位置の containing block 内にない場合、以下のいずれか:

        • ancestor が絶対位置の子孫の containing block である(絶対位置の子孫がいるかは問わない)。

        • ancestorbody 要素 である。

        • 要素の position プロパティの算出値が static であり、ancestor が次のいずれかの HTML 要素tdth、または table

      • 要素の effective zoomancestor と異なる。

    3. ancestorフラットツリー内の親要素がもうない場合、このアルゴリズムを終了し null を返す。

    4. ancestorフラットツリー内の ancestor の親要素とする。

テスト

offsetTop 属性は、以下の手順を実行した結果を返さなければならない:

  1. 要素が body 要素であるか、関連付けられた box がない場合は 0 を返し、このアルゴリズムを終了する。

  2. 要素の offsetParent が null の場合、要素に関連付けられた最初の border edge の y 座標(初期 containing block の原点に対する値、要素および祖先に適用される transforms を無視)を返し、このアルゴリズムを終了する。

  3. 要素に関連付けられた最初の border edge の y 座標から、 offsetParent に関連付けられた最初の padding edge の y 座標を減算した unscaled な値を返す(初期 containing block の原点に対する値、要素および祖先に適用される transforms を無視)。

    注記: 複数の line box からなるインライン要素の場合、最初の box のみが考慮される。

テスト

offsetLeft 属性は、次の手順を実行した結果を返さなければならない:

  1. 要素が body 要素であるか、関連付けられた box がなければ、0 を返してこのアルゴリズムを終了する。

  2. 要素の offsetParent が null の場合、要素に関連付けられた最初の border edge の x 座標(初期 containing block の原点に対する値、要素および祖先に適用される transforms を無視)を返し、このアルゴリズムを終了する。

  3. 要素に関連付けられた最初の border edge の x 座標から、 offsetParent に関連付けられた最初の padding edge の x 座標を減算した unscaled な値を返す(初期 containing block の原点に対する値、要素および祖先に適用される transforms を無視)。

offsetWidth 属性は、次の手順を実行した結果を返さなければならない:

  1. 要素に関連付けられた box がなければ、0 を返してこのアルゴリズムを終了する。

  2. 要素の principal box によって生成されたすべてのフラグメントの border box の軸揃えバウンディングボックスの unscaled な幅を返す。要素および祖先に適用される transforms は無視する。

    要素の principal boxinline-level box であり、block-level の子孫によって「分割」された場合、 block-level 子孫によって生成されたフラグメントも(幅または高さがゼロでない限り)含める。

テスト

offsetHeight 属性は、次の手順を実行した結果を返さなければならない:

  1. 要素に関連付けられた box がなければ、0 を返してこのアルゴリズムを終了する。

  2. 要素の principal box によって生成されたすべてのフラグメントの border box の軸揃えバウンディングボックスの unscaled な高さを返す。要素および祖先に適用される transforms は無視する。

    要素の principal boxinline-level box であり、block-level の子孫によって「分割」された場合、 block-level 子孫によって生成されたフラグメントも(幅または高さがゼロでない限り)含める。

8. HTMLImageElement インターフェイスへの拡張

partial interface HTMLImageElement {
  readonly attribute long x;
  readonly attribute long y;
};

x 属性は、取得時に、要素に関連付けられた最初の border edge の左端の scaled x 座標(初期 containing block の原点に対する値、要素および祖先に適用される transforms を無視)、または box がなければ 0 を返す。

y 属性は、取得時に、要素に関連付けられた最初の border edge の上端の scaled y 座標(初期 containing block の原点に対する値、要素および祖先に適用される transforms を無視)、または box がなければ 0 を返す。

テスト

9. Range インターフェイスへの拡張

partial interface Range {
  DOMRectList getClientRects();
  [NewObject] DOMRect getBoundingClientRect();
};

getClientRects() メソッドは、呼び出された場合、範囲が文書内にない場合は空の DOMRectList オブジェクトを返し、それ以外の場合は、以下の制約を満たす DOMRectList オブジェクト(内容順の DOMRect オブジェクトのリストを含む)を返す:

注記: DOMRect オブジェクトは getClientRects() で返された場合、ライブではない。

テスト

getBoundingClientRect() メソッドは、呼び出された場合、次のアルゴリズムの結果を返さなければならない:

  1. list を、同じ範囲に対して getClientRects() を呼び出した結果とする。

  2. list が空の場合、DOMRect オブジェクトを返す。その xywidthheight メンバーは全てゼロとする。

  3. list 内のすべての矩形が幅または高さがゼロの場合、list の最初の矩形を返す。

  4. それ以外の場合、list 内の高さまたは幅がゼロでないすべての矩形を包含する最小の矩形を表す DOMRect オブジェクトを返す。

注記: DOMRect オブジェクトは getBoundingClientRect() で返された場合、ライブではない。

テスト

10. MouseEvent インターフェイスへの拡張

オブジェクト IDL フラグメントがいくつかのメンバーを再定義しています。これを何とか解決できないでしょうか?

partial interface MouseEvent {
  readonly attribute double screenX;
  readonly attribute double screenY;
  readonly attribute double pageX;
  readonly attribute double pageY;
  readonly attribute double clientX;
  readonly attribute double clientY;
  readonly attribute double x;
  readonly attribute double y;
  readonly attribute double offsetX;
  readonly attribute double offsetY;
};

partial dictionary MouseEventInit {
  double screenX = 0.0;
  double screenY = 0.0;
  double clientX = 0.0;
  double clientY = 0.0;
};
テスト

screenX 属性は、イベントが発生した位置の x 座標(Web-exposed screen area の原点に対する値)を返さなければならない。

screenY 属性は、イベントが発生した位置の y 座標(Web-exposed screen area の原点に対する値)を返さなければならない。

pageX 属性は、次の手順に従う:

  1. イベントの dispatch flag が設定されている場合、イベント発生位置の水平方向座標(初期 containing block の原点に対する値)を返し、これらの手順を終了する。

  2. offset をイベントの関連付けられた scrollX 属性の値(Window オブジェクトがあればその値、なければ 0)とする。

  3. offset とイベントの clientX 属性の値の合計を返す。

pageY 属性は、次の手順に従う:

  1. イベントの dispatch flag が設定されている場合、イベント発生位置の垂直方向座標(初期 containing block の原点に対する値)を返し、これらの手順を終了する。

  2. offset をイベントの関連付けられた scrollY 属性の値(Window オブジェクトがあればその値、なければ 0)とする。

  3. offset とイベントの clientY 属性の値の合計を返す。

clientX 属性は、イベントが発生した位置の x 座標(viewport の原点に対する値)を返す。

clientY 属性は、イベントが発生した位置の y 座標(viewport の原点に対する値)を返す。

x 属性は、clientX の値を返す。

y 属性は、clientY の値を返す。

offsetX 属性は、次の手順に従う:

  1. イベントの dispatch flag が設定されている場合、イベント発生位置の x 座標(ターゲットノードの padding edge の原点に対する値、要素および祖先に適用される transforms を無視)を返し、これらの手順を終了する。

  2. イベントの pageX 属性の値を返す。

テスト

offsetY 属性は、次の手順に従う:

  1. イベントの dispatch flag が設定されている場合、イベント発生位置の y 座標(ターゲットノードの padding edge の原点に対する値、要素および祖先に適用される transforms を無視)を返し、これらの手順を終了する。

  2. イベントの pageY 属性の値を返す。

11. ジオメトリ

11.1. GeometryUtils インターフェイス

enum CSSBoxType { "margin", "border", "padding", "content" };
dictionary BoxQuadOptions {
  CSSBoxType box = "border";
  GeometryNode relativeTo; // XXX default document (i.e. viewport)
};

dictionary ConvertCoordinateOptions {
  CSSBoxType fromBox = "border";
  CSSBoxType toBox = "border";
};

interface mixin GeometryUtils {
  sequence<DOMQuad> getBoxQuads(optional BoxQuadOptions options = {});
  DOMQuad convertQuadFromNode(DOMQuadInit quad, GeometryNode from, optional ConvertCoordinateOptions options = {});
  DOMQuad convertRectFromNode(DOMRectReadOnly rect, GeometryNode from, optional ConvertCoordinateOptions options = {});
  DOMPoint convertPointFromNode(DOMPointInit point, GeometryNode from, optional ConvertCoordinateOptions options = {}); // XXX z,w turns into 0
};

Text includes GeometryUtils; // like Range
Element includes GeometryUtils;
CSSPseudoElement includes GeometryUtils;
Document includes GeometryUtils;

typedef (Text or Element or CSSPseudoElement or Document) GeometryNode;

getBoxQuads(options) メソッドは、以下の手順を実行しなければならない:

  1. DOM順序

    p1 = 常に左上(RTLでも)

    scaleが0の場合はゼロ除算となり、0x0を返す

    クロスフレームは禁止、WrongDocumentErrorを投げる?

    点は平坦化される(3D変換)、z=0。getClientRectと同様

    インライン内のブロックテスト

    疑似要素のbefore/afterは要素の子になる

    ビューポートボックスはすべて同じ

テスト

convertQuadFromNode(quad, from, options) メソッドは、以下の手順を実行しなければならない:

  1. ...

convertRectFromNode(rect, from, options) メソッドは、以下の手順を実行しなければならない:

  1. ...

convertPointFromNode(point, from, options) メソッドは、以下の手順を実行しなければならない:

  1. ...

12. VisualViewport

12.1. VisualViewport インターフェイス

[Exposed=Window]
interface VisualViewport : EventTarget {
  readonly attribute double offsetLeft;
  readonly attribute double offsetTop;

  readonly attribute double pageLeft;
  readonly attribute double pageTop;

  readonly attribute double width;
  readonly attribute double height;

  readonly attribute double scale;

  attribute EventHandler onresize;
  attribute EventHandler onscroll;
  attribute EventHandler onscrollend;
};

offsetLeft 属性は、以下の手順を実行しなければならない:

  1. visual viewport関連文書完全にアクティブでない場合、0 を返す。

  2. それ以外の場合、visual viewport の左端が layout viewport の左端からどれだけずれているかを返す。

offsetTop 属性は、以下の手順を実行しなければならない:

  1. visual viewport関連文書完全にアクティブでない場合、0 を返す。

  2. それ以外の場合、visual viewport の上端が layout viewport の上端からどれだけずれているかを返す。

pageLeft 属性は、以下の手順を実行しなければならない:

  1. visual viewport関連文書完全にアクティブでない場合、0 を返す。

  2. それ以外の場合、visual viewport の左端が 初期 containing blocklayout viewportdocument)の左端からどれだけずれているかを返す。

pageTop 属性は、以下の手順を実行しなければならない:

  1. visual viewport関連文書完全にアクティブでない場合、0 を返す。

  2. それ以外の場合、visual viewport の上端が 初期 containing blocklayout viewportdocument)の上端からどれだけずれているかを返す。

width 属性は、以下の手順を実行しなければならない:

  1. visual viewport関連文書完全にアクティブでない場合、0 を返す。

  2. それ以外の場合、visual viewport の幅(視覚ビューポートに固定された縦方向の クラシックスクロールバー の幅を除いた値)を返す。

注記: この値はCSSピクセル単位で返されるため、ページズームスケールファクターを上げると値の大きさは減少する。

注記: 視覚ビューポートに固定されたスクロールバーは、ズームやパンをしてもサイズや位置が変わらないものを指す。この値はCSSピクセル単位のため、スクロールバー幅を除外する際、UAはCSSピクセルで測定されるスクロールバーの大きさを考慮する必要がある。つまり、ズームイン時には除かれる量が減り、ズームアウト時には増える。

height 属性は、以下の手順を実行しなければならない:

  1. visual viewport関連文書完全にアクティブでない場合、0 を返す。

  2. それ以外の場合、visual viewport の高さ(視覚ビューポートに固定された横方向の クラシックスクロールバー の高さを除いた値)を返す。

scale 属性は、以下の手順を実行しなければならない:

  1. visual viewport関連文書完全にアクティブでない場合、0 を返し、これらの手順を中断する。

  2. 出力デバイスがない場合、1 を返し、これらの手順を中断する。

  3. それ以外の場合、visual viewportスケールファクター を返す。

onresize は、イベントハンドラーIDL属性であり、resize イベント用である。

onscroll は、イベントハンドラーIDL属性であり、scroll イベント用である。

onscrollend は、イベントハンドラーIDL属性であり、scrollend イベント用である。

13. イベント

13.1. ビューポートのリサイズ

この節は、HTMLで定義されている イベントループ と統合される。[HTML]

Document doc に対して resize 手順を実行するよう求められた場合、以下の手順を実行する:

  1. docviewport の幅または高さが前回これらの手順が実行された時点から変更された場合 (例:ユーザーがブラウザーウィンドウのサイズを変更した場合、 ページズームを変更した場合、 iframe 要素の寸法が変更された場合など)、 doc に関連付けられている Window オブジェクトで resize という名前のイベントを発火する。

  2. doc に関連付けられている VisualViewportscalewidth、または height プロパティのいずれかが 前回これらの手順が実行された時点から変更された場合、 VisualViewportresize という名前のイベントを発火する。

Tests

13.2. スクロール

このセクションは、HTML で定義されている イベントループ と統合されます。[HTML]

Document には、空の 保留中スクロールイベントターゲット のリストが関連付けられています(初期値は空)。

Document には、空の 保留中スクロールエンドイベントターゲット のリストが関連付けられています(初期値は空)。

ビューポートがスクロールされたとき(ユーザー操作または API により)、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. docビューポート に関連付けられた Document とします。

  2. docスナップコンテナ の場合、 doceventual snap target(ブロック軸を newBlockTarget、インライン軸を newInlineTarget)で scrollsnapchanging ターゲットの更新手順を実行する。

  3. doc がすでに自身の 保留中スクロールイベントターゲット に含まれていたら、これらの手順を中止する。

  4. doc を自身の 保留中スクロールイベントターゲット に追加する。

要素がスクロールされたとき(ユーザー操作または API により)、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. doc を要素の ノード文書 とします。

  2. 要素が スナップコンテナ の場合、 要素の eventual snap target(ブロック軸を newBlockTarget、インライン軸を newInlineTarget)で scrollsnapchanging ターゲットの更新手順を実行する。

  3. 要素がすでに doc保留中スクロールイベントターゲット に含まれていたら、これらの手順を中止する。

  4. 要素を doc保留中スクロールイベントターゲット に追加する。

VisualViewport がスクロールされたとき(ユーザー操作または API により)、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. vv をスクロールされた VisualViewport オブジェクトとします。

  2. docvv関連付けられている文書 とします。

  3. vv がすでに doc保留中スクロールイベントターゲット に含まれていたら、これらの手順を中止する。

  4. vvdoc保留中スクロールイベントターゲット に追加する。

スクロール手順を実行するために Document doc に対して、以下の手順を実行する:

  1. 保留中の scrollsnapchanging イベントの dispatch 手順doc に対して実行する。

  2. doc保留中スクロールイベントターゲット の各アイテム target について、追加順に次のサブステップを実行する:

    1. targetDocument の場合、 スクロール(scroll)イベントtarget でバブルさせて発火する。

    2. それ以外の場合、スクロール(scroll)イベントtarget で発火する。

  3. doc保留中スクロールイベントターゲット を空にする。

  4. 保留中の scrollsnapchange イベントの dispatch 手順doc に対して実行する。

スクロールが 完了したとき、ユーザーエージェントは以下の手順を実行しなければなりません:

scrollend イベントはどの順序で dispatch されるか?スクロール開始順か、完了順か?

  1. スクロールされた各スクロールボックス box について:

    1. boxビューポート に属する場合は、 docビューポート に関連付けられる Documenttargetビューポートとする。 boxVisualViewport に属する場合は、 docVisualViewport関連付けられている文書targetVisualViewport とする。 それ以外の場合、box は要素に属するので doc を要素の ノード文書target をその要素とする。

    2. boxスナップコンテナ snapcontainer に属する場合は、 snapcontainer に対して scrollsnapchange ターゲットの更新手順を実行する。

    3. targetdoc保留中スクロールエンドイベントターゲット にすでに含まれていたら、これらの手順を中止する。

    4. targetdoc保留中スクロールエンドイベントターゲット に追加する。

  2. doc に対して 保留中 scrollsnapchange ターゲットの dispatch 手順 を実行する。

  3. doc保留中スクロールエンドイベントターゲット の各アイテム target について、追加順に次のサブステップを実行する:

    1. targetDocument の場合、 scrollend(スクロールエンド)イベントtarget でバブルさせて発火する。

    2. それ以外の場合、scrollend(スクロールエンド)イベントtarget で発火する。

  4. doc保留中スクロールエンドイベントターゲット を空にする。

13.3. イベントサマリー

このセクションは規範的ではありません。

イベント インターフェイス 主なターゲット 説明
resize Event Window, VisualViewport Windowviewport がリサイズされたときに発火します。VisualViewportvisual viewport がリサイズされたとき、 または layout viewport がスケールされたときに発火します。
scroll Event VisualViewport, Document, 要素 VisualViewport, Document または要素が、それぞれ VisualViewport, viewport、要素がスクロールされたときに発火します。
scrollend Event Document, 要素, VisualViewport VisualViewport, Document、 または要素でスクロールが完了したときに発火します。つまり VisualViewportviewport または要素がスクロールされ、 スクロールのシーケンスが終了し、スクロールオフセットの変更が適用されたタイミングです。

14. レイアウト後の状態スナップショット

一部の CSS 機能は、スクロール位置などのレイアウト後の状態を次のスタイルやレイアウトの更新の入力として利用します。

レイアウト後の状態スナップショット手順を実行するために Document doc に対して、以下の手順を実行する:

  1. レイアウト後の状態をスナップショットする必要がある各 CSS 機能について、doc の関連する状態のスナップショットを取得する。

スナップショットされる状態は他の仕様で定義されています。これらの手順は doc や他の Document に対して、他のレイアウト後スナップショット手順がスナップショットが行われたことを検知できるような無効化をしてはなりません。つまり、スナップショットの順序は問題になりません。

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

Screen インターフェイスはユーザーのディスプレイ構成情報を公開します。これはフィンガープリントアルゴリズムへの入力として使われる可能性があります。ユーザーエージェントは、ユーザーのプライバシーを保護するために、画面サイズや構成の情報を隠したり量子化したりすることを選択できます。

MouseEvent は、イベントのスクリーン相対座標の情報を含みます。ユーザーエージェントは、ユーザーのプライバシー保護のために、これらのプロパティに実際のスクリーン位置を隠す値を設定することがあります。

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

この仕様に関して新たなセキュリティ上の考慮事項は報告されていません。

17. 変更履歴

このセクションでは本仕様の版間の主な変更点を記載します。網羅的な内容ではありません。バグ修正や編集上の変更は通常記載されません。

2016年3月17日作業草案 からの変更点

2013年12月17日作業草案 からの変更点

2011年8月4日作業草案以降の変更点 (英語原文)

2009年8月4日作業草案以降の変更点 (英語原文)

2008年2月22日作業草案以降の変更点 (英語原文)

18. 謝辞

編集者は、Alan Stearns、Alexey Feldgendler、Antonio Gomes、Björn Höhrmann、Boris Zbarsky、Chris Rebert、Corey Farwell、Dan Bates、David Vest、Elliott Sprehn、Garrett Smith、Henrik Andersson、Hallvord R. M. Steen、Kang-Hao Lu、Koji Ishii、Leif Arne Storset、Luiz Agostini、Maciej Stachowiak、Michael Dyck、Mike Wilson、Morten Stenshorne、Olli Pettay、Pavel Curtis、Peter-Paul Koch、Rachel Kmetz、Rick Byers、Robert O’Callahan、Sam Weinig、Scott Johnson、Sebastian Zartner、Stewart Brodie、Sylvain Galineau、Tab Atkins、Tarquin Wilton-Jones、Thomas Moore、Thomas Shinnick、Xiaomei Ji の本ドキュメントへの貢献に感謝します。

特に、Microsoftの社員の皆様には、本ドラフトで規定された多くの機能を最初に実装し、それがWindows Internet Explorerブラウザーで広く展開されたことに感謝します。

適合性

文書の慣例

適合要件は、記述的な断言と 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 はアクセシブルな代替手段を必ず提供しなければなりません。

テスト

この仕様の内容に関するテストは、このような「Tests」ブロックで記載されている場合があります。 このようなブロックは非規範です。


適合性クラス

この仕様に対する適合性は、3つの適合性クラスで定義されます:

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

スタイルシートがこの仕様に適合するためには、本モジュールで定義された構文を使うすべての文が、汎用 CSS 文法と本モジュールで定義された各機能の個別文法に従って有効でなければなりません。

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

オーサリングツールがこの仕様に適合するためには、汎用 CSS 文法および本モジュールの各機能の個別文法に従って構文的に正しいスタイルシートを書き、本モジュールで記載されるスタイルシートのすべての適合性要件も満たしていなければなりません。

部分的な実装

著者が前方互換の構文解析規則を利用してフォールバック値を割り当てられるように、CSS レンダラーは、サポートできない at-ルール、プロパティ、プロパティ値、キーワード、その他の構文的構成要素を無効(適切に無視)として扱わなければなりません。特に、ユーザーエージェントは、1つの複数値プロパティ宣言内でサポートされない構成値だけを選択的に無視し、サポートされる値のみを尊重するべきではありません。いずれかの値が無効と見なされる場合(サポート外値はそう扱われる必要がある)、CSS では宣言全体を無視する必要があります。

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

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

実験的でない実装

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

CSS の実装間の相互運用性を確立・維持するため、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-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS 背景および境界モジュール レベル3。2024年3月11日。CRD。URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BORDERS-4]
Elika Etemad; 他. CSS 境界およびボックス装飾モジュール レベル4。2025年7月22日。FPWD。URL: https://www.w3.org/TR/css-borders-4/
[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-COLOR-4]
Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS 色モジュール レベル4。2025年4月24日。CRD。URL: https://www.w3.org/TR/css-color-4/
[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-DEVICE-ADAPT]
Florian Rivoal; Emilio Cobos Álvarez. CSS ビューポートモジュール レベル1。2024年1月25日。FPWD。URL: https://www.w3.org/TR/css-viewport-1/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS ディスプレイモジュール レベル4。2024年12月19日。FPWD。URL: https://www.w3.org/TR/css-display-4/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS オーバーフローモジュール レベル3。2023年3月29日。WD。URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS 配置レイアウトモジュール レベル3。2025年3月11日。WD。URL: https://www.w3.org/TR/css-position-3/
[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-SCROLL-SNAP-1]
Matt Rakow; 他. CSS スクロールスナップモジュール レベル1。2021年3月11日。CR。URL: https://www.w3.org/TR/css-scroll-snap-1/
[CSS-SCROLL-SNAP-2]
Elika Etemad; Tab Atkins Jr.; Adam Argyle. CSS スクロールスナップモジュール レベル2。2024年7月23日。FPWD。URL: https://www.w3.org/TR/css-scroll-snap-2/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS テキストモジュール レベル3。2024年9月30日。CRD。URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-4]
Elika Etemad; 他. CSS テキストモジュール レベル4。2024年5月29日。WD。URL: https://www.w3.org/TR/css-text-4/
[CSS-TRANSFORMS-1]
Simon Fraser; 他. CSS 変形モジュール レベル1。2019年2月14日。CR。URL: https://www.w3.org/TR/css-transforms-1/
[CSS-VALUES]
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-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]
Daniel Glazman; Emilio Cobos Álvarez. CSS オブジェクトモデル (CSSOM)。2021年8月26日。WD。URL: https://www.w3.org/TR/cssom-1/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM ビューモジュール。2016年3月17日。WD。URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM 標準。リビングスタンダード。URL: https://dom.spec.whatwg.org/
[GEOMETRY-1]
Simon Pieters; Chris Harrelson. ジオメトリインターフェイスモジュール レベル1。2018年12月4日。CR。URL: https://www.w3.org/TR/geometry-1/
[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/
[MEDIAQUERIES-5]
Dean Jackson; 他. メディアクエリ レベル5。2021年12月18日。WD。URL: https://www.w3.org/TR/mediaqueries-5/
[RFC2119]
S. Bradner. RFCsで要件レベルを示すためのキーワード。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/
[SVG11]
Erik Dahlström; 他. スケーラブルベクターグラフィックス (SVG) 1.1(第2版)。2011年8月16日。REC。URL: https://www.w3.org/TR/SVG11/
[SVG2]
Amelia Bellamy-Royds; 他. スケーラブルベクターグラフィックス (SVG) 2。2018年10月4日。CR。URL: https://www.w3.org/TR/SVG2/
[UIEVENTS]
Gary Kacmarcik; Travis Leithead. UI イベント。2024年9月7日。WD。URL: https://www.w3.org/TR/uievents/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準。リビングスタンダード。URL: https://webidl.spec.whatwg.org/

参考情報

[CSS-UI-4]
Florian Rivoal. CSS 基本ユーザーインターフェイスモジュール レベル4。2021年3月16日。WD。URL: https://www.w3.org/TR/css-ui-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS ライティングモード レベル3。2019年12月10日。REC。URL: https://www.w3.org/TR/css-writing-modes-3/

IDL 索引

enum ScrollBehavior { "auto", "instant", "smooth" };

dictionary ScrollOptions {
    ScrollBehavior behavior = "auto";
};
dictionary ScrollToOptions : ScrollOptions {
    unrestricted double left;
    unrestricted double top;
};

partial interface Window {
    [NewObject] MediaQueryList matchMedia(CSSOMString query);
    [SameObject, Replaceable] readonly attribute Screen screen;
    [SameObject, Replaceable] readonly attribute VisualViewport? visualViewport;

    // browsing context
    undefined moveTo(long x, long y);
    undefined moveBy(long x, long y);
    undefined resizeTo(long width, long height);
    undefined resizeBy(long x, long y);

    // viewport
    [Replaceable] readonly attribute long innerWidth;
    [Replaceable] readonly attribute long innerHeight;

    // viewport scrolling
    [Replaceable] readonly attribute double scrollX;
    [Replaceable] readonly attribute double pageXOffset;
    [Replaceable] readonly attribute double scrollY;
    [Replaceable] readonly attribute double pageYOffset;
    undefined scroll(optional ScrollToOptions options = {});
    undefined scroll(unrestricted double x, unrestricted double y);
    undefined scrollTo(optional ScrollToOptions options = {});
    undefined scrollTo(unrestricted double x, unrestricted double y);
    undefined scrollBy(optional ScrollToOptions options = {});
    undefined scrollBy(unrestricted double x, unrestricted double y);

    // client
    [Replaceable] readonly attribute long screenX;
    [Replaceable] readonly attribute long screenLeft;
    [Replaceable] readonly attribute long screenY;
    [Replaceable] readonly attribute long screenTop;
    [Replaceable] readonly attribute long outerWidth;
    [Replaceable] readonly attribute long outerHeight;
    [Replaceable] readonly attribute double devicePixelRatio;
};

[Exposed=Window]
interface MediaQueryList : EventTarget {
  readonly attribute CSSOMString media;
  readonly attribute boolean matches;
  undefined addListener(EventListener? callback);
  undefined removeListener(EventListener? callback);
           attribute EventHandler onchange;
};

[Exposed=Window]
interface MediaQueryListEvent : Event {
  constructor(CSSOMString type, optional MediaQueryListEventInit eventInitDict = {});
  readonly attribute CSSOMString media;
  readonly attribute boolean matches;
};

dictionary MediaQueryListEventInit : EventInit {
  CSSOMString media = "";
  boolean matches = false;
};

[Exposed=Window]
interface Screen {
  readonly attribute long availWidth;
  readonly attribute long availHeight;
  readonly attribute long width;
  readonly attribute long height;
  readonly attribute unsigned long colorDepth;
  readonly attribute unsigned long pixelDepth;
};

partial interface Document {
  Element? elementFromPoint(double x, double y);
  sequence<Element> elementsFromPoint(double x, double y);
  CaretPosition? caretPositionFromPoint(double x, double y, optional CaretPositionFromPointOptions options = {});
  readonly attribute Element? scrollingElement;
};

dictionary CaretPositionFromPointOptions {
  sequence<ShadowRoot> shadowRoots = [];
};

[Exposed=Window]
interface CaretPosition {
  readonly attribute Node offsetNode;
  readonly attribute unsigned long offset;
  [NewObject] DOMRect? getClientRect();
};

enum ScrollLogicalPosition { "start", "center", "end", "nearest" };
dictionary ScrollIntoViewOptions : ScrollOptions {
  ScrollLogicalPosition block = "start";
  ScrollLogicalPosition inline = "nearest";
  ScrollIntoViewContainer container = "all";
};

enum ScrollIntoViewContainer { "all", "nearest" };

dictionary CheckVisibilityOptions {
    boolean checkOpacity = false;
    boolean checkVisibilityCSS = false;
    boolean contentVisibilityAuto = false;
    boolean opacityProperty = false;
    boolean visibilityProperty = false;
};

partial interface Element {
  DOMRectList getClientRects();
  [NewObject] DOMRect getBoundingClientRect();

  boolean checkVisibility(optional CheckVisibilityOptions options = {});

  undefined scrollIntoView(optional (boolean or ScrollIntoViewOptions) arg = {});
  undefined scroll(optional ScrollToOptions options = {});
  undefined scroll(unrestricted double x, unrestricted double y);
  undefined scrollTo(optional ScrollToOptions options = {});
  undefined scrollTo(unrestricted double x, unrestricted double y);
  undefined scrollBy(optional ScrollToOptions options = {});
  undefined scrollBy(unrestricted double x, unrestricted double y);
  attribute unrestricted double scrollTop;
  attribute unrestricted double scrollLeft;
  readonly attribute long scrollWidth;
  readonly attribute long scrollHeight;
  readonly attribute long clientTop;
  readonly attribute long clientLeft;
  readonly attribute long clientWidth;
  readonly attribute long clientHeight;
  readonly attribute double currentCSSZoom;
};

partial interface HTMLElement {
  readonly attribute Element? scrollParent;
  readonly attribute Element? offsetParent;
  readonly attribute long offsetTop;
  readonly attribute long offsetLeft;
  readonly attribute long offsetWidth;
  readonly attribute long offsetHeight;
};

partial interface HTMLImageElement {
  readonly attribute long x;
  readonly attribute long y;
};

partial interface Range {
  DOMRectList getClientRects();
  [NewObject] DOMRect getBoundingClientRect();
};

partial interface MouseEvent {
  readonly attribute double screenX;
  readonly attribute double screenY;
  readonly attribute double pageX;
  readonly attribute double pageY;
  readonly attribute double clientX;
  readonly attribute double clientY;
  readonly attribute double x;
  readonly attribute double y;
  readonly attribute double offsetX;
  readonly attribute double offsetY;
};

partial dictionary MouseEventInit {
  double screenX = 0.0;
  double screenY = 0.0;
  double clientX = 0.0;
  double clientY = 0.0;
};

enum CSSBoxType { "margin", "border", "padding", "content" };
dictionary BoxQuadOptions {
  CSSBoxType box = "border";
  GeometryNode relativeTo; // XXX default document (i.e. viewport)
};

dictionary ConvertCoordinateOptions {
  CSSBoxType fromBox = "border";
  CSSBoxType toBox = "border";
};

interface mixin GeometryUtils {
  sequence<DOMQuad> getBoxQuads(optional BoxQuadOptions options = {});
  DOMQuad convertQuadFromNode(DOMQuadInit quad, GeometryNode from, optional ConvertCoordinateOptions options = {});
  DOMQuad convertRectFromNode(DOMRectReadOnly rect, GeometryNode from, optional ConvertCoordinateOptions options = {});
  DOMPoint convertPointFromNode(DOMPointInit point, GeometryNode from, optional ConvertCoordinateOptions options = {}); // XXX z,w turns into 0
};

Text includes GeometryUtils; // like Range
Element includes GeometryUtils;
CSSPseudoElement includes GeometryUtils;
Document includes GeometryUtils;

typedef (Text or Element or CSSPseudoElement or Document) GeometryNode;

[Exposed=Window]
interface VisualViewport : EventTarget {
  readonly attribute double offsetLeft;
  readonly attribute double offsetTop;

  readonly attribute double pageLeft;
  readonly attribute double pageTop;

  readonly attribute double width;
  readonly attribute double height;

  readonly attribute double scale;

  attribute EventHandler onresize;
  attribute EventHandler onscroll;
  attribute EventHandler onscrollend;
};

課題索引

ユーザーエージェント間で、(協調された)ビューポート スクロール実行を使うか、スクロールボックス スクロール実行(レイアウトビューポートのスクロールボックス上)を使うかで一致していません。
オブジェクト IDL フラグメントがいくつかのメンバーを再定義しています。どう解決できますか?
DOM順序

p1 = RTLでも左上

scaleが0の場合はゼロ除算となり、0x0を返す

クロスフレームは許可されず、WrongDocumentErrorを投げる?

ポイントは平坦化される(3D変換)、z=0。getClientRectのように

インライン内でテストブロック

疑似要素 before/after は要素の子として扱う

ビューポートボックスは全て同じ

...
...
...
scrollendイベントはどの順序でdispatchされるか?スクロール開始順か完了順か?
CanIUse

Support:Android Browser3+Baidu Browser13.52+Blackberry Browser10+Chrome9+Chrome for Android139+Edge12+Firefox6+Firefox for Android142+IE10+IE Mobile10+KaiOS Browser2.5+Opera12.1+Opera MiniAllOpera Mobile12.1+QQ Browser14.9+Safari5.1+Safari on iOS5.0+Samsung Internet4+UC Browser for Android15.5+

Source: caniuse.com as of 2025-09-11

CanIUse

Support:Android Browser2.1+Baidu Browser13.52+Blackberry Browser7+Chrome4+Chrome for Android139+Edge12+Firefox18+Firefox for Android142+IE11+IE Mobile11+KaiOS Browser2.5+Opera11.6+Opera MiniAllOpera Mobile12+QQ Browser14.9+Safari3.1+Safari on iOS3.2+Samsung Internet4+UC Browser for Android15.5+

Source: caniuse.com as of 2025-09-11

CanIUse

Support:Android Browser2.3+Baidu Browser13.52+Blackberry Browser7+Chrome15+Chrome for Android139+Edge12+Firefox3+Firefox for Android142+IE6+IE Mobile10+KaiOS Browser2.5+Opera11+Opera MiniAllOpera Mobile12+QQ Browser14.9+Safari5+Safari on iOS4.0+Samsung Internet4+UC Browser for Android15.5+

Source: caniuse.com as of 2025-09-11

CanIUse

Support:Android Browser139+Baidu Browser13.52+Blackberry BrowserNoneChrome44+Chrome for Android139+Edge14+Firefox48+Firefox for Android142+IENoneIE MobileNoneKaiOS Browser2.5+Opera31+Opera MiniNoneOpera Mobile80+QQ Browser14.9+Safari9+Safari on iOS9.0+Samsung Internet4+UC Browser for Android15.5+

Source: caniuse.com as of 2025-09-11

CanIUse

Support:Android Browser139+Baidu Browser13.52+Blackberry BrowserNoneChrome61+Chrome for Android139+Edge79+Firefox36+Firefox for Android142+IENoneIE MobileNoneKaiOS Browser2.5+Opera48+Opera MiniNoneOpera Mobile80+QQ Browser14.9+Safari14+Safari on iOS14.5+Samsung Internet8.2+UC Browser for Android15.5+

Source: caniuse.com as of 2025-09-11

CanIUse

Support:Android Browser2.3+Baidu Browser13.52+Blackberry Browser7+Chrome4+Chrome for Android139+Edge12+Firefox12+Firefox for Android142+IE9+IE Mobile10+KaiOS Browser2.5+Opera10.6+Opera MiniAllOpera Mobile11+QQ Browser14.9+Safari4+Safari on iOS4.0+Samsung Internet4+UC Browser for Android15.5+

Source: caniuse.com as of 2025-09-11

CanIUse

Support:Android Browser139+Baidu Browser13.52+Blackberry Browser (limited)7+Chrome61+Chrome for Android139+Edge79+Firefox36+Firefox for Android142+IE (limited)8+IE Mobile (limited)10+KaiOS Browser2.5+Opera48+Opera MiniNoneOpera Mobile80+QQ Browser14.9+Safari16.0+Safari on iOS16.0+Samsung Internet8.2+UC Browser for Android15.5+

Source: caniuse.com as of 2025-09-11