1. 背景
この仕様で定義されている多くの機能は、長期間にわたりブラウザでサポートされてきました。本仕様の目的は、これらの機能をすべてのブラウザが相互運用可能な方法で実装できるように定義することです。また、スクロールのカスタマイズを可能にするいくつかの新しい機能も定義しています。
2. 用語
本仕様で用いられる用語は、DOM、CSSOM、HTMLからのものです。[DOM] [CSSOM] [HTML]
要素 body(これは body
要素)は、以下すべての条件が真である場合、スクロール可能性があるとみなされます:
-
body に関連付けられた ボックス がある。
-
body の 親要素 の overflow-x または overflow-y プロパティの計算値が visible でも clip でもない。
-
body の overflow-x または overflow-y プロパティの計算値が visible でも clip でもない。
注:
body
要素が スクロール可能性がある場合でも、スクロールボックスを持たない場合があります。
例えば、overflow
の使用値が
auto であっても、内容がそのコンテンツ領域からはみ出していない場合などです。
スクロールボックスは、ビューポートまたは要素のものであり、2つのオーバーフロー方向を持ちます。これらはそのビューポートや要素に対してのブロックエンド方向とインラインエンド方向です。 初期スクロール位置は、スクロール領域の原点に必ずしも揃うとは限りません。これは内容分布プロパティに依存するためです。詳しくはCSS ボックスアラインメント 3 § 5.3 アラインメントのオーバーフローとスクロールコンテナを参照してください。
スクロール領域とは、 ビューポートや要素のボックスであり、 ビューポートや要素の スクロールボックスの オーバーフロー方向に応じて、以下のようなエッジを持ちます。
オーバーフロー方向が… | ビューポートの場合 | 要素の場合 |
---|---|---|
右方向・下方向 | ||
左方向・下方向 | ||
左方向・上方向 | ||
右方向・上方向 |
原点とは、 スクロール領域の原点を指し、 初期包含ブロックの原点が スクロール領域が ビューポートである場合の原点です。 それ以外の場合は、要素のデフォルトスクロール位置における左上パディング端です。 x座標は右方向に増加し、y座標は下方向に増加します。
開始端とは、 ボックスや要素の特定の端集合において、以下の端を指します:
- オーバーフロー方向が右方向・下方向の場合
- 上端および左端。
- オーバーフロー方向が左方向・下方向の場合
- 上端および右端。
- オーバーフロー方向が左方向・上方向の場合
- 下端および右端。
- オーバーフロー方向が右方向・上方向の場合
- 下端および左端。
終了端とは、 ボックスや要素の特定の端集合において、以下の端を指します:
- オーバーフロー方向が右方向・下方向の場合
- 下端および右端。
- オーバーフロー方向が左方向・下方向の場合
- 下端および左端。
- オーバーフロー方向が左方向・上方向の場合
- 上端および左端。
- オーバーフロー方向が右方向・上方向の場合
- 上端および右端。
ビジュアルビューポートは、 ビューポートの一種であり、その スクロール領域は別の ビューポートとなり、 それを レイアウトビューポートと呼びます。
スクロールに加えて、ビジュアルビューポートは レイアウトビューポートにスケール変換も適用する場合があります。 この変換は レイアウトビューポートの キャンバスに適用され、 内部座標空間には影響しません。
注: ビジュアルビューポートのスケール変換は、一般的に「ピンチズーム」と呼ばれます。概念的には、この変換は CSS の 基準ピクセルのサイズを変更しますが、レイアウトビューポートのサイズも比例的に変更されるため、ページ内容のリフローを引き起こしません。
このスケール変換の大きさは、ビジュアルビューポートの スケールファクターと呼ばれます。
このアニメーションは、ズームされたビジュアルビューポートが(ユーザーがタッチドラッグするなどして)パンされる例を示しています。ページはスケールされ、レイアウトビューポートがビジュアルビューポートよりも大きくなっています。
スクロールの差分はまずビジュアルビューポートに適用されます。ビジュアルビューポートがその範囲に到達すると、スクロール差分はレイアウトビューポートに適用されます。この挙動は スクロールを実行する手順によって実装されています。
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
")で
スクロールを実行する際は、以下の手順を実行する:
- 進行中の スムーズスクロール を box について中断する。
-
ユーザーエージェントが scroll-behavior プロパティを考慮し、次のいずれかが真の場合:
- behavior が "
auto
" かつ element が null ではなく、その算出値 scroll-behavior が smooth - behavior が
smooth
注:
behavior: "instant"
は必ずこのアルゴリズムで 即時スクロール を実行する。注: ユーザー操作やプログラムによる呼び出しの結果、スクロール位置が変化しなかった場合(つまり変換が発生しなかった場合)、 スクロールが発生しなかったため scrollend イベントは発火しない。
- behavior が "
ユーザーエージェントが ビューポート を
ある位置 position へ、オプションのスクロール挙動 behavior(省略時は "auto
")で
スクロールを実行する際は、以下の協調スクロール手順を実行する:
-
vv を、関連付けられた文書が doc である
VisualViewport
とする。 -
dx を、position の水平方向成分 - vv の pageLeft 属性の値とする。
-
dy を、position の垂直方向成分 - vv の pageTop 属性の値とする。
-
visual x を vv の offsetLeft 属性の値とする。
-
visual y を vv の offsetTop 属性の値とする。
-
visual dx を min(maxX, max(0, visual x + dx)) - visual x とする。
-
visual dy を min(maxY, max(0, visual y + dy)) - visual y とする。
-
layout dx を dx - visual dx とする。
-
layout dy を dy - visual dy とする。
-
element を doc のルート要素があればそれ、なければ null とする。
-
スクロールを実行:ビューポートの スクロールボックス を、現在のスクロール位置 + (layout dx, layout dy) へ element を関連付け要素として、behavior をスクロール挙動として実行。
-
スクロールを実行:vv の スクロールボックス を、現在のスクロール位置 + (visual dx, visual dy) へ element を関連付け要素として、behavior をスクロール挙動として実行。
注: 概念的には、ビジュアルビューポートはレイアウトビューポートの端に「ぶつかる」までスクロールされ、その後スクロールデルタがレイアウトビューポートに「プッシュ」される。 しかし、上記の手順ではスクロールは先に計算され、逆順で適用される―つまりレイアウトビューポートが先にスクロールされる。これは履歴的理由およびスクロールイベントの順序を一定にするため。上の 例で視覚的に説明されている。
スクロールは、スクロール位置に保留中の更新や変換がなくなり、ユーザーがジェスチャーを完了したときに 完了する。 スクロール位置の更新にはスムーズまたは即時のマウスホイールスクロール、キーボードスクロール、スクロールスナップイベント、その他スクロール位置を更新・補間する API やジェスチャが含まれる。 タッチパンやトラックパッドスクロールなどのユーザー操作は、ポインタやキーが解放されるまで完了しない。
ユーザーエージェントが スクロールボックス box を position へ スムーズスクロール する場合、 box のスクロール位置をユーザーエージェント独自の方法で一定時間かけて更新する。 スクロールが 完了したら、 box のスクロール位置は position になっている必要がある。 スクロールはアルゴリズムやユーザーによって 中断されることもある。
ユーザーエージェントが スクロールボックス box を position へ 即時スクロールする場合、box のスクロール位置を position に更新する。
文書 document で 文書の先頭へスクロールするには、次の手順を実行する:
- viewport を document に関連付けられたビューポートとする。
- position を viewport の スクロール領域の 始端 を viewport の 始端 に合わせたときのスクロール位置とする。
- position が viewport の現在のスクロール位置と同じで、かつ viewport に進行中の スムーズスクロール がなければ、これらの手順を中断する。
- スクロールを実行:viewport を position へ、 document の ルート要素があればそれ、なければ null を関連付け要素として実行。
注: このアルゴリズムは HTML で定義される #top
フラグメント識別子へのナビゲーション時に使用される。[HTML]
テスト
- interrupt-hidden-smooth-scroll.html (ライブテスト) (ソース)
- long_scroll_composited.html (ライブテスト) (ソース)
- scroll-back-to-initial-position.html (ライブテスト) (ソース)
- scrolling-no-browsing-context.html (ライブテスト) (ソース)
- scrolling-quirks-vs-nonquirks.html (ライブテスト) (ソース)
- smooth-scroll-in-load-event.html (ライブテスト) (ソース)
- smooth-scroll-nonstop.html (ライブテスト) (ソース)
3.2. WebIDL 値
非有限値を正規化するよう要求されたとき、値 x が
3つの特別な浮動小数点リテラル値のいずれか(Infinity
, -Infinity
, NaN
)
であれば、x は 0
に変更されなければならない。 [WEBIDL]
4.
Window
インターフェイスへの拡張
enum {
ScrollBehavior ,
"auto" ,
"instant" };
"smooth" dictionary {
ScrollOptions ScrollBehavior = "auto"; };
behavior 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 contextundefined moveTo (long ,
x long );
y undefined moveBy (long ,
x long );
y undefined resizeTo (long ,
width long );
height undefined resizeBy (long ,
x long ); // viewport [
y 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 ); // client [
y 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)
が呼び出されたとき、次の手順を実行しなければならない:
- Let parsed media query list be the result of parsing query.
- 新しい
MediaQueryList
オブジェクトを返す。this の 関連付けられたDocument
をその document とし、 parsed media query list をその関連付けられた media query list とする。
screen
属性は、その Screen
オブジェクトを
当該 Window
オブジェクトに関連付けられたものとして返さなければならない。
注: screen
に WindowProxy
経由でアクセスすると、Document
がナビゲーションされたときに異なる結果を返す場合がある。
関連付けられた document が fully active であれば、visualViewport
属性は当該 VisualViewport
オブジェクトを、当該 Window
オブジェクトの 関連付けられた文書 に関連付けられたものとして返さなければならない。そうでなければ null
を返す。
注: VisualViewport オブジェクトは、その Document が現在表示されているウィンドウに対してのみ返され有用である。 関連付けられた Document が現在表示されていない VisualViewport への参照が保持されている場合、その VisualViewport の値はブラウジングコンテキストに関する情報を明らかにしてはならない。
テスト
moveTo(x, y)
メソッドは次の手順に従わなければならない:
-
任意で、返す。
-
target を this の relevant global object の browsing context とする。
-
target がスクリプトによって作成された auxiliary browsing context でない場合(ユーザーの操作によって作成された場合など)、返す。
-
任意で、ウィンドウが利用可能領域の外に移動しないように x と y をユーザーエージェント定義の方法でクランプする。
-
target のウィンドウの左上隅が出力デバイスの左上隅に対して座標 (x, y) になるようにウィンドウを移動させる。測定単位は CSS pixels で、正の軸は右方向と下方向である。
moveBy(x, y)
メソッドは次の手順に従わなければならない:
-
任意で、返す。
-
target を this の relevant global object の browsing context とする。
-
target がスクリプトによって作成された auxiliary browsing context でない場合、返す。
-
任意で、ウィンドウが利用可能領域の外に移動しないように x と y をユーザーエージェント定義の方法でクランプする。
-
target のウィンドウを x だけ右方向に、y だけ下方向に移動する。単位は CSS pixels である。
resizeTo(width, height)
メソッドは次の手順に従わなければならない:
-
任意で、返す。
-
target を this の relevant global object の browsing context とする。
-
target がスクリプトによって作成された auxiliary browsing context でない場合、返す。
-
任意で、ウィンドウが小さくなりすぎたり利用可能領域を超えたりしないように width と height をユーザーエージェント定義の方法でクランプする。
-
ビューポートの左端と右端の間の距離が width(CSS pixels)になり、上端と下端の間の距離が height(CSS pixels)になるように、右端と下端を動かして target のウィンドウをリサイズする。
-
任意で、ウィンドウが利用可能領域の外に広がらないように移動するなどの処理をユーザーエージェント定義の方法で行う。
resizeBy(x, y)
メソッドは次の手順に従わなければならない:
-
任意で、返す。
-
target を this の relevant global object の browsing context とする。
-
target がスクリプトによって作成された auxiliary browsing context でない場合、返す。
-
任意で、ウィンドウが小さくなりすぎたり利用可能領域を超えたりしないように x と y をユーザーエージェント定義の方法でクランプする。
-
target のウィンドウをリサイズする:右端を x(CSS pixels)だけ右方向に、下端を y(CSS pixels)だけ下方向に動かす。
-
任意で、ウィンドウが利用可能領域の外に広がらないように移動するなどの処理をユーザーエージェント定義の方法で行う。
innerWidth
属性は、レンダリングされたスクロールバー(存在する場合)のサイズを含む ビューポート
の幅を返さなければならない。ビューポートが存在しない場合はゼロを返す。
innerHeight
属性は、レンダリングされたスクロールバー(存在する場合)のサイズを含む ビューポート
の高さを返さなければならない。ビューポートが存在しない場合はゼロを返す。
scrollX
属性は、初期包含ブロックの原点に対する x 座標で表した、initial containing block
原点を基準としたビューポートの左端の位置を返す。ビューポートが存在しない場合はゼロを返す。
pageXOffset
属性は、scrollX
属性が返す値を返さなければならない。
scrollY
属性は、初期包含ブロックの原点に対する y 座標で表した、initial containing block
原点を基準としたビューポートの上端の位置を返す。ビューポートが存在しない場合はゼロを返す。
pageYOffset
属性は、scrollY
属性が返す値を返さなければならない。
メソッド scroll()
が呼び出されたとき、次の手順を実行しなければならない:
-
引数が1つで呼び出された場合、次のサブステップに従う:
-
引数が2つで呼び出された場合、次のサブステップに従う:
-
options を null を 変換して
ScrollToOptions
辞書とする。 [WEBIDL] -
x と y をそれぞれ引数とする。
-
-
非有限値を正規化する を x と y に対して行う。
-
ビューポートが存在しない場合、これらの手順を中止する。
-
viewport width を、スクロールバーの幅(存在する場合)を除いたビューポートの幅とする。
-
viewport height を、スクロールバーの高さ(存在する場合)を除いたビューポートの高さとする。
-
- ビューポートのオーバーフロード方向が右方向である場合
- x を max(0, min(x, ビューポートのスクロール領域幅 - viewport width)) にする。
- ビューポートのオーバーフロード方向が左方向である場合
- x を min(0, max(x, viewport width - ビューポートのスクロール領域幅)) にする。
-
- ビューポートのオーバーフロード方向が下方向である場合
- y を max(0, min(y, ビューポートのスクロール領域高さ - viewport height)) にする。
- ビューポートのオーバーフロード方向が上方向である場合
- y を min(0, max(y, viewport height - ビューポートのスクロール領域高さ)) にする。
-
position を、ビューポートのスクロール領域の x 座標 x をビューポートの左に、y 座標 y をビューポートの上に合わせたときにビューポートが持つであろうスクロール位置とする。
-
position がビューポートの現在のスクロール位置と同じであり、かつビューポートに進行中の スムーズスクロール がなければ、これらの手順を中止する。
-
document をビューポートに関連付けられた
Document
とする。 -
スクロールを実行:ビューポートを position へ、 document の ルート要素 を関連付け要素(存在する場合)として、options の
behavior
辞書メンバーの値をスクロール挙動として行う。ユーザーエージェント間で、この処理が(協調された)viewport の perform a scroll を使うべきか、あるいはレイアウトビューポートのスクロールボックスに対して perform a scroll を使うべきかで合意が得られていない。
テスト
メソッド scrollTo()
が呼び出された場合、ユーザーエージェントは同じ引数で scroll()
が呼び出されたかのように振る舞わなければならない。
メソッド scrollBy()
が呼び出されたとき、ユーザーエージェントは次の手順を実行しなければならない:
-
引数が2つで呼び出された場合、次のサブステップに従う:
-
options を null を 変換して
ScrollToOptions
辞書とする。 [WEBIDL] -
x と y をそれぞれ引数とする。
-
options の
left
辞書メンバーに値 x を設定する。 -
options の
top
辞書メンバーに値 y を設定する。
-
-
非有限値を正規化する を
left
とtop
辞書メンバーに対して行う。 -
その後、
scroll()
メソッドが options を唯一の引数として呼び出されたかのように振る舞う。
screenX
および screenLeft
属性は、クライアントウィンドウの左端の位置を
Web
に公開されるスクリーン領域
の原点に対する x 座標として返さなければならない。単位は CSS pixels で、存在しない場合はゼロを返す。
screenY
および screenTop
属性は、クライアントウィンドウの上端の位置を
Web
に公開されるスクリーン領域
の原点に対する y 座標として返さなければならない。単位は CSS pixels で、存在しない場合はゼロを返す。
outerWidth
属性はクライアントウィンドウの幅を返さなければならない。
クライアントウィンドウが存在しない場合はゼロを返す。
outerHeight
属性はクライアントウィンドウの高さを返さなければならない。
クライアントウィンドウが存在しない場合はゼロを返す。
devicePixelRatio
属性は、次の determine the device pixel
ratio アルゴリズムの結果を返さなければならない:
-
出力デバイスが存在しない場合、1 を返して手順を中止する。
-
CSS pixel size を、現在の page zoom での CSS pixel のサイズ(scale factor を 1.0 とした場合)とする。
-
device pixel size を、出力デバイスの垂直方向のデバイスピクセルのサイズとする。
-
CSS pixel size を device pixel size で割った結果を返す。
4.1. features 引数 — open()
メソッドへの指定
HTML は open()
メソッドを定義する。この節は features 引数で指定された位置およびサイズに関する振る舞いを定義する。[HTML]
ブラウジングコンテキスト機能を設定するには、 map 型の tokenizedFeatures が与えられたとき、ターゲットとなるブラウジングコンテキスト target に対して次を行う:
-
x を null にする。
-
y を null にする。
-
width を null にする。
-
height を null にする。
-
もし tokenizedFeatures["left"] が 存在するならば:
-
もし x がエラーなら、x を 0 に設定する。
-
任意で、ウィンドウが Web に公開される利用可能スクリーン領域 の外に移動しないように、 ユーザーエージェント定義の方法で x をクランプする。
-
任意で、target のウィンドウを移動し、ウィンドウの左端が Web に公開されるスクリーン領域 の左端に対して 水平座標 x に来るようにする。測定単位は CSS ピクセル(target の基準)である。正の軸は右方向である。
-
もし tokenizedFeatures["top"] が 存在するならば:
-
もし y がエラーなら、y を 0 に設定する。
-
任意で、ウィンドウが Web に公開される利用可能スクリーン領域 の外に移動しないように、 ユーザーエージェント定義の方法で y をクランプする。
-
任意で、target のウィンドウを移動し、ウィンドウの上端が Web に公開されるスクリーン領域 の上端に対して 垂直座標 y に来るようにする。測定単位は CSS ピクセル(target の基準)である。正の軸は下方向である。
-
もし tokenizedFeatures["width"] が 存在するならば:
-
width を tokenizedFeatures["width"] に対して 整数パース規則 を適用した結果に設定する。
-
もし width がエラーなら、width を 0 に設定する。
-
もし width が 0 でないなら:
-
任意で、ウィンドウが小さくなりすぎたり Web に公開される利用可能スクリーン領域 より大きくならないように、 ユーザーエージェント定義の方法で width をクランプする。
-
任意で、target のウィンドウの右端を移動させ、ビューポートの左右端の間の距離が width CSS ピクセル になるようにウィンドウをサイズ変更する(target 基準)。
-
任意で、target のウィンドウが Web に公開される利用可能スクリーン領域 の外に広がらないようにユーザーエージェント定義の方法で移動する。
-
-
-
もし tokenizedFeatures["height"] が 存在するならば:
-
height を tokenizedFeatures["height"] に対して 整数パース規則 を適用した結果に設定する。
-
もし height がエラーなら、height を 0 に設定する。
-
もし height が 0 でないなら:
-
任意で、ウィンドウが小さくなりすぎたり Web に公開される利用可能スクリーン領域 より大きくならないように、 ユーザーエージェント定義の方法で height をクランプする。
-
任意で、target のウィンドウの下端を移動させ、ビューポートの上下端の間の距離が height CSS ピクセル になるようにウィンドウをサイズ変更する(target 基準)。
-
任意で、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 について次の手順を実行する:
-
MediaQueryList
オブジェクト target を、doc をその document として持つものすべてについて、 作成された順序(古い順)で、それぞれ次のサブステップを実行する:- もし target の matches state が前回この手順を実行した時から変化しているなら、
イベントを発火する。
発火するイベント名は change で、対象は target、
使用するイベントは
MediaQueryListEvent
である。 その際、isTrusted 属性は true に初期化され、media 属性は target の media に、 matches 属性は target の matches state に初期化される。
- もし target の matches state が前回この手順を実行した時から変化しているなら、
イベントを発火する。
発火するイベント名は change で、対象は target、
使用するイベントは
function handleOrientationChange( event) { if ( event. matches) // landscape …else …} 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)
メソッドが呼ばれたとき、
次の手順を実行しなければならない:
-
イベントリスナーを追加する:this を対象とし、タイプが
change
の イベントリスナー を追加し、そのコールバックに callback を使う。
removeListener(callback)
メソッドが呼ばれたとき、
次の手順を実行しなければならない:
-
もし 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
- MediaQueryList-addListener-handleEvent.html (ライブテスト) (ソース)
- MediaQueryList-addListener-removeListener.html (ライブテスト) (ソース)
- MediaQueryList-change-event-matches-value.html (ライブテスト) (ソース)
- MediaQueryList-extends-EventTarget-interop.html (ライブテスト) (ソース)
- MediaQueryList-extends-EventTarget.html (ライブテスト) (ソース)
- MediaQueryListEvent.html (live test) (ソース)
[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 を返すべきである。
注: 互換性のために colorDepth
と pixelDepth
は同じ値を返す。
注: 一部の非準拠実装では 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)
メソッドは以下の手順に従う必要があります:
-
いずれかの引数が負の場合、x がビューポートの幅(表示されたスクロールバーのサイズを除く)より大きい場合、または y が ビューポートの高さ(表示されたスクロールバーのサイズを除く)より大きい場合、または文書に関連付けられた ビューポート が存在しない場合は、null を返してこれらの手順を終了する。
-
ボックスが ビューポート内にあり、座標 x,y でヒットテストのターゲットとなる場合、 descendants of the ビューポート に適用される変形 を適用したときに、関連付けられた要素を返してこれらの手順を終了する。
-
文書が ルート要素 を持つ場合は、ルート要素 を返してこれらの手順を終了する。
-
null を返す。
注: elementFromPoint()
メソッドは必ずしも最上位に描画された要素を返すとは限りません。
例えば、pointer-events CSSプロパティを使うことで、要素がヒットテストのターゲットから除外されることがあります。
テスト
- elementFromPoint-001.html (ライブテスト) (ソース)
- elementFromPoint-002.html (ライブテスト) (ソース)
- elementFromPoint-003.html (ライブテスト) (ソース)
- elementFromPoint-dynamic-anon-box.html (ライブテスト) (ソース)
- elementFromPoint-ellipsis-in-inline-box.html (ライブテスト) (ソース)
- elementFromPoint-float-in-relative.html (ライブテスト) (ソース)
- elementFromPoint-float-in-table.html (ライブテスト) (ソース)
- elementFromPoint-list-001.html (ライブテスト) (ソース)
- elementFromPoint-mixed-font-sizes.html (ライブテスト) (ソース)
- elementFromPoint-parameters.html (ライブテスト) (ソース)
- elementFromPoint-subpixel.html (ライブテスト) (ソース)
- elementFromPoint-visibility-hidden-resizer.html (ライブテスト) (ソース)
- elementFromPoint.html (ライブテスト) (ソース)
- elementFromPosition.html (ライブテスト) (ソース)
- negativeMargins.html (ライブテスト) (ソース)
elementsFromPoint(x, y)
メソッドは以下の手順に従う必要があります:
-
sequence を新しい空のシーケンスとして作成する。
-
いずれかの引数が負の場合、x が ビューポートの幅(表示されたスクロールバーのサイズを除く)より大きい場合、または y が ビューポートの高さ(表示されたスクロールバーのサイズを除く)より大きい場合、または文書に関連付けられた ビューポート が存在しない場合は、 sequence を返してこれらの手順を終了する。
-
ボックスごとに ビューポート内で、ペイント順で最上位から、座標 x,y で何も重なっていなくてもヒットテストのターゲットとなる場合、descendants of the ビューポート に適用される変形 を適用したときに、関連付けられた要素を sequence に追加する。
-
文書が ルート要素 を持ち、sequence の最後の項目が ルート要素 でない場合、ルート要素 を sequence に追加する。
-
sequence を返す。
テスト
- elementsFromPoint-iframes.html (ライブテスト) (ソース)
- elementsFromPoint-inline-htb-ltr.html (ライブテスト) (ソース)
- elementsFromPoint-inline-htb-rtl.html (ライブテスト) (ソース)
- elementsFromPoint-inline-vlr-ltr.html (ライブテスト) (ソース)
- elementsFromPoint-inline-vlr-rtl.html (ライブテスト) (ソース)
- elementsFromPoint-inline-vrl-ltr.html (ライブテスト) (ソース)
- elementsFromPoint-inline-vrl-rtl.html (ライブテスト) (ソース)
- elementsFromPoint-invalid-cases.html (ライブテスト) (ソース)
- elementsFromPoint-shadowroot.html (ライブテスト) (ソース)
- elementsFromPoint-simple.html (ライブテスト) (ソース)
- elementsFromPoint-svg-text.html (ライブテスト) (ソース)
- elementsFromPoint-svg.html (ライブテスト) (ソース)
- elementsFromPoint-table.html (ライブテスト) (ソース)
- elementsFromPoint.html (ライブテスト) (ソース)
caretPositionFromPoint(x, y, options)
メソッドは以下の手順を実行した結果を返す必要があります:
-
文書に関連付けられた ビューポート が存在しない場合、null を返す。
-
いずれかの引数が負の場合、x が ビューポートの幅(表示されたスクロールバーのサイズを除く)より大きい場合、y が ビューポートの高さ(表示されたスクロールバーのサイズを除く)より大きい場合は null を返す。
-
座標 x,y の ビューポートで、descendants of the ビューポート に適用される 変形 を適用したときに、テキスト挿入ポイントインジケーターが挿入されない場合、null を返す。
-
座標 x,y の ビューポートで、テキスト挿入ポイントインジケーターがテキスト入力ウィジェット(かつ置換要素でもある)に挿入される場合、descendants of the ビューポート に適用される 変形 を適用したとき、以下のプロパティを設定した キャレット位置 を返す:
- キャレットノード
- テキスト入力ウィジェットに対応するノード。
- キャレットオフセット
- テキスト挿入ポイントインジケーターが挿入される位置の左側の16ビット単位の数。
-
それ以外の場合:
-
caretPosition を、タプルとし、caretPositionNode(ノード)および caretPositionOffset(非負整数)から構成されます。これは、テキスト挿入ポイントインジケーターが transform を ビューポート の子孫に適用した場合に挿入される位置を示します。
-
startNode を caretPosition の caretPositionNode に、startOffset を caretPosition の caretPositionOffset に設定する。
-
startNode がノードであり、startNode の ルートがシャドウルートであり、さらに startNode の ルート が shadow-including inclusive ancestor でない場合、options["
shadowRoots
"] のいずれかについて、以下の手順を繰り返す: -
以下のプロパティを設定した キャレット位置 を返す:
-
キャレットノード を startNode に設定する。
-
キャレットオフセット を startOffset に設定する。
-
-
注: ヒットテストの詳細はこの仕様の範囲外であり、したがって elementFromPoint()
や caretPositionFromPoint()
の正確な詳細も範囲外です。ヒットテストは今後 CSS または HTML の改訂で定義される予定です。
scrollingElement
属性は、取得時に以下の手順を実行する必要があります:
-
Document
が quirks モードの場合、以下のサブステップに従う:-
body
要素が存在し、かつ potentially scrollable でない場合、body
要素を返し、これらのステップを中止する。この目的のために、
body
要素の親要素に overflow:clip が指定されている場合は、overflow:hidden として扱わなければならない。 -
null を返し、これらのステップを中止する。
-
-
root 要素が存在する場合、root 要素を返し、これらのステップを中止する。
-
null を返す。
注記: scrollTop
および scrollLeft
に対して常に quirks モードの挙動を使用する非準拠なユーザーエージェントの場合、scrollingElement
属性も常に body
要素(存在しなければ null)を返すことが期待される。 この API は、Web
開発者が特定のユーザーエージェントの挙動を推測せずに、スクロール API
に使うべき要素を取得できるように、またどの要素がビューポートをスクロールするかを判定するためにスクロールを発生させる必要がないように存在している。
注記: body
要素は HTML の document.body
とは異なり、後者は
frameset
要素を返す場合がある。
テスト
5.1.
CaretPosition
インターフェイス
caret
positionは、テキスト挿入ポイントインジケーターの位置を表します。常に関連付けられたcaret nodeとcaret 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()
メソッドは、以下のステップに従い、最初に値を返すステップで中止する:
-
caret nodeが置換要素であるテキスト入力ウィジェットであり、かつそれがドキュメント内に存在する場合、ウィジェット内のキャレットに対応するscaled
DOMRect
オブジェクトをcaret offset値で返す。要素およびその祖先に適用されるtransformsを適用する。 -
それ以外の場合:
-
caretRange を、start nodeおよびend nodeがcaret node、start offsetおよびend offsetがcaret offsetに設定された、collapsedな
Range
オブジェクトとする。 -
caretRange に対して
DOMRect
オブジェクトを、getBoundingClientRect()
メソッドを呼び出して返す。
-
注記: この DOMRect
オブジェクトは live ではない。
6. Element
インターフェイスの拡張
enum {
ScrollLogicalPosition ,
"start" ,
"center" ,
"end" };
"nearest" dictionary :
ScrollIntoViewOptions ScrollOptions {ScrollLogicalPosition = "start";
block ScrollLogicalPosition = "nearest";
inline ScrollIntoViewContainer = "all"; };
container 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()
メソッドが呼び出されたとき、以下のアルゴリズムの結果を返さなければならない:
-
呼び出された要素に関連付けられたboxがない場合、空の
DOMRectList
オブジェクトを返し、このアルゴリズムを終了する。 -
要素が関連付けられたSVGレイアウトボックスを持っている場合、SVG仕様で定義されるバウンディングボックスを記述する scaled
DOMRectList
オブジェクトを返す。このとき、要素および祖先に適用されるtransformsを適用する。 -
DOMRectList
オブジェクトを返し、DOMRect
オブジェクトをコンテンツ順で含める。各ボックスフラグメントごとに、そのborder領域(高さまたは幅が0の場合も含む)を記述し、以下の制約を適用する:-
要素および祖先に適用されるtransformsを適用する。
-
呼び出された要素の display プロパティの算出値が table または inline-table の場合、テーブルボックスとキャプションボックス(存在する場合)を含め、匿名コンテナボックスは含めない。
-
注記: DOMRect
オブジェクトは getClientRects()
によって返された場合、live ではない。
テスト
- cssom-getClientRects-002.html (ライブテスト) (ソース)
- cssom-getClientRects.html (ライブテスト) (ソース)
- DOMRectList.html (ライブテスト) (ソース)
- getClientRects-br-htb-ltr.html (ライブテスト) (ソース)
- getClientRects-br-htb-rtl.html (ライブテスト) (ソース)
- getClientRects-br-vlr-ltr.html (ライブテスト) (ソース)
- getClientRects-br-vlr-rtl.html (ライブテスト) (ソース)
- getClientRects-br-vrl-ltr.html (ライブテスト) (ソース)
- getClientRects-br-vrl-rtl.html (ライブテスト) (ソース)
- getClientRects-inline-atomic-child.html (ライブテスト) (ソース)
- getClientRects-inline-inline-child.html (ライブテスト) (ソース)
- getClientRects-inline.html (ライブテスト) (ソース)
- getClientRects-zoom.html (ライブテスト) (ソース)
- historical.html (ライブテスト) (ソース)
- ttwf-js-cssomview-getclientrects-length.html (ライブテスト) (ソース)
getBoundingClientRect()
メソッドは、
要素 element 上で呼び出された場合、バウンディングボックスの取得 を element に対して実行した結果を返さなければならない。
注記: DOMRect
オブジェクトは getBoundingClientRect()
で返された場合、ライブ ではない。
div
要素の寸法を取得する例です:
var example= document. getElementsByTagName( "div" )[ 0 ]. getBoundingClientRect(); var exampleWidth= example. width; var exampleHeight= example. height;
テスト
- cssom-getBoundingClientRect-001.html (ライブテスト) (ソース)
- cssom-getBoundingClientRect-002.html (ライブテスト) (ソース)
- cssom-getBoundingClientRect-003.html (ライブテスト) (ソース)
- cssom-getBoundingClientRect-vertical-rl.html (ライブテスト) (ソース)
- getBoundingClientRect-empty-inline.html (ライブテスト) (ソース)
- getBoundingClientRect-newline.html (ライブテスト) (ソース)
- getBoundingClientRect-scroll.html (ライブテスト) (ソース)
- getBoundingClientRect-shy.html (ライブテスト) (ソース)
- getBoundingClientRect-svg.html (ライブテスト) (ソース)
- getBoundingClientRect-zoom.html (ライブテスト) (ソース)
- GetBoundingRect.html (ライブテスト) (ソース)
checkVisibility()
メソッドは、
要素が潜在的に「可視」であるかどうかを簡易的に判定する一連のチェックを提供します。
デフォルトでは ボックスツリー に基づく非常にシンプルかつ直接的な方法ですが、
「可視性」の具体的な定義に応じて、いくつかの追加チェックを選択的に有効にできます。
checkVisibility(options)
メソッドは、
要素 this 上で呼び出された場合、以下のステップを実行しなければならない:
-
this に対応する ボックス がない場合、 false を返す。
-
this の祖先が フラットツリー 上で content-visibility: hidden を持つ場合、 false を返す。
-
options の
opacityProperty
またはcheckOpacity
のいずれかが true であり、 this またはその祖先が フラットツリー 上で 計算された opacity の値が 0 の場合、 false を返す。 -
options の
visibilityProperty
またはcheckVisibilityCSS
のいずれかが true であり、 this が 不可視 である場合、 false を返す。 -
options の
contentVisibilityAuto
が true であり、 this の祖先が フラットツリー 上で content-visibility: auto により内容をスキップする 場合、 false を返す。 -
true を返す。
scrollIntoView(arg)
メソッドは、以下のステップを実行しなければならない:
-
behavior を "
auto
" にする。 -
block を "
start
" にする。 -
inline を "
nearest
" にする。 -
container を
null
にする。 -
arg が
ScrollIntoViewOptions
辞書の場合、次を行う: -
それ以外で arg が false の場合、block を "
end
" に設定する。 -
要素に関連する ボックス がない場合、 またはユーザーエージェントの機能で利用できない場合、何もせず return する。
-
要素をビュー内へスクロール を behavior, block, inline, container で行う。
-
必要に応じて、ユーザーの注意を引くための追加動作を行ってもよい。
< style >
. scroller { overflow : auto ; scroll-padding : 8 px ; }
. slide { scroll-margin : 16 px ; 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 >
テスト
- scrollIntoView-align-scrollport-covering-child.html (ライブテスト) (ソース)
- scrollIntoView-container.html (ライブテスト) (ソース)
- scrollintoview-containingblock-chain.html (ライブテスト) (ソース)
- scrollIntoView-fixed-outside-of-viewport.html (ライブテスト) (ソース)
- scrollIntoView-fixed.html (ライブテスト) (ソース)
- scrollIntoView-horizontal-partially-visible.html (ライブテスト) (ソース)
- scrollIntoView-horizontal-tb-writing-mode-and-rtl-direction.html (ライブテスト) (ソース)
- scrollIntoView-horizontal-tb-writing-mode.html (ライブテスト) (ソース)
- scrollIntoView-inline-image.html (ライブテスト) (ソース)
- scrollIntoView-multiple-nested.html (ライブテスト) (ソース)
- scrollIntoView-multiple.html (ライブテスト) (ソース)
- scrollIntoView-scrolling-container.html (ライブテスト) (ソース)
- scrollIntoView-scrollMargin.html (ライブテスト) (ソース)
- scrollIntoView-scrollPadding.html (ライブテスト) (ソース)
- scrollIntoView-shadow.html (ライブテスト) (ソース)
- scrollIntoView-should-treat-slot-as-scroll-container.html (ライブテスト) (ソース)
- scrollIntoView-sideways-lr-writing-mode-and-rtl-direction.html (ライブテスト) (ソース)
- scrollIntoView-sideways-lr-writing-mode.html (ライブテスト) (ソース)
- scrollIntoView-sideways-rl-writing-mode-and-rtl-direction.html (ライブテスト) (ソース)
- scrollIntoView-sideways-rl-writing-mode.html (ライブテスト) (ソース)
- scrollIntoView-smooth.html (ライブテスト) (ソース)
- scrollIntoView-stuck.tentative.html (ライブテスト) (ソース)
- scrollIntoView-svg-shape.html (ライブテスト) (ソース)
- scrollIntoView-vertical-lr-writing-mode-and-rtl-direction.html (ライブテスト) (ソース)
- scrollIntoView-vertical-lr-writing-mode.html (ライブテスト) (ソース)
- scrollIntoView-vertical-rl-writing-mode.html (ライブテスト) (ソース)
- scrollintoview-zero-height-item.html (ライブテスト) (ソース)
- scrollintoview.html (live test) (ソース)
- smooth-scrollIntoView-with-smooth-fragment-scroll.html (ライブテスト) (ソース)
- smooth-scrollIntoView-with-unrelated-gesture-scroll.html (ライブテスト) (ソース)
- visual-scrollIntoView-001.html (ライブテスト) (ソース)
- visual-scrollIntoView-002.html (ライブテスト) (ソース)
- visual-scrollIntoView-003.html (ライブテスト) (ソース)
scroll()
メソッドは次の手順を実行しなければならない:
-
引数が1つの場合、以下のサブステップに従う:
-
引数が2つの場合、以下のサブステップに従う:
-
options を null 変換した
ScrollToOptions
辞書とする。 -
x、y をそれぞれ引数とする。
-
x と y に対して 非有限値の正規化 を行う。
-
options の
left
辞書メンバーに x を設定する。 -
options の
top
辞書メンバーに y を設定する。
-
-
document を要素の ノード文書とする。
-
document が アクティブ文書でない場合、これらの手順を終了する。
-
window を document の
defaultView
属性の値とする。 -
window が null の場合、これらの手順を終了する。
-
要素が root 要素 かつ document が quirks モードの場合、これらの手順を終了する。
-
要素が root 要素 の場合、window 上で
scroll()
をscrollX
(第1引数)と y(第2引数)で呼び出し、これらの手順を終了する。 -
要素が
body
要素 かつ document が quirks モードかつ要素が potentially scrollable でない場合、window 上でscroll()
を options を引数として呼び出し、これらの手順を終了する。 -
要素に関連付けられた box がない場合、要素に関連付けられた scrolling box がない場合、または要素にオーバーフローがない場合、これらの手順を終了する。
-
要素をスクロールし、x,y に移動する。スクロールの挙動は options の
behavior
辞書メンバーの値とする。
scrollTo()
メソッドが呼び出された場合、ユーザーエージェントは scroll()
メソッドが同じ引数で呼び出されたかのように動作しなければならない。
scrollBy()
メソッドが呼び出された場合、ユーザーエージェントは次の手順を実行しなければならない:
-
引数が1つの場合、以下のサブステップに従う:
-
引数が2つの場合、以下のサブステップに従う:
-
options を null 変換した
ScrollToOptions
辞書とする。 -
x、y をそれぞれ引数とする。
-
x と y に対して 非有限値の正規化 を行う。
-
options の
left
辞書メンバーに x を設定する。 -
options の
top
辞書メンバーに y を設定する。
-
-
scrollLeft
の値をleft
辞書メンバーに加算する。 -
scroll()
メソッドが options を唯一の引数として呼び出されたかのように動作する。
scrollTop
属性は、取得時に次の手順を実行した結果を返さなければならない:
-
document を要素の ノード文書とする。
-
document が アクティブ文書でない場合、0 を返しこれらの手順を終了する。
-
window を document の
defaultView
属性の値とする。 -
window が null の場合、0 を返しこれらの手順を終了する。
-
要素が root 要素 かつ document が quirks モード の場合、0 を返しこれらの手順を終了する。
-
要素が
body
要素 かつ document が quirks モード、かつ要素が potentially scrollable でない場合、window のscrollY
の値を返す。 -
要素に関連付けられた box がない場合、0 を返しこれらの手順を終了する。
-
要素の scrolling area の y 座標(要素の padding edge の上端との揃え位置)を返す。
scrollTop
属性を設定する場合、次の手順を実行しなければならない:
-
y を与えられた値とする。
-
y に対して 非有限値の正規化 を行う。
-
document を要素の ノード文書とする。
-
document が アクティブ文書 でない場合、これらの手順を終了する。
-
window を document の
defaultView
属性の値とする。 -
window が null の場合、これらの手順を終了する。
-
要素が root 要素 かつ document が quirks モード の場合、これらの手順を終了する。
-
要素が root 要素 の場合、window 上で
scroll()
をscrollX
(第1引数)と y(第2引数)で呼び出し、これらの手順を終了する。 -
要素が
body
要素 かつ document が quirks モード、かつ要素が potentially scrollable でない場合、window 上でscroll()
をscrollX
(第1引数)と y(第2引数)で呼び出し、これらの手順を終了する。 -
要素に関連付けられた box がない場合、要素に関連付けられた scrolling box がない場合、または要素にオーバーフローがない場合、これらの手順を終了する。
-
要素をスクロールし、
scrollLeft
,y に移動する。スクロールの挙動は "auto
" とする。
テスト
- dom-element-scroll.html (live test) (ソース)
- elementScroll-002.html (live test) (ソース)
- elementScroll.html (live test) (ソース)
- scroll-no-layout-box.html (ライブテスト) (ソース)
- scroll-offsets-fractional-zoom.html (ライブテスト) (ソース)
- scroll-zoom.html (live test) (ソース)
- scrollTop-display-change.html (ライブテスト) (ソース)
- table-scroll-props.html (live test) (ソース)
scrollLeft
属性は、取得時に以下の手順を実行した結果を返さなければならない:
-
document を要素の ノード文書とする。
-
document が アクティブ文書でない場合、0 を返してこれらの手順を終了する。
-
window を document の
defaultView
属性の値とする。 -
window が null の場合、0 を返してこれらの手順を終了する。
-
要素が root 要素 かつ document が quirks モードの場合、0 を返してこれらの手順を終了する。
-
要素が
body
要素であり、document が quirks モード、かつ要素が potentially scrollable でない場合、window のscrollX
の値を返す。 -
要素に関連付けられた box がない場合、0 を返してこれらの手順を終了する。
-
要素の scrolling area の x 座標(要素の padding edge の左端との揃え位置)を返す。
scrollLeft
属性を設定する場合は、以下の手順を実行しなければならない:
-
x を与えられた値とする。
-
x に対して 非有限値の正規化 を行う。
-
document を要素の ノード文書とする。
-
document が アクティブ文書でない場合、これらの手順を終了する。
-
window を document の
defaultView
属性の値とする。 -
window が null の場合、これらの手順を終了する。
-
要素が root 要素 かつ document が quirks モードの場合、これらの手順を終了する。
-
要素が root 要素 の場合、window 上で
scroll()
を第1引数 x、第2引数 window のscrollY
の値で呼び出し、これらの手順を終了する。 -
要素が
body
要素であり、document が quirks モード、かつ要素が potentially scrollable でない場合、window 上でscroll()
を第1引数 x、第2引数 window のscrollY
の値で呼び出し、これらの手順を終了する。 -
要素に関連付けられた box がない場合、要素に関連付けられた scrolling box がない場合、または要素にオーバーフローがない場合、これらの手順を終了する。
テスト
scrollWidth
属性は、以下の手順を実行した結果を返さなければならない:
-
document を要素の ノード文書とする。
-
document が アクティブ文書でない場合、0 を返してこれらの手順を終了する。
-
viewport width を viewport の幅(スクロールバーの幅を除く。なければ0)とし、viewport がなければ0とする。
-
要素が root 要素 かつ document が quirks モードでない場合、max(viewport の scrolling area の幅, viewport width) を返す。
-
要素が
body
要素であり、document が quirks モード、かつ要素が potentially scrollable でない場合、max(viewport の scrolling area の幅, viewport width) を返す。 -
要素に関連付けられた box がない場合、0 を返してこれらの手順を終了する。
-
要素の scrolling area の幅を返す。
テスト
- pt-to-px-width.html (live test) (ソース)
- scrollWidthHeight-contain-layout.html (ライブテスト) (ソース)
- scrollWidthHeight-negative-margin-001.html (ライブテスト) (ソース)
- scrollWidthHeight-negative-margin-002.html (ライブテスト) (ソース)
- scrollWidthHeight-overflow-visible-margin-collapsing.html (ライブテスト) (ソース)
- scrollWidthHeight-overflow-visible-negative-margins.html (ライブテスト) (ソース)
- scrollWidthHeight.xht (live test) (ソース)
- scrollWidthHeightWhenNotScrollable.xht (ライブテスト) (ソース)
scrollHeight
属性は、以下の手順を実行した結果を返さなければならない:
-
document を要素の ノード文書とする。
-
document が アクティブ文書でない場合、0 を返してこれらの手順を終了する。
-
viewport height を viewport の高さ(スクロールバーの高さを除く。なければ0)とし、viewport がなければ0とする。
-
要素が root 要素 かつ document が quirks モードでない場合、max(viewport の scrolling area の高さ, viewport height) を返す。
-
要素が
body
要素であり、document が quirks モード、かつ要素が potentially scrollable でない場合、max(viewport の scrolling area の高さ, viewport height) を返す。 -
要素に関連付けられた box がない場合、0 を返してこれらの手順を終了する。
-
要素の scrolling area の高さを返す。
clientTop
属性は、以下の手順を実行しなければならない:
-
要素に関連付けられた box がない、または box がインラインの場合、0 を返す。
-
unscaled な border-top-width プロパティの算出値に、上側の padding edge と上側の border edge の間にレンダリングされたスクロールバーの高さを加算した値を返す。要素および祖先に適用される transforms は無視する。
テスト
clientLeft
属性は、以下の手順を実行しなければならない:
-
要素に関連付けられた box がない、または box がインラインの場合、0 を返す。
-
unscaled な border-left-width プロパティの算出値に、左側の padding edge と左側の border edge の間にレンダリングされたスクロールバーの幅を加算した値を返す。要素および祖先に適用される transforms は無視する。
clientWidth
属性は、以下の手順を実行しなければならない:
-
要素に関連付けられた box がない、または box がインラインの場合、0 を返す。
-
要素が root 要素 かつ要素の ノード文書 が quirks モードでない場合、または要素が
body
要素であり、要素の ノード文書が quirks モードの場合、viewport の幅(スクロールバーのサイズを除く)を返す。 -
unscaled な padding edge の幅から、padding edge と border edge の間にレンダリングされたスクロールバーの幅を除いた値を返す。要素および祖先に適用される transforms は無視する。
clientHeight
属性は、以下の手順を実行しなければならない:
-
要素に関連付けられた box がない、または box がインラインの場合、0 を返す。
-
要素が root 要素 かつ要素の ノード文書 が quirks モードでない場合、または要素が
body
要素であり、要素の ノード文書が quirks モードの場合、viewport の高さ(スクロールバーのサイズを除く)を返す。 -
unscaled な padding edge の高さから、padding edge と border edge の間にレンダリングされたスクロールバーの高さを除いた値を返す。要素および祖先に適用される transforms は無視する。
currentCSSZoom
属性は、要素の effective
zoom を返す。要素が being rendered でない場合は 1.0 を返す。
テスト
6.1.
Element
スクロール関連メンバー
scroll-into-view の位置を決定するには、 target(Element、 疑似要素、または Range) とスクロール動作 behavior、ブロックフロー方向位置 block、インライン基底方向位置 inline、 スクロールボックス scrolling box を用いて、次の手順を実行する:
-
target bounding border box を、target が Element の場合は Element の
getBoundingClientRect()
、 target が Range の場合は Range のgetBoundingClientRect()
を呼び出した返り値で表されるボックスとする。 -
scrolling box edge A を スクロールボックスのブロックフロー方向における開始端とし、element edge A を target bounding border box の同じ物理的側の端とする。
-
scrolling box edge B を スクロールボックスのブロックフロー方向における終了端とし、element edge B を target bounding border box の同じ物理的側の端とする。
-
scrolling box edge C を スクロールボックスのインライン基底方向における開始端とし、element edge C を target bounding border box の同じ物理的側の端とする。
-
scrolling box edge D を スクロールボックスのインライン基底方向における終了端とし、element edge D を target bounding border box の同じ物理的側の端とする。
-
element height を element edge A と element edge B の距離とする。
-
scrolling box height を scrolling box edge A と scrolling box edge B の距離とする。
-
element width を element edge C と element edge D の距離とする。
-
scrolling box width を scrolling box edge C と scrolling box edge D の距離とする。
-
position を、以下の手順に従って scrolling box が持つスクロール位置とする:
-
block が "
start
" の場合、element edge A を scrolling box edge A に合わせる。 -
それ以外で block が "
end
" の場合、element edge B を scrolling box edge B に合わせる。 -
それ以外で block が "
center
" の場合、target bounding border box の中央を scrolling box の中央に合わせる(scrolling box の ブロックフロー方向で)。 -
それ以外の場合、block は "
nearest
" である:- element edge A と element edge B がともに scrolling box edge A と scrolling box edge B の外側にある場合
- 何もしない。
- element edge A が scrolling box edge A の外側にあり、かつ element
height が scrolling box height より小さい場合
- element edge B が scrolling box edge B の外側にあり、かつ element height が scrolling box height より大きい場合
- element edge A を scrolling box edge A に合わせる。
- element edge A が scrolling box edge A の外側にあり、かつ element
height が scrolling box height より大きい場合
- element edge B が scrolling box edge B の外側にあり、かつ element height が scrolling box height より小さい場合
- element edge B を scrolling box edge B に合わせる。
-
inline が "
start
" の場合、element edge C を scrolling box edge C に合わせる。 -
それ以外で inline が "
end
" の場合、element edge D を scrolling box edge D に合わせる。 -
それ以外で inline が "
center
" の場合、target bounding border box の中央を scrolling box の中央に合わせる(scrolling box の インライン基底方向で)。 -
それ以外の場合、inline は "
nearest
" である:- element edge C と element edge D がともに scrolling box edge C と scrolling box edge D の外側にある場合
- 何もしない。
- element edge C が scrolling box edge C の外側にあり、かつ element
width が scrolling box width より小さい場合
- element edge D が scrolling box edge D の外側にあり、かつ element width が scrolling box width より大きい場合
- element edge C を scrolling box edge C に合わせる。
- element edge C が scrolling box edge C の外側にあり、かつ element
width が scrolling box width より大きい場合
- element edge D が scrolling box edge D の外側にあり、かつ element width が scrolling box width より小さい場合
- element edge D を scrolling box edge D に合わせる。
-
target が Element の場合で、その要素が scroll snap position を定義している場合、 ユーザーエージェントは、その最近接の スクロールコンテナ が scroll snap container である場合、 結果の position をその要素のいずれかの scroll snap position に スナップしなければならない。 scroll container が scroll-snap-type: none の場合も、ユーザーエージェントはこれを行ってもよい。
-
position を返す。
-
ターゲットを表示領域にスクロールするには、 target(Element、 疑似要素、または Range) とスクロール動作 behavior、ブロックフロー方向位置 block、インライン基底方向位置 inline、 およびオプションの Element(container)を指定してスクロールを止めるため、以下の手順を実行する:
-
各祖先要素または viewport で スクロールボックス scrolling box を確立するものについて、内側から外側の順に次のサブステップを実行する:
-
target に関連付けられた
Document
が、 要素または viewport に関連付けられたDocument
と 同一オリジンでない場合、これらの手順を終了する。 -
position を、target の scroll-into-view の位置を決定する の手順を、 behavior(スクロール動作)、block(ブロックフロー位置)、inline(インライン基底方向位置)、scrolling box(スクロールボックス)で呼び出した結果とする。
-
position が scrolling box の現在のスクロール位置と異なる場合、または scrolling box に スムーズスクロール が進行中の場合、
-
- scrolling box が要素に関連付けられている場合
- スクロールを実行する(要素の scrolling box を position に、要素を関連付け要素として、behavior をスクロール動作として)。
- scrolling box が viewport に関連付けられている場合
-
-
root element を document の root 要素(存在しなければ null)とする。
-
viewport のスクロールを実行する(viewport を position に、root element を関連付け要素として、behavior をスクロール動作として)。
-
-
container が null でなく、かつ scrolling box が shadow-including inclusive ancestor である場合、 または scrolling box が viewport であり、その document が shadow-including inclusive ancestor の container の場合は、 これ以降の手順を終了する。
-
要素をスクロールする(または 疑似要素)element を x,y に(省略時は
"auto
" のスクロール動作 behavior で)移動するには、次の通り:
-
box を element に関連付けられた スクロールボックスとする。
-
position を box が持つスクロール位置(スクロール領域の x 座標 x を box の左端に、スクロール領域の y 座標 y を box の上端に揃える)とする。
-
position が box の現在のスクロール位置と同じであり、かつ box に スムーズスクロール が進行中でない場合は、これらの手順を終了する。
-
スクロールを実行する(box を position に、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
属性は、以下の手順を実行した結果を返さなければならない:
-
以下のいずれかに該当する場合、null を返し、このアルゴリズムを終了する:
-
ancestor を要素の containing block(フラットツリー内)とし、以下のサブステップを繰り返す:
-
ancestor が 初期 containing block の場合、要素の文書の
scrollingElement
を返す。ただし、要素から であれば null を返す。 -
ancestor が要素から スクロールコンテナ である場合、このアルゴリズムを終了し ancestor を返す。
でなく、かつ -
ancestor の position プロパティの算出値が fixed であり、いずれの祖先も fixed 位置の containing block を確立しない場合、このアルゴリズムを終了し null を返す。
-
ancestor を containing block(フラットツリー内)の ancestor とする。
-
offsetParent
属性は、以下の手順を実行した結果を返さなければならない:
-
以下のいずれかに該当する場合、null を返し、このアルゴリズムを終了する:
-
ancestor を要素の フラットツリー内の親要素とし、以下のサブステップを繰り返す:
-
ancestor が要素から position プロパティの算出値が fixed で、いずれの祖先も fixed 位置の containing block を確立しない場合、このアルゴリズムを終了し null を返す。
であり、ancestor の -
ancestor が要素から
でなく、かつ以下のいずれかを満たす場合、このアルゴリズムを終了し ancestor を返す。-
要素が fixed 位置の containing block 内にあり、ancestor が fixed 位置の子孫の containing block である。
-
要素が fixed 位置の containing block 内にない場合、以下のいずれか:
-
要素の effective zoom が ancestor と異なる。
-
-
ancestor に フラットツリー内の親要素がもうない場合、このアルゴリズムを終了し null を返す。
-
ancestor を フラットツリー内の ancestor の親要素とする。
-
テスト
offsetTop
属性は、以下の手順を実行した結果を返さなければならない:
-
要素の
offsetParent
が null の場合、要素に関連付けられた最初の border edge の y 座標(初期 containing block の原点に対する値、要素および祖先に適用される transforms を無視)を返し、このアルゴリズムを終了する。 -
要素に関連付けられた最初の border edge の y 座標から、
offsetParent
に関連付けられた最初の padding edge の y 座標を減算した unscaled な値を返す(初期 containing block の原点に対する値、要素および祖先に適用される transforms を無視)。注記: 複数の line box からなるインライン要素の場合、最初の box のみが考慮される。
テスト
- offsetTop-offsetLeft-nested-offsetParents.html (ライブテスト) (ソース)
- offsetTop-offsetLeft-with-zoom.html (ライブテスト) (ソース)
- offsetTopLeft-border-box.html (ライブテスト) (ソース)
- offsetTopLeft-empty-inline-offset.html (ライブテスト) (ソース)
- offsetTopLeft-empty-inline.html (ライブテスト) (ソース)
- offsetTopLeft-inline.html (ライブテスト) (ソース)
- offsetTopLeft-leading-space-inline.html (ライブテスト) (ソース)
- offsetTopLeft-table-caption.html (ライブテスト) (ソース)
- offsetTopLeft-trailing-space-inline.html (ライブテスト) (ソース)
- offsetTopLeftInScrollableParent.html (ライブテスト) (ソース)
- table-offset-props.html (live test) (ソース)
offsetLeft
属性は、次の手順を実行した結果を返さなければならない:
-
要素の
offsetParent
が null の場合、要素に関連付けられた最初の border edge の x 座標(初期 containing block の原点に対する値、要素および祖先に適用される transforms を無視)を返し、このアルゴリズムを終了する。 -
要素に関連付けられた最初の border edge の x 座標から、
offsetParent
に関連付けられた最初の padding edge の x 座標を減算した unscaled な値を返す(初期 containing block の原点に対する値、要素および祖先に適用される transforms を無視)。
offsetWidth
属性は、次の手順を実行した結果を返さなければならない:
-
要素に関連付けられた box がなければ、0 を返してこのアルゴリズムを終了する。
-
要素の principal box によって生成されたすべてのフラグメントの border box の軸揃えバウンディングボックスの unscaled な幅を返す。要素および祖先に適用される transforms は無視する。
要素の principal box が inline-level box であり、block-level の子孫によって「分割」された場合、 block-level 子孫によって生成されたフラグメントも(幅または高さがゼロでない限り)含める。
offsetHeight
属性は、次の手順を実行した結果を返さなければならない:
-
要素に関連付けられた box がなければ、0 を返してこのアルゴリズムを終了する。
-
要素の principal box によって生成されたすべてのフラグメントの border box の軸揃えバウンディングボックスの unscaled な高さを返す。要素および祖先に適用される transforms は無視する。
要素の principal box が inline-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
オブジェクトのリストを含む)を返す:
-
範囲で選択された各要素で、その親が範囲で選択されていない場合は、要素に対して
getClientRects()
を呼び出して返される border 領域を含める。 -
範囲で選択または部分選択された
Text
ノード(境界点が同じ場合も含む)については、選択された部分(行ボックス全体ではなく)のための scaledDOMRect
オブジェクトを含める。これらのDOMRect
オブジェクトの境界はフォントメトリクスを用いて算出される。つまり、水平書字の場合、各ボックスの垂直寸法はフォントのアセント・ディセントで、水平寸法はテキストの進行幅による。範囲が部分的な typographic character unit(例:サロゲートペアの半分やグラフクラスタの一部)を含む場合、対象となる typographic character unit 全体を境界算出に含めなければならない。[CSS-TEXT-3] 先祖に適用される transforms は適用される。
注記: DOMRect
オブジェクトは getClientRects()
で返された場合、ライブではない。
テスト
getBoundingClientRect()
メソッドは、呼び出された場合、次のアルゴリズムの結果を返さなければならない:
-
list を、同じ範囲に対して
getClientRects()
を呼び出した結果とする。 -
list が空の場合、
DOMRect
オブジェクトを返す。そのx
、y
、width
、height
メンバーは全てゼロとする。 -
list 内のすべての矩形が幅または高さがゼロの場合、list の最初の矩形を返す。
-
それ以外の場合、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 = 0.0;
screenX double = 0.0;
screenY double = 0.0;
clientX double = 0.0; };
clientY
screenX
属性は、イベントが発生した位置の x 座標(Web-exposed screen area
の原点に対する値)を返さなければならない。
screenY
属性は、イベントが発生した位置の y 座標(Web-exposed screen area
の原点に対する値)を返さなければならない。
pageX
属性は、次の手順に従う:
-
イベントの dispatch flag が設定されている場合、イベント発生位置の水平方向座標(初期 containing block の原点に対する値)を返し、これらの手順を終了する。
-
offset をイベントの関連付けられた
scrollX
属性の値(Window
オブジェクトがあればその値、なければ 0)とする。 -
offset とイベントの
clientX
属性の値の合計を返す。
pageY
属性は、次の手順に従う:
-
イベントの dispatch flag が設定されている場合、イベント発生位置の垂直方向座標(初期 containing block の原点に対する値)を返し、これらの手順を終了する。
-
offset をイベントの関連付けられた
scrollY
属性の値(Window
オブジェクトがあればその値、なければ 0)とする。 -
offset とイベントの
clientY
属性の値の合計を返す。
clientX
属性は、イベントが発生した位置の x 座標(viewport の原点に対する値)を返す。
clientY
属性は、イベントが発生した位置の y 座標(viewport の原点に対する値)を返す。
x
属性は、clientX
の値を返す。
y
属性は、clientY
の値を返す。
offsetX
属性は、次の手順に従う:
-
イベントの dispatch flag が設定されている場合、イベント発生位置の x 座標(ターゲットノードの padding edge の原点に対する値、要素および祖先に適用される transforms を無視)を返し、これらの手順を終了する。
-
イベントの
pageX
属性の値を返す。
offsetY
属性は、次の手順に従う:
-
イベントの dispatch flag が設定されている場合、イベント発生位置の y 座標(ターゲットノードの padding edge の原点に対する値、要素および祖先に適用される transforms を無視)を返し、これらの手順を終了する。
-
イベントの
pageY
属性の値を返す。
11. ジオメトリ
11.1.
GeometryUtils
インターフェイス
enum {
CSSBoxType ,
"margin" ,
"border" ,
"padding" };
"content" dictionary {
BoxQuadOptions CSSBoxType = "border";
box GeometryNode ; // XXX default document (i.e. viewport) };
relativeTo dictionary {
ConvertCoordinateOptions CSSBoxType = "border";
fromBox CSSBoxType = "border"; };
toBox 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 = {}); // XXX z,w turns into 0 };
options Text includes GeometryUtils ; // like RangeElement includes GeometryUtils ;CSSPseudoElement includes GeometryUtils ;Document includes GeometryUtils ;typedef (Text or Element or CSSPseudoElement or Document );
GeometryNode
getBoxQuads(options)
メソッドは、以下の手順を実行しなければならない:
-
DOM順序
p1 = 常に左上(RTLでも)
scaleが0の場合はゼロ除算となり、0x0を返す
クロスフレームは禁止、WrongDocumentErrorを投げる?
点は平坦化される(3D変換)、z=0。getClientRectと同様
インライン内のブロックテスト
疑似要素のbefore/afterは要素の子になる
ビューポートボックスはすべて同じ
convertQuadFromNode(quad, from, options)
メソッドは、以下の手順を実行しなければならない:
convertRectFromNode(rect, from, options)
メソッドは、以下の手順を実行しなければならない:
convertPointFromNode(point, from, options)
メソッドは、以下の手順を実行しなければならない:
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
属性は、以下の手順を実行しなければならない:
-
visual viewport の 関連文書 が 完全にアクティブでない場合、0 を返す。
-
それ以外の場合、visual viewport の左端が layout viewport の左端からどれだけずれているかを返す。
offsetTop
属性は、以下の手順を実行しなければならない:
-
visual viewport の 関連文書 が 完全にアクティブでない場合、0 を返す。
-
それ以外の場合、visual viewport の上端が layout viewport の上端からどれだけずれているかを返す。
pageLeft
属性は、以下の手順を実行しなければならない:
-
visual viewport の 関連文書 が 完全にアクティブでない場合、0 を返す。
-
それ以外の場合、visual viewport の左端が 初期 containing block(layout viewport の document)の左端からどれだけずれているかを返す。
pageTop
属性は、以下の手順を実行しなければならない:
-
visual viewport の 関連文書 が 完全にアクティブでない場合、0 を返す。
-
それ以外の場合、visual viewport の上端が 初期 containing block(layout viewport の document)の上端からどれだけずれているかを返す。
width
属性は、以下の手順を実行しなければならない:
-
visual viewport の 関連文書 が 完全にアクティブでない場合、0 を返す。
-
それ以外の場合、visual viewport の幅(視覚ビューポートに固定された縦方向の クラシックスクロールバー の幅を除いた値)を返す。
注記: この値はCSSピクセル単位で返されるため、ページズームやスケールファクターを上げると値の大きさは減少する。
注記: 視覚ビューポートに固定されたスクロールバーは、ズームやパンをしてもサイズや位置が変わらないものを指す。この値はCSSピクセル単位のため、スクロールバー幅を除外する際、UAはCSSピクセルで測定されるスクロールバーの大きさを考慮する必要がある。つまり、ズームイン時には除かれる量が減り、ズームアウト時には増える。
height
属性は、以下の手順を実行しなければならない:
-
visual viewport の 関連文書 が 完全にアクティブでない場合、0 を返す。
-
それ以外の場合、visual viewport の高さ(視覚ビューポートに固定された横方向の クラシックスクロールバー の高さを除いた値)を返す。
scale
属性は、以下の手順を実行しなければならない:
-
visual viewport の 関連文書 が 完全にアクティブでない場合、0 を返し、これらの手順を中断する。
-
出力デバイスがない場合、1 を返し、これらの手順を中断する。
-
それ以外の場合、visual viewport の スケールファクター を返す。
onresize
は、イベントハンドラーIDL属性であり、resize
イベント用である。
onscroll
は、イベントハンドラーIDL属性であり、scroll
イベント用である。
onscrollend
は、イベントハンドラーIDL属性であり、scrollend イベント用である。
13. イベント
13.1. ビューポートのリサイズ
この節は、HTMLで定義されている イベントループ と統合される。[HTML]
Document
doc に対して resize 手順を実行するよう求められた場合、以下の手順を実行する:
-
doc の viewport の幅または高さが前回これらの手順が実行された時点から変更された場合 (例:ユーザーがブラウザーウィンドウのサイズを変更した場合、 ページズームを変更した場合、
iframe
要素の寸法が変更された場合など)、 doc に関連付けられているWindow
オブジェクトで resize という名前のイベントを発火する。 -
doc に関連付けられている
VisualViewport
の scale、width、または height プロパティのいずれかが 前回これらの手順が実行された時点から変更された場合、VisualViewport
で resize という名前のイベントを発火する。
Tests
13.2. スクロール
このセクションは、HTML で定義されている イベントループ と統合されます。[HTML]
各 Document
には、空の 保留中スクロールイベントターゲット のリストが関連付けられています(初期値は空)。
各 Document
には、空の 保留中スクロールエンドイベントターゲット のリストが関連付けられています(初期値は空)。
ビューポートがスクロールされたとき(ユーザー操作または API により)、ユーザーエージェントは以下の手順を実行しなければなりません:
-
doc が スナップコンテナ の場合、 doc の eventual snap target(ブロック軸を newBlockTarget、インライン軸を newInlineTarget)で scrollsnapchanging ターゲットの更新手順を実行する。
-
doc がすでに自身の 保留中スクロールイベントターゲット に含まれていたら、これらの手順を中止する。
-
doc を自身の 保留中スクロールイベントターゲット に追加する。
要素がスクロールされたとき(ユーザー操作または API により)、ユーザーエージェントは以下の手順を実行しなければなりません:
-
doc を要素の ノード文書 とします。
-
要素が スナップコンテナ の場合、 要素の eventual snap target(ブロック軸を newBlockTarget、インライン軸を newInlineTarget)で scrollsnapchanging ターゲットの更新手順を実行する。
-
要素がすでに doc の 保留中スクロールイベントターゲット に含まれていたら、これらの手順を中止する。
-
要素を doc の 保留中スクロールイベントターゲット に追加する。
VisualViewport がスクロールされたとき(ユーザー操作または API により)、ユーザーエージェントは以下の手順を実行しなければなりません:
-
vv をスクロールされた
VisualViewport
オブジェクトとします。 -
doc を vv の 関連付けられている文書 とします。
-
vv がすでに doc の 保留中スクロールイベントターゲット に含まれていたら、これらの手順を中止する。
-
vv を doc の 保留中スクロールイベントターゲット に追加する。
スクロール手順を実行するために Document
doc に対して、以下の手順を実行する:
-
保留中の scrollsnapchanging イベントの dispatch 手順 を doc に対して実行する。
-
doc の 保留中スクロールイベントターゲット の各アイテム target について、追加順に次のサブステップを実行する:
-
target が
Document
の場合、 スクロール(scroll)イベントを target でバブルさせて発火する。 -
それ以外の場合、スクロール(scroll)イベントを target で発火する。
-
-
doc の 保留中スクロールイベントターゲット を空にする。
-
保留中の scrollsnapchange イベントの dispatch 手順 を doc に対して実行する。
スクロールが 完了したとき、ユーザーエージェントは以下の手順を実行しなければなりません:
scrollend イベントはどの順序で dispatch されるか?スクロール開始順か、完了順か?
-
スクロールされた各スクロールボックス box について:
-
box が ビューポート に属する場合は、 doc を ビューポート に関連付けられる
Document
、 target を ビューポートとする。 box がVisualViewport
に属する場合は、 doc をVisualViewport
の 関連付けられている文書、 target をVisualViewport
とする。 それ以外の場合、box は要素に属するので doc を要素の ノード文書、target をその要素とする。 -
box が スナップコンテナ snapcontainer に属する場合は、 snapcontainer に対して scrollsnapchange ターゲットの更新手順を実行する。
-
target が doc の 保留中スクロールエンドイベントターゲット にすでに含まれていたら、これらの手順を中止する。
-
target を doc の 保留中スクロールエンドイベントターゲット に追加する。
-
-
doc に対して 保留中 scrollsnapchange ターゲットの dispatch 手順 を実行する。
-
doc の 保留中スクロールエンドイベントターゲット の各アイテム target について、追加順に次のサブステップを実行する:
-
target が
Document
の場合、 scrollend(スクロールエンド)イベントを target でバブルさせて発火する。 -
それ以外の場合、scrollend(スクロールエンド)イベントを target で発火する。
-
-
doc の 保留中スクロールエンドイベントターゲット を空にする。
13.3. イベントサマリー
このセクションは規範的ではありません。
イベント | インターフェイス | 主なターゲット | 説明 |
---|---|---|---|
resize
| Event
| Window ,
VisualViewport
| Window
で viewport がリサイズされたときに発火します。VisualViewport
で visual
viewport がリサイズされたとき、
または layout
viewport がスケールされたときに発火します。
|
scroll
| Event
| VisualViewport ,
Document ,
要素
| VisualViewport ,
Document
または要素が、それぞれ VisualViewport ,
viewport、要素がスクロールされたときに発火します。
|
scrollend
| Event
| Document ,
要素, VisualViewport
| VisualViewport ,
Document 、
または要素でスクロールが完了したときに発火します。つまり VisualViewport 、
viewport または要素がスクロールされ、
スクロールのシーケンスが終了し、スクロールオフセットの変更が適用されたタイミングです。
|
14. レイアウト後の状態スナップショット
一部の CSS 機能は、スクロール位置などのレイアウト後の状態を次のスタイルやレイアウトの更新の入力として利用します。
レイアウト後の状態スナップショット手順を実行するために Document
doc に対して、以下の手順を実行する:
-
レイアウト後の状態をスナップショットする必要がある各 CSS 機能について、doc の関連する状態のスナップショットを取得する。
スナップショットされる状態は他の仕様で定義されています。これらの手順は doc や他の Document
に対して、他のレイアウト後スナップショット手順がスナップショットが行われたことを検知できるような無効化をしてはなりません。つまり、スナップショットの順序は問題になりません。
15. プライバシーに関する考慮事項
Screen
インターフェイスはユーザーのディスプレイ構成情報を公開します。これはフィンガープリントアルゴリズムへの入力として使われる可能性があります。ユーザーエージェントは、ユーザーのプライバシーを保護するために、画面サイズや構成の情報を隠したり量子化したりすることを選択できます。
MouseEvent
は、イベントのスクリーン相対座標の情報を含みます。ユーザーエージェントは、ユーザーのプライバシー保護のために、これらのプロパティに実際のスクリーン位置を隠す値を設定することがあります。
16. セキュリティに関する考慮事項
この仕様に関して新たなセキュリティ上の考慮事項は報告されていません。
17. 変更履歴
このセクションでは本仕様の版間の主な変更点を記載します。網羅的な内容ではありません。バグ修正や編集上の変更は通常記載されません。
2016年3月17日作業草案 からの変更点
-
Simon Fraser と Emilio Cobos Álvarez を現編集者に追加し、Simon Pieters を前編集者へ移動しました。
-
getClientRects()
で 組版文字単位の扱いを明確化しました。 -
getBoundingClientRect()
(Element
用)およびgetBoundingClientRect()
(Range
用)が空矩形をどう扱うか変更しました。 -
Shadow DOM に対する
offsetParent
の定義を変更しました。 -
プライバシー保護のため
Screen
のプロパティについてUAが偽装できることを認めました。 -
colorDepth
とpixelDepth
が実値を返すよう変更しました。 -
「CSSピクセル」を [CSS-VALUES] に準拠させました。
-
ScrollIntoViewOptions
のデフォルト値をstart
とnearest
に変更し、scrollIntoView()
の挙動も微調整しました。 -
screenLeft
とscreenTop
をscreenX
およびscreenY
のエイリアスとして追加しました。 -
オーバーフロー方向の定義を block-end および inline-end に基づいて行うよう変更しました。
-
resizeTo()
の引数名を width と height に変更しました。 -
スクリプトによる scroll-snap を scroll-behavior の影響を受けるスクロールの一覧に追加しました。
-
用語セクションの論理的な誤りを修正しました。
-
「セキュリティに関する考慮事項」と「プライバシーに関する考慮事項」セクションを追加しました。
-
scroll-behavior プロパティを [CSS-OVERFLOW-3] に移動しました。
-
offsetWidth
とoffsetHeight
のアルゴリズムを調整しました。 -
checkVisibility()
メソッドをElement
に追加しました。 -
scrollend イベントを WICG overscroll-scrollend-events から [CSSOM-VIEW-1] に移動し、ハンドリングの詳細を追加しました。
-
getBoundingClientRect()
に「バウンディングボックス取得」アルゴリズムを追加しました。 -
VisualViewport
API と関連概念を導入しました。 -
scroll into view のアルゴリズムを
Range
にも対応させました。 -
各 API が zoom プロパティに関連して、スケール値か非スケール値かを明確化しました。
-
各種スクロールAPIでスクロールスナップとスクロールターゲットを考慮するようにしました。
-
currentCSSZoom
属性をElement
に追加しました。 -
caretPositionFromPoint()
メソッドに options パラメータを追加しました。 -
CaretPosition インターフェイスからキャレット範囲の概念を削除しました。
-
レイアウト後スナップショットを定義しました。
-
各種スクロールアルゴリズムで疑似要素も受け付けるようにしました。
-
container オプションを
ScrollIntoViewOptions
に追加しました。 -
scrollParent
属性を追加しました。 -
ピンチズームを scale factor に名称変更しました。
2013年12月17日作業草案 からの変更点
-
scrollIntoView()
メソッドがElement
で変更・拡張されました。 -
scrollTop
およびscrollLeft
属性がオブジェクトを受け取らなくなりました。代わりにscroll()
、scrollTo()
、scrollBy()
メソッドが追加されました。 -
scrollWidth
、scrollHeight
、clientTop
、clientLeft
、clientWidth
、clientHeight
属性がElement
で再び整数値を返すようになりました。 -
DOMRectList
インターフェイスが削除されました。 -
scrollingElement
属性がDocument
に追加されました。 -
Window
の一部 readonly 属性に[Replaceable]
IDL 拡張属性が付与されました。 -
MediaQueryList
、 scroll イベント、 resize イベントが HTML の イベントループ と統合され、アニメーションフレームと同期されるようになりました。 -
scroll-behavior の
instant
値が auto に名称変更されました。 -
scrollLeft
の原点(RTL対応)が変更されました。 -
scrollIntoView()
(Element
)やscroll()
、scrollTo()
、scrollBy()
メソッド(Window
用)が関連辞書を第1引数として受け取るようになりました。 -
MediaQueryList
インターフェイスが通常のイベントAPIを使用し、addListener()
の定義がそれに基づくものへ変更されました。 -
「変更履歴」セクションを追加しました。
-
Glenn Adams を前編集者へ移動しました。
2011年8月4日作業草案以降の変更点 (英語原文)
-
Simon Pieters と Glenn Adams を編集者として追加し、Anne van Kesteren を前編集者に移動しました。
-
scroll-behavior CSSプロパティを導入しました。
-
ブロックフロー方向 と インライン基底方向([CSS-WRITING-MODES-3])を用語集に追加しました。
-
ズームに関するセクションを追加しました。
-
moveTo()
、moveBy()
、resizeTo()
、resizeBy()
をWindow
インターフェイスに追加しました。 -
devicePixelRatio
属性をWindow
インターフェイスに追加しました。 -
ScrollOptions
辞書を導入し、スクロールメソッドに options パラメータを追加しました。 -
devicePixelRatio
属性をWindow
インターフェイスに追加しました。 -
open()
メソッドに features パラメータを追加しました。 -
elementsFromPoint()
メソッドをDocument
インターフェイスに追加しました。 -
getClientRect()
メソッドをCaretPosition
インターフェイスに追加しました。 -
GeometryUtils
インターフェイスの初期ドラフトを導入しました。 -
innerWidth
、innerHeight
などで double 型を使うようにしました。 -
CSS transform を正式に認識しました。
-
ClientRect
をDOMRect
に置き換えました。 -
colorDepth
とpixelDepth
が常に 24 を返すように変更しました。
2009年8月4日作業草案以降の変更点 (英語原文)
-
他仕様の用語定義の重複を削除し、単位(CSSピクセルなど)や内容/文書内容の区別を明示的に定義しました。
-
MediaQueryList
インターフェイスを導入しました。 -
Media
のmatchMedium()
メソッドをWindow
インターフェイスに移動し、matchMedia()
に名称変更、戻り値型をMediaQueryList
に変更しました。 -
AbstractView
とMedia
インターフェイスを削除しました。 -
DocumentView
インターフェイスを削除し、elementFromPoint()
メソッドとcaretRangeFromPoint()
メソッドをDocument
インターフェイスへ移動しました。 -
caretRangeFromPoint()
メソッドの名称をcaretPositionFromPoint()
に変更しました。 -
CaretPosition
インターフェイスを導入し、caretPositionFromPoint()
の戻り値型を CaretPosition に変更しました。 -
scrollIntoView()
メソッドをElement
インターフェイスに追加しました。
2008年2月22日作業草案以降の変更点 (英語原文)
-
WindowView
インターフェイスを削除し、その属性とメソッドをAbstractView
と継承するScreenView
インターフェイスに移動しました。 -
AbstractView
にdocument
IDL属性を追加しました。 -
scroll()
、scrollTo()
、scrollBy()
メソッドをScreenView
インターフェイスに追加しました。 -
ElementView
インターフェイスを削除し、その属性とメソッドをElement
およびHTMLElement
インターフェイスに移動しました。 -
defaultView
IDL属性とcaretRangeFromPoint()
メソッドをDocumentView
インターフェイスに追加しました。 -
RangeView
インターフェイスを削除し、代わりにRange
インターフェイスを直接拡張しました。 -
MouseEventView
インターフェイスを削除し、代わりにMouseEvent
インターフェイスを直接拡張しました。 -
TextRectangleList
インターフェイスをClientRectList
に名称変更し、item()
メソッドをインデックスゲッターにしました。 -
TextRectangle
インターフェイスをClientRect
に名称変更し、width
およびheight
属性を追加しました。
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ブラウザーで広く展開されたことに感謝します。