如何利用Resize Observer监听元素尺寸的变化?

Resize Observer 能高效监听DOM元素内容区域尺寸变化,适用于动态调整图表、响应式布局等场景,通过 observe 监听、unobserve 或 disconnect 停止,避免内存泄漏。

当需要实时感知DOM元素尺寸变化时,Resize Observer 是比事件监听或轮询更高效、更现代的解决方案。它能准确监听元素内容区域的变化,包括由JavaScript、CSS或响应式布局引发的改变,且不会触发重排或重绘。

基本用法

创建一个 ResizeObserver 实例,并调用 observe 方法来监听目标元素:

const observer = new ResizeObserver(entries => {
  for (let entry of entries) {
    const { width, height } = entry.contentRect;
    console.log(`宽度: ${width}, 高度: ${height}`);
  }
});

// 开始监听某个元素
observer.observe(document.getElementById('myElement'));

entries 是一个列表,每个 entry 对应一个被监听元素的状态。contentRect 提供了当前的内容盒子尺寸(不包含 padding、border、margin)。

监听多个元素

同一个观察者可以监听多个元素,回调中会区分不同元素的尺寸变化:

const observer = new ResizeObserver(entries => {
  entries.forEach(entry => {
    const target = entry.target;
    const { width, height } = entry.contentRect;
    console.log(`${target.id} 尺寸变化:${width} x ${height}`);
  });
});

observer.observe(element1);
observer.observe(element2);

停止监听

当不再需要监听时,应调用 unobserve 或 disconnect 来释放资源:

  • unobserve(element):停止监听指定元素
  • disconnect():停止监听所有元素
// 停止监听特定元素
observer.unobserve(element1);

// 完全断开所有监听
observer.disconnect();

在 Vue、React 等框架中使用时,建议在组件卸载时调用 disconnect,避免内存泄漏。

实际应用场景

  • 动态调整图表 canvas 大小(如 ECharts、Chart.js)
  • 响应式文本截断或字体自适应
  • 实现容器内元素的自动布局切换
  • 监控弹窗或面板的尺寸以重新定位浮层

基本上就这些。Resize Observer API 简洁高效,取代了过去依赖 window.resize 或 scroll 事件的笨拙方式,特别适合监听任意元素的实际内容区域变化。