ResizeObserver

ResizeObserver インターフェイスは、要素 (Element) のコンテンツまたは境界ボックス、または SVGElement のバウンディングボックスの大きさが変化したことを報告します。

メモ: コンテンツボックスは、コンテンツを配置できるボックスです。つまり、境界ボックスからパディングを引いたものです。境界とパディングの説明はボックスモデルを参照してください。

ResizeObserver は、無限のコールバックループとそれ自身のコールバック関数でサイズ変更することによって生じるであろう循環的な依存関係を避けます。これは、後続のフレームで DOM のより深い要素のみを処理することによって行われます。仕様に従っている場合、実装は描画の前およびレイアウトの後にリサイズイベントを呼び出します。

コンストラクター

ResizeObserver()

新しい ResizeObserver オブジェクトを作成して返します。

プロパティ

なし。

メソッド

ResizeObserver.disconnect()

特定のオブザーバーの監視対象の Element をすべて監視解除します。

ResizeObserver.observe()

指定された Element の監視を開始します。

ResizeObserver.unobserve()

指定された Element の監視を終了します。

resize-observer-text.htmlソースを参照)の例では、スライダーの値が変更され、それを含む <div> の幅が変更されると、リサイズオブザーバーを使用してヘッダーと段落の font-size を変更します。これは、ビューポートに影響がない要素のサイズの変化にも応答することができることを示しています。

また、オブザーバーをオフやオンにするためのチェックボックスも用意しています。オフにすると、 <div> の幅が変化してもテキストは変化しません。

JavaScript は次のようになります。

const h1Elem = document.querySelector('h1');
const pElem = document.querySelector('p');
const divElem = document.querySelector('body > div');
const slider = document.querySelector('input[type="range"]');
const checkbox = document.querySelector('input[type="checkbox"]');

divElem.style.width = '600px';

slider.addEventListener('input', () => {
  divElem.style.width = slider.value + 'px';
})

const resizeObserver = new ResizeObserver(entries => {
  for (let entry of entries) {
    if(entry.contentBoxSize) {
      // Firefox は `contentBoxSize` を配列ではなく、単一のコンテンツ矩形として実装しています。
      const contentBoxSize = Array.isArray(entry.contentBoxSize) ? entry.contentBoxSize[0] : entry.contentBoxSize;

      h1Elem.style.fontSize = Math.max(1.5, contentBoxSize.inlineSize / 200) + 'rem';
      pElem.style.fontSize = Math.max(1, contentBoxSize.inlineSize / 600) + 'rem';
    } else {
      h1Elem.style.fontSize = Math.max(1.5, entry.contentRect.width / 200) + 'rem';
      pElem.style.fontSize = Math.max(1, entry.contentRect.width / 600) + 'rem';
    }
  }

  console.log('Size changed');
});

resizeObserver.observe(divElem);

checkbox.addEventListener('change', () => {
  if (checkbox.checked) {
    resizeObserver.observe(divElem);
  } else {
    resizeObserver.unobserve(divElem);
  }
});

仕様書

Specification
Resize Observer
# resize-observer-interface

ブラウザーの互換性

BCD tables only load in the browser

関連情報