ResizeObserver是浏览器原生专治元素尺寸变化的方案,它按需监听具体DOM元素、批量回调、不阻塞渲染,且具备自动去重和防循环机制;必须显式调用observe(),并在组件卸载时disconnect(),SSR中需确保仅客户端执行。

直接用 ResizeObserver,别轮询、别监听 window.resize、也别靠 MutationObserver 猜尺寸——它就是浏览器原生给的、专治“元素大小变了但 JS 不知道”的方案。
为什么不能用 window.resize 监听容器变化
因为 更糟的是,如果多个组件都绑了 它不像 典型写法: 容易踩的坑: 真正可控的做法是监听卡片本身宽度,再算比例缩放: 生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力:
- 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面;
- 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”;
- 提及位于 `apps/console/src/featur 注意点: 在组件挂载时创建 React 示例(useEffect 清理): Vue 示例(onUnmounted): 最容易被忽略的一点:SSR(服务端渲染)项目中,window.resize 只在视口(viewport)大小变化时触发,和你页面里某个 window.resize,每次缩放都会触发所有回调,性能雪崩。而 ResizeObserver 是按需监听、批量回调、不阻塞渲染。
document.querySelector('.card')
entry.contentRect.width,单位像素,反映内容盒实际尺寸lastReportedSize 缓存机制)
ResizeObserver 必须传回调,且要手动 observe()
addEventListener 那样注册即生效,必须显式调用 observe(target) 才开始监听。漏掉这步,控制台静悄悄,什么都不会发生。const ro = new ResizeObserver((entries) => {
for (const entry of entries) {
console.log(entry.contentRect.width); // ✅ 正确读取
}
});
ro.observe(document.getElementById('my-box')); // ✅ 必须调用
null 或不存在的元素 → 控制台报错 Failed to execute 'observe' on 'ResizeObserver': The target must be an instance of Element
ro.disconnect() → 内存泄漏,回调还在执行但 DOM 已销毁window 或 document → 浏览器直接抛错,ResizeObserver 只接受单个具体元素节点动态字体缩放时,别用
vw,优先用 ResizeObserver + 容器宽度vw 是基于视口,不是父容器。如果你的文本在 max-width: 600px 的卡片里,font-size: 4vw 在 1920px 屏幕下会变成 76.8px,远超卡片承载能力。
const ro = new ResizeObserver((entries) => {
const width = entries[0].contentRect.width;
const scale = Math.min(1, Math.max(0.6, width / 600));
entry.target.style.fontSize = `${16 * scale}px`;
});
ro.observe(document.querySelector('.responsive-text'));
contentRect.width,不是 getBoundingClientRect().width —— 后者可能触发同步布局(forced reflow),尤其在循环中读取时Math.min/max 限幅,避免极端缩放(比如容器缩到 10px 宽,字体不能真变成 0.26px)getBoundingClientRect(),但务必只读一次React/Vue 中使用要防重复初始化和内存泄漏
ResizeObserver,但若组件频繁销毁重建(比如路由切换、列表项复用),不清理就会累积多个 observer 实例,占用内存且回调乱跑。useEffect(() => {
const ro = new ResizeObserver(...);
ro.observe(ref.current);
return () => ro.disconnect(); // ✅ 关键:卸载时断开
}, []);
onMounted(() => {
const ro = new ResizeObserver(...);
ro.observe(el.value);
onUnmounted(() => ro.disconnect()); // ✅ 同样关键
});
ResizeObserver 无法在服务端运行,必须确保初始化逻辑只在客户端执行,比如包裹在 if (typeof window !== 'undefined') 里,否则构建时报错或 hydration 失败。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










