Resize Observer 提供高性能、精确的DOM元素尺寸监听,相比 window.onresize 具有更优的性能、细粒度控制和避免循环触发的优势,适用于自适应组件、响应式布局等场景,并需注意兼容性处理与内存管理。

Resize Observer
window.onresize
使用
Resize Observer
Mutation Observer
首先,你需要创建一个
ResizeObserver
// 1. 创建 ResizeObserver 实例
const myObserver = new ResizeObserver(entries => {
// entries 是一个 ResizeObserverEntry 对象的数组
// 每一个 entry 都代表一个被监听元素的尺寸变化
for (let entry of entries) {
// entry.target 是发生尺寸变化的 DOM 元素
// entry.contentRect 提供了该元素新的 content-box 尺寸(DOMRectReadOnly 对象)
// entry.contentBoxSize 和 entry.borderBoxSize 提供了更详细的尺寸信息(ResizeObserverSize 数组)
// 它们提供了更精确的 width 和 height,考虑了设备的像素比
const { width, height } = entry.contentRect; // 常用
// 或者更现代的写法,获取最新的 content-box 尺寸
// const latestContentBoxSize = entry.contentBoxSize[0]; // 数组,通常只有一个元素
// const width = latestContentBoxSize.inlineSize;
// const height = latestContentBoxSize.blockSize;
console.log(`元素 ${entry.target.id || entry.target.tagName} 的新尺寸是:${width}x${height}`);
// 在这里执行你希望在尺寸变化时触发的逻辑
// 例如:重新绘制图表、调整组件布局、更新文本溢出状态等
if (entry.target.id === 'myChartContainer') {
updateChart(entry.target, width, height);
}
}
});
// 2. 选择你要监听的 DOM 元素
const chartContainer = document.getElementById('myChartContainer');
const sidebar = document.getElementById('sidebar');
// 3. 开始监听这些元素
if (chartContainer) {
myObserver.observe(chartContainer);
}
if (sidebar) {
myObserver.observe(sidebar);
}
// 4. 当不再需要监听时,记得取消监听,防止内存泄漏
// 例如,在一个组件销毁时调用:
// myObserver.unobserve(chartContainer); // 取消监听单个元素
// myObserver.disconnect(); // 取消监听所有元素,并停止观察者这个过程的核心就是:创建观察者 -> 指定目标 -> 开始观察 -> (可选)停止观察。回调函数里的
entries
说实话,我刚开始接触前端时,遇到需要监听元素尺寸变化的需求,第一反应总是
window.onresize
Resize Observer
首先,最核心的优势就是性能和粒度。
window.onresize
Resize Observer
requestAnimationFrame
其次,是精确性和便捷性。
window.onresize
getBoundingClientRect()
offsetWidth
offsetHeight
Resize Observer
ResizeObserverEntry
contentRect
contentBoxSize
borderBoxSize
content-box
border-box
Resize Observer
content-box
还有一个非常重要的点,就是它避免了潜在的无限循环和循环引用问题。一个常见的误区是,在
window.onresize
window.onresize
Resize Observer
在我多年的开发经验里,
Resize Observer
常见的应用场景:
Resize Observer
resize()
@media
Resize Observer
Resize Observer
Resize Observer
Resize Observer
潜在的挑战:
Resize Observer
requestAnimationFrame
unobserve()
disconnect()
Resize Observer
Resize Observer
处理
Resize Observer
兼容性解决方案:
最直接有效的方式就是使用 Polyfill。市面上有一些成熟的
Resize Observer
github.com/que-etc/resize-observer-polyfill
安装 Polyfill: 如果你使用npm或yarn,可以这样安装:
npm install resize-observer-polyfill # 或者 yarn add resize-observer-polyfill
引入和使用: 在你的应用入口文件或需要使用
Resize Observer
window.ResizeObserver
import ResizeObserver from 'resize-observer-polyfill';
// 确保全局的 ResizeObserver 可用
if (!window.ResizeObserver) {
window.ResizeObserver = ResizeObserver;
}
// 现在你就可以放心地使用 new ResizeObserver(...) 了当然,你也可以在条件判断后,只在不支持的浏览器中加载这个 Polyfill,实现按需加载,进一步优化性能。
特性检测: 在实际使用
new ResizeObserver()
if (typeof window.ResizeObserver !== 'undefined') {
// 使用 ResizeObserver
} else {
// 提供降级方案或使用 Polyfill
}在回调中避免性能陷阱:
尽管
Resize Observer
保持回调函数轻量化: 回调函数的核心职责应该是获取最新的尺寸信息,并触发必要的更新。避免在回调中执行大量、复杂的DOM操作或耗时的计算。如果确实需要执行这些操作,可以考虑将它们延迟。
利用 requestAnimationFrame
requestAnimationFrame
const myObserver = new ResizeObserver(entries => {
for (let entry of entries) {
// 获取尺寸信息
const { width, height } = entry.contentRect;
// 将复杂的DOM操作或渲染逻辑放入 requestAnimationFrame
window.requestAnimationFrame(() => {
// 例如,更新一个 canvas 的尺寸并重新绘制
if (entry.target.id === 'myChartCanvas') {
const canvas = entry.target;
canvas.width = width;
canvas.height = height;
drawChart(canvas, width, height);
}
});
}
});合理使用防抖(Debounce)或节流(Throttle):
Resize Observer
Resize Observer
及时清理观察者: 这是我之前提过的,但真的非常重要。当被监听的元素从DOM中移除,或者包含
Resize Observer
observer.unobserve(element)
observer.disconnect()
// 在组件卸载或元素被移除时调用 myObserver.unobserve(chartContainer); // 针对特定元素 // 或者 // myObserver.disconnect(); // 如果这个观察者只服务于这个组件,并且组件要被销载了
通过这些方法,你就能在项目中更稳健、更高效地利用
Resize Observer
以上就是如何用Resize Observer监听DOM元素尺寸变化?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号