要素のサイズ変更を検知するResizeObserver

image.png (59.9 kB)

TOC

課題

従来では特定の要素のサイズの変更を検知したい場合、documentwindowにresize eventを登録し、ウィンドウのサイズの変更をトリガーにし、要素の変更を検知していたと思います。 しかし殆どの場合、その後特定の要素に対し、Element.getBoundingClientRectWindow.getComputedStyleといった関数を実行する必要があり、レイアウト処理が実行され、パフォーマンスが悪いといった課題がありました。 また、ブラウザのウィンドウサイズをトリガーにしている為、特定の要素のサイズ変更を検知しているわけではないので、場合によっては機能しない事がありました。

ResizeObserver

ResizeObserverは従来の課題を解決し、要素の変更をパフォーマンスを維持したまま検知することができます。

使い方

まずはResizeObserverオブジェクトを作成し、コンストラクターにコールバック関数を渡します。 コールバック関数の引数にはResizeObserverEntryが渡されます。

const resizeObserver = new ResizeObserver(entries => {
  console.log(entires)
  // => [ResizeObserverEntry]
})

ResizeObserverEntry

ResizeObserverEntryは配列で、中には変更を検知した要素の情報が格納されています。 格納されているプロパティは以下の通りです。

プロパティ 説明
borderBoxSize 監視された要素の新しい境界ボックスサイズを含むオブジェクト
contentBoxSize 監視された要素の新しいコンテンツボックスサイズを含むオブジェクト
devicePixelContentBoxSize 監視される要素の新しいコンテンツボックスサイズをデバイスピクセル単位で含むオブジェクト
contentRect 監視された要素の新しいサイズを含む DOMRectReadOnly オブジェクト
target 監視対象の Element または SVGElement
const resizeObserver = new ResizeObserver(entries => {
  for (const entry of entries) {
    console.log(entry.target);
    console.log(entry. contentRect);
  }
})

要素変更の監視

要素の変更を監視する場合は、作成したResizeObserverのobserve()メソッドに要素を渡します。

const resizeObserver = new ResizeObserver(entries => {
  // 省略
})
const element = document.querySelecter('.hoge')
resizeObserver.observe(element)

監視の終了

監視を終了したい場合は、unobserve()を実行します

resizeObserver.unobserve(element)
CONTACT
© 2023, Kakkiii All Rights Reserved.