ResizeObserver

ResizeObserver

ResizeObserver 允许我们观察 DOM 元素的内容矩形大小(width、height)的变化,并做出相应的响应。它就像给元素添加 document.onresize()或 window.resize()事件。不调整视窗大小而只改变元素的大小,这是很有用的。例如,添加新的子元素,将元素的 display 设置为 none 或类似可以改变元素大小的的事件。事实上,它只关注内容框(Content Box)变化。比如下面这些行为将会触发 ResizeObserver 的行为:

  • 当观察到的元素被插入或从 DOM 中删除时,观察将会触发
  • 当观察到的元素 display 值为 none 时,观察都会触发
  • 观察不会对未替换的内联元素(non-replaced inline element)触发
  • 观察不会由 CSS 的 transform 触发
  • 如果元素有显示,而且元素大小不是 0,0,观察将会触发

ResizeObserver 通知内容框的大小,如下图所示:

基础使用

创建观察者

可以通过调用它的构造函数和传递处理函数来创建它。

const observer = new ResizeObserver(handler);

定义要观察的目标对象

定义目标对象,其大小的变化应该被观察到。

const child = document.querySelector(".child");
observer.observe(child);

定义回调事件

function handler(entries) {
  entries.forEach((entry) => {
    const size = entry.target.contentRect;
    console.log(`Element’s size: width: ${size.width}, height: ${size.height}`);
  });
}
if (!("ResizeObserver" in window)) {
  document.body.innerText = "Not supported by your browser";
}
/* Create resize observer */
const observer = new ResizeObserver(handler);

/* Callback handler */
function handler(entries) {
  entries.forEach((entry) => {
    const size = entry.contentRect;
    console.log(
      `Resize Observer's callback: box size: width: ${size.width}, height:  ${size.height}`
    );
  });
}

/* Observe child element */
const child = document.querySelector(".box");
observer.observe(child);
上一页