リサイズオブザーバー

W3C 初公開ワーキングドラフト,

このバージョン:
https://www.w3.org/TR/2020/WD-resize-observer-1-20200211/
最新公開バージョン:
https://www.w3.org/TR/resize-observer-1/
編集者ドラフト:
https://drafts.csswg.org/resize-observer/
編集者:
(Google)
(Microsoft)
この仕様への編集提案:
GitHub 編集者
課題管理:
GitHub 課題

概要

本仕様は、Elementのサイズ変更を監視するためのAPIについて説明します。

CSSは、構造化文書(HTMLやXMLなど)の画面、紙などへのレンダリングを記述する言語です。

この文書のステータス

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

本書は初公開ワーキングドラフトです。

初公開ワーキングドラフトとして公開されたことは、W3C会員による承認を意味するものではありません。本書はドラフト文書であり、随時更新、置換、廃止される可能性があります。進行中の作業以外のものとして本書を引用することは不適切です。

本仕様の議論にはGitHub Issuesが推奨されています。課題を提出する際はタイトルに「resize-observer」と記載してください。例:「[resize-observer] …コメント要約…」。すべての課題やコメントはアーカイブされており、過去のアーカイブも存在します。

本書はCSS作業グループによって作成されました。

本書はW3C特許ポリシーに基づいて運営されるグループによって作成されました。W3Cは、グループの成果物に関連してなされた特許開示の公開リストを管理しています。そのページには特許開示の方法も記載されています。特許の存在を事実として知っている個人は、その特許が必須クレームを含むと考える場合、W3C特許ポリシー第6節に従って情報を開示しなければなりません。

本書は2019年3月1日改訂W3Cプロセス文書に準拠しています。

1. はじめに

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

レスポンシブWebコンポーネントは、Elementのサイズ変更に応答する必要があります。例として、地図を表示するElementがあります。

レスポンシブWebアプリケーションは、ビューポートのサイズ変更にすでに対応できます。 これはCSSメディアクエリやwindow.resizeイベントで実現します。

ResizeObserver APIは、Elementのサイズ変更を監視するためのインターフェイスです。これはwindow.resizeイベントのElement版です。

ResizeObserverの通知は、Elementのサイズ変更に対応するために利用できます。これらの観測に関する興味深い事実:

<canvas id="elipse" style="display:block"></canvas>
<div id="menu" style="display:block;width:100px">
    <img src="hamburger.jpg" style="width:24px;height:24px">
    <p class="title">メニュータイトル</p>
</div>
// リサイズ時、elipseはキャンバス内に楕円を描画する
document.querySelector('#elipse').handleResize = entry => {
    entry.target.width = entry.borderBoxSize[0].inlineSize;
    entry.target.height = entry.borderBoxSize[0].blockSize;
    let rx = Math.floor(entry.target.width / 2);
    let ry = Math.floor(entry.target.height / 2);
    let ctx = entry.target.getContext('2d');
    ctx.beginPath();
    ctx.ellipse(rx, ry, rx, ry, 0, 0, 2 * Math.PI);
    ctx.stroke();
}
// リサイズ時、幅によってタイトルの表示・非表示を切り替える
document.querySelector('#menu').handleResize = entry => {
    let title = entry.target.querySelector(".title")
    if (entry.borderBoxSize[0].inlineSize < 40)
        title.style.display = "none";
    else
        title.style.display = "inline-block";
}

var ro = new ResizeObserver( entries => {
  for (let entry of entries) {
    let cs = window.getComputedStyle(entry.target);
    console.log('監視中の要素:', entry.target);
    console.log(entry.contentRect.top,' は ', cs.paddingTop);
    console.log(entry.contentRect.left,' は ', cs.paddingLeft);
    console.log(entry.borderBoxSize[0].inlineSize,' は ', cs.width);
    console.log(entry.borderBoxSize[0].blockSize,' は ', cs.height);
    if (entry.target.handleResize)
        entry.target.handleResize(entry);
  }
});
ro.observe(document.querySelector('#elipse'));
ro.observe(document.querySelector('#menu'));

2. Resize Observer API

2.1. ResizeObserverインターフェイス

ResizeObserverインターフェイスは、Elementのサイズ変更を監視するために使われます。

これはMutationObserverIntersectionObserverを参考に設計されています。

enum ResizeObserverBoxOptions {
    "border-box", "content-box", "device-pixel-content-box"
};

ResizeObserverは、さまざまなCSSサイズを監視できます:

device-pixel-content-box は、devicePixelRatiocontent-box のサイズに掛けて概算できます。 ただし、ブラウザ固有のサブピクセルスナップ挙動のため、 著者はこのスケールされたcontent-box サイズをどのように丸めるべきか判別できません。 UAが要素のデバイスピクセルボックスを算出する方法は実装依存です。 一例として、ボックスサイズと位置にデバイスピクセル比を掛け、その結果の浮動小数点のサイズと位置を整数値に丸め、描画品質を最大化する方法が考えられます。

このサイズはターゲットの位置変更の影響を受けるため、他のサイズより監視コストが高くなる傾向があります。

dictionary ResizeObserverOptions {
    ResizeObserverBoxOptions box = "content-box";
};

このセクションは規範的ではありません。著者は複数のCSSボックスを監視したい場合があります。 この場合、複数のResizeObserverを使う必要があります。

// content-boxを監視
ro.observe(document.querySelector('#menu'), { box: 'content-box' });

// border-boxのみを監視。前回の監視は置き換えられる。
ro1.observe(document.querySelector('#menu'), { box: 'border-box' });

これはイベント発火時に定義されたコールバックに返されるボックス寸法の種類には影響しません。著者がレイアウト変更を監視したいボックス種別を定義するだけです。

[Exposed=(Window),
 Constructor(ResizeObserverCallback callback)]
interface ResizeObserver {
    void observe(Element target, optional ResizeObserverOptions options);
    void unobserve(Element target);
    void disconnect();
};
new ResizeObserver(callback)
  1. thisを新しいResizeObserverオブジェクトとする。

  2. this.callback内部スロットにcallbackをセットする。

  3. this.observationTargets内部スロットに空リストをセットする。

  4. Document.resizeObserversスロットにthisを追加する。

observe(target, options)

targetを監視対象要素リストに追加します。

  1. targetobservationTargetsスロットに存在する場合、unobserve(target)を呼び出す。

  2. resizeObservationを新しいResizeObservation(target, options)とする。

  3. resizeObservationobservationTargetsスロットに追加する。

unobserve(target)

targetを監視対象要素リストから削除します。

  1. observationResizeObservationで、observationTargets内のtargetスロットがtargetなものとする。

  2. observationが見つからなければ戻る。

  3. observationTargetsからobservationを削除する。

disconnect()
  1. observationTargetsリストをクリアする。

  2. activeTargetsリストをクリアする。

2.2. ResizeObserverCallback

callback ResizeObserverCallback = void (sequence<ResizeObserverEntry> entries, ResizeObserver observer);

このコールバックはResizeObserverの通知を配信します。アクティブな観測の通知アルゴリズムによって呼び出されます。

2.3. ResizeObserverEntry

[Exposed=Window]
interface ResizeObserverEntry {
    readonly attribute Element target;
    readonly attribute DOMRectReadOnly contentRect;
    readonly attribute sequence<ResizeObserverSize> borderBoxSize;
    readonly attribute sequence<ResizeObserverSize> contentBoxSize;
    readonly attribute sequence<ResizeObserverSize> devicePixelContentBoxSize;
};

contentRectはResizeObserverのインキュベーション段階からのものであり、現行のウェブ互換性のためだけに含まれています。将来のレベルでは非推奨になる可能性があります。

target, Element, 読み取り専用

サイズが変更されたElementです。

contentRect, DOMRectReadOnly, 読み取り専用

Elementcontent rectであり、 ResizeObserverCallbackが呼び出された時点の値です。

borderBoxSize, 型 sequence<ResizeObserverSize>, 読み取り専用

シーケンスであり、Elementborder boxサイズがResizeObserverCallback呼び出し時に格納されます。

contentBoxSize, 型 sequence<ResizeObserverSize>, 読み取り専用

シーケンスであり、Elementcontent rectサイズが ResizeObserverCallback呼び出し時に格納されます。

devicePixelContentBoxSize, 型 sequence<ResizeObserverSize>, 読み取り専用

シーケンスであり、Elementcontent rectサイズ(デバイスピクセル単位の整数値)が ResizeObserverCallback呼び出し時に格納されます。

ボックスサイズプロパティは、複数のフラグメントを持つ要素(マルチカラムなど)への対応のためシーケンスとして公開されています。 しかし、現行仕様で定義されるcontent rectborder boxは、マルチカラムレイアウト時の挙動を記載していません。 本仕様ではシーケンスの中に1つだけResizeObserverSizeが返され、それは最初のカラムの寸法に対応します。 将来のバージョンでは、フラグメントごとのサイズ情報をシーケンスとして返す予定です。

interface ResizeObserverSize {
    readonly attribute unrestricted double inlineSize;
    readonly attribute unrestricted double blockSize;
};

3. 処理モデル

3.1. ResizeObservation例構造体

このセクションは規範的ではありません。ResizeObservationはResize Observerの実装例構造体です。 本仕様の処理モデルの理解を助けるために記載されています。実質的に1つのElementの観測情報を保持します。 このインターフェイスはJavascriptからは参照できません。

[Constructor(Element target)
]
interface ResizeObservation {
    readonly attribute Element target;
    readonly attribute ResizeObserverBoxOptions observedBox;
    readonly attribute sequence<ResizeObserverSize> lastReportedSizes;
};
target, Element, 読み取り専用

観測対象のElementです。

observedBox, ResizeObserverBoxOptions, 読み取り専用

どのボックスが監視されているか。

lastReportedSizes, 型 sequence<ResizeObserverSize>, 読み取り専用

最後に報告されたサイズの順序付きシーケンス。

new ResizeObservation(target, observedBox)
  1. thisを新しいResizeObservationオブジェクトとする

  2. this内部のtargetスロットにtargetをセットする

  3. this内部のobservedBoxスロットにobservedBoxをセットする

  4. this内部のlastReportedSizesスロットに[(0,0)]をセットする

isActive()
  1. currentSizetargetobservedBoxを使ってボックスサイズを計算で設定する。

  2. currentSizeがthis.lastReportedSizesの最初のエントリと異なる場合、trueを返す。

  3. falseを返す。

3.2. 内部スロット定義

3.2.1. Document

Documentは、resizeObserversスロットを持ちます。これはこのドキュメント内のResizeObserverのリストです。初期値は空です。

3.2.2. ResizeObserver

ResizeObserver は、コンストラクターで初期化されるcallbackスロットを持ちます。

ResizeObserver は、observationTargetsスロットを持ちます。これはResizeObservationのリストであり、監視中の全てのElementを表します。

ResizeObserver は、activeTargetsスロットを持ちます。これはResizeObservationのリストであり、直前の観測通知以降にサイズが変更され、通知対象となるElementを表します。

ResizeObserver は、skippedTargetsスロットを持ちます。これはResizeObservationのリストであり、直前の観測通知以降にサイズが変更されたが通知対象とならないElementを表します。

3.3. CSS定義

3.3.1. content rect

DOM content rectは次の値を持つrectです:

content width仕様はマルチカラムレイアウトが内容ボックスにどう影響するか記載していません。本仕様では、Elementマルチカラム内にある場合のcontent widthはgetComputedStyle(element).widthの結果です。現状では最初のカラムの幅になります。

content rectの位置をpadding-top/leftにすることで、ターゲットの子要素の絶対配置が便利になります。絶対座標空間の原点はパディング矩形の左上です。

content rectを監視する場合:

ウェブコンテンツにはSVG要素も含まれます。SVG要素はcontent boxの代わりにbounding boxを定義します。 SVGGraphicsElementのcontent rectは次の値を持つrectです:

3.4. アルゴリズム

3.4.1. 指定された深さでアクティブな観測を収集

これはdocumentの全てのアクティブな観測を計算します。指定した深さでアクティブな観測を収集するには、次の手順を実行します:

  1. depthを指定された深さとする。

  2. resizeObservers内の各observerについて、次の手順を実行:

    1. observeractiveTargetsskippedTargetsをクリアする。

    2. observer.observationTargets内の各observationについて、次の手順を実行:

      1. observation.isActive()がtrueの場合

        1. observation.targetについて、ノードの深さを計算の結果をtargetDepthとする。

        2. targetDepthdepthより大きければ、activeTargetsobservationを追加する。

        3. それ以外の場合はskippedTargetsobservationを追加する。

3.4.2. アクティブな観測があるか

Documentアクティブな観測があるかを判定するには、次の手順を実行します:

  1. resizeObservers内の各observerについて、次の手順を実行:

    1. observer.activeTargetsが空でなければtrueを返す。

  2. falseを返す。

3.4.3. スキップされた観測があるか

Documentスキップされた観測があるかを判定するには、次の手順を実行します:

  1. resizeObservers内の各observerについて、次の手順を実行:

    1. observer.skippedTargetsが空でなければtrueを返す。

  2. falseを返す。

3.4.4. ResizeObserverEntryの作成と設定

ResizeObserverEntryの作成と設定を、与えられたtargetに対して行うには、次の手順を実行します:
  1. thisを新しいResizeObserverEntryとする。

  2. thistargetスロットにtargetを設定する。

  3. thisborderBoxSizeスロットに、targetと"border-box"のobservedBoxでサイズを計算した結果を設定する。

  4. thiscontentBoxSizeスロットに、targetと"content-box"のobservedBoxでサイズを計算した結果を設定する。

  5. thisdevicePixelContentBoxSizeスロットに、targetと"device-pixel-content-box"のobservedBoxでサイズを計算した結果を設定する。

  6. thiscontentRectに、targetと"content-box"のobservedBoxでthis.contentBoxSizeを設定する。

  7. targetがSVG要素でない場合、次の手順を実行:

    1. this.contentRect.topにtargetpadding topを設定する。

    2. this.contentRect.leftにtargetpadding leftを設定する。

  8. targetがSVG要素の場合、次の手順を実行:

    1. this.contentRect.topおよびthis.contentRect.leftに0を設定する。

3.4.5. アクティブな観測の通知

アクティブな観測の通知は、ドキュメント内のすべてのアクティブな観測を配信し、通知対象の最も浅い深さを返します。

ドキュメントのアクティブな観測を通知するには、次の手順を実行します:

  1. shallowestTargetDepthを∞とする。

  2. document.resizeObservers内の各observerについて、次の手順を実行:

    1. observeractiveTargetsスロットが空の場合は続ける。

    2. entriesを空のResizeObserverEntryリストとする。

    3. activeTargets内の各observationについて、次の手順を実行:

      1. entryを、observation.targetを与えてResizeObserverEntryの作成と設定を実行した結果とする。

      2. entryentriesに追加する。

      3. observationlastReportedSizesに一致するentryのサイズを設定する。

        1. 一致するサイズは、observation.observedBoxが"border-box"ならentry.borderBoxSize

        2. 一致するサイズは、observation.observedBoxが"content-box"ならentry.contentBoxSize

        3. 一致するサイズは、observation.observedBoxが"device-pixel-content-box"ならentry.devicePixelContentBoxSize

      4. observation.targetについてノードの深さを計算の結果をtargetDepthとする。

      5. targetDepthshallowestTargetDepthより小さければ、shallowestTargetDepthtargetDepthに設定する。

    4. observercallbackentriesで呼び出す。

    5. observeractiveTargetsをクリアする。

  3. shallowestTargetDepthを返す。

3.4.6. Resize Loop Errorの通知

Resize Loop Error通知を行うには、次の手順を実行します:

  1. 新しいErrorEventを作成する。

  2. eventのmessageスロットに"ResizeObserver loop completed with undelivered notifications."を設定する。

  3. 例外eventを報告する。

3.4.7. ノードの深さを計算

ノードの深さを計算は、与えられたnodeに対して次の手順を実行します:

  1. pnodeからこの要素のフラット化DOMツリーのルートElementへの親トラバーサルパスとする。

  2. p内のノード数を返す。

3.4.8. targetと監視ボックスを与えてボックスサイズを計算

このアルゴリズムはtarget Elementの監視ボックスサイズを計算します。ボックスの種類はResizeObserverBoxOptionsで示されます。 SVG要素は例外です。SVGサイズは常にバウンディングボックスサイズであり、SVG要素は標準のCSSボックスモデルを使用しません。

ボックスサイズを計算は、targetobservedBoxを与えて次の手順を実行します:

  1. targetSVGGraphicsElementの場合

    1. computedSize.inlineSizeにtargetバウンディングボックスのインライン長を設定する。

    2. computedSize.blockSizeにtargetバウンディングボックスのブロック長を設定する。

  2. targetSVGGraphicsElementでない場合

    1. observedBoxが"border-box"の場合

      1. computedSize.inlineSizeにtargetのborder areaのインライン長を設定する。

      2. computedSize.blockSizeにtargetのborder areaのブロック長を設定する。

    2. observedBoxが"content-box"の場合

      1. computedSize.inlineSizeにtargetのcontent areaのインライン長を設定する。

      2. computedSize.blockSizeにtargetのcontent areaのブロック長を設定する。

    3. observedBoxが"device-pixel-content-box"の場合

      1. computedSize.inlineSizeにtargetのcontent areaのインライン長(デバイスピクセル単位の整数値)を設定する。

      2. computedSize.blockSizeにtargetのcontent areaのブロック長(デバイスピクセル単位の整数値)を設定する。

    4. computedSizeを返す。

3.5. ResizeObserverのライフタイム

ResizeObserverは、以下の2つの条件が両方とも満たされるまで存続します:

3.6. 外部仕様との統合

3.6.1. HTML処理モデル:イベントループ

ResizeObserverの処理は、HTML処理モデルのイベントループのステップ7.12内で行われます。

ステップ12は現時点では以下のように明確に規定されていません:

docs内のすべての完全にアクティブなDocumentについて、そのDocumentおよびその閲覧コンテキストのレンダリングやユーザーインターフェイスを現在の状態に合わせて更新する。

現行のステップ12は、以下のように完全に規定できます:

docs内のすべての完全にアクティブなDocumentについて、そのDocumentおよびその閲覧コンテンツに対して以下の手順を実行します:

  1. スタイル再計算

  2. レイアウト更新

  3. 描画

ResizeObserverはステップ12にリサイズ通知処理を追加します。 保留中の通知がなくなるまでループしてすべての通知を配信しようとします。これにより無限ループが発生する可能性があります。

無限ループは、各イテレーションごとに通知可能なノードの集合を縮小することで防止されます。各イテレーションでは、前回のイテレーションで最も浅かったノードより深いノードのみが通知できます。

通知ループが完了した時点で未配信の通知がある場合はエラーが生成されます。未配信の通知がある要素は次回のループで通知対象となります。

ResizeObserverの通知を含むステップ12は次の通りです:

docs内のすべての完全にアクティブなDocumentについて、そのDocumentおよびその閲覧コンテキストに対して以下の手順を実行します:

  1. スタイル再計算

  2. レイアウト更新

  3. depthを0に設定

  4. 指定した深さでアクティブな観測を収集 depthDocumentで実行

  5. documentがアクティブな観測があるかの間、繰り返す

    1. depthアクティブな観測の通知の結果を設定する。

    2. スタイル再計算

    3. レイアウト更新

    4. 指定した深さでアクティブな観測を収集 depthDocumentで実行

  6. Documentスキップされた観測があるかの場合は、Resize Loop Error通知を実行する

  7. Documentおよびその閲覧コンテキストのレンダリングやユーザーインターフェイスを現在の状態に合わせて更新する。

適合性

文書規約

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

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

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

これは情報的な例です。

情報的な注釈は「Note」で始まり、次のようにclass="note"で規範文から区別されます:

Note、これは情報的な注釈です。

アドバイスは特別な注意を促すためにスタイリングされた規範的なセクションであり、<strong class="advisement">で他の規範文から区別されます。例: UAはアクセシブルな代替手段を提供しなければなりません

適合クラス

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

スタイルシート
CSSスタイルシート
レンダラー
UAは、スタイルシートのセマンティクスを解釈し、それを使って文書をレンダリングします。
オーサリングツール
UAは、スタイルシートを作成します。

スタイルシートは、本モジュールで定義された構文を使用したすべての文が、一般的なCSS文法および本モジュールで定義された各機能の個別文法に従い有効であれば、本仕様に適合しています。

レンダラーは、スタイルシートを適切な仕様で定義された通りに解釈することに加え、本仕様で定義されたすべての機能を正しく解析し、ドキュメントを適切にレンダリングすることで本仕様に適合します。ただし、デバイスの制限によりUAがドキュメントを正しくレンダリングできない場合は、UAが非適合となるわけではありません。(例:UAはモノクロモニターで色を描画する必要はありません。)

オーサリングツールは、一般的なCSS文法および本モジュールの各機能の個別文法に従い構文的に正しいスタイルシートを書き、本モジュールで記述されたスタイルシートの他の適合要件も満たすことで本仕様に適合します。

CSSの責任ある実装の要件

次のセクションでは、現在および将来の相互運用性を促進するための責任あるCSS実装の適合要件を定めます。

部分的な実装

著者が前方互換性のあるパース規則を利用してフォールバック値を指定できるように、CSSレンダラーは 必ずサポートできるレベルを持たない at規則、プロパティ、プロパティ値、キーワード、その他の構文要素を無効として (必要に応じて無視) 扱わなければなりません。 特に、ユーザーエージェントは サポートされていないプロパティ値を選択的に無視し、マルチ値プロパティ宣言の中でサポートされている値のみを適用してはなりません: いずれかの値が無効(サポートされていない値は必ず)とみなされた場合、 CSSは宣言全体を無視することを要求します。

不安定・独自機能の実装

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

CRレベル機能の実装

仕様がCandidate Recommendation段階に到達したら、実装者は、仕様に従って正しく実装されていることを示せるCRレベル機能について、ベンダープレフィックスなしの実装をリリースし、 プレフィックス付きのバリアントを公開することは避けるべきです。

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

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

索引

本仕様で定義される用語

参照による定義用語

参考文献

規範的参考文献

[CSS-BOX-3]
Elika Etemad. CSS ボックスモデルモジュール レベル3. 2018年12月18日. ワーキングドラフト. URL: https://www.w3.org/TR/css-box-3/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM ビューモジュール. 2016年3月17日. ワーキングドラフト. 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/
[RFC2119]
S. Bradner. RFCで要件レベルを示すキーワード. 1997年3月. ベストカレントプラクティス. URL: https://tools.ietf.org/html/rfc2119
[SVG2]
Amelia Bellamy-Royds; 他. スケーラブルベクターグラフィックス (SVG) 2. 2018年10月4日. CR. URL: https://www.w3.org/TR/SVG2/
[WebIDL]
Boris Zbarsky. Web IDL. 2016年12月15日. 編集ドラフト. URL: https://heycam.github.io/webidl/

IDL索引

enum ResizeObserverBoxOptions {
    "border-box", "content-box", "device-pixel-content-box"
};

dictionary ResizeObserverOptions {
    ResizeObserverBoxOptions box = "content-box";
};

[Exposed=(Window),
 Constructor(ResizeObserverCallback callback)]
interface ResizeObserver {
    void observe(Element target, optional ResizeObserverOptions options);
    void unobserve(Element target);
    void disconnect();
};

callback ResizeObserverCallback = void (sequence<ResizeObserverEntry> entries, ResizeObserver observer);

[Exposed=Window]
interface ResizeObserverEntry {
    readonly attribute Element target;
    readonly attribute DOMRectReadOnly contentRect;
    readonly attribute sequence<ResizeObserverSize> borderBoxSize;
    readonly attribute sequence<ResizeObserverSize> contentBoxSize;
    readonly attribute sequence<ResizeObserverSize> devicePixelContentBoxSize;
};

interface ResizeObserverSize {
    readonly attribute unrestricted double inlineSize;
    readonly attribute unrestricted double blockSize;
};

[Constructor(Element target)
]
interface ResizeObservation {
    readonly attribute Element target;
    readonly attribute ResizeObserverBoxOptions observedBox;
    readonly attribute sequence<ResizeObserverSize> lastReportedSizes;
};