应加防抖(100–150ms)并用 requestAnimationFrame 安全更新DOM,优先选 window.innerWidth 获取视口宽度,横竖屏判断用 matchMedia('(orientation: landscape)')。

直接用 window.addEventListener('resize', callback) 就能监听窗口尺寸变化,但别一上来就写逻辑——高频触发、重复计算、无节流会立刻拖慢页面,尤其在移动端软键盘弹出或横竖屏切换时。
为什么 resize 事件会频繁触发
浏览器对窗口尺寸变化极其敏感:拖拽边框、缩放页面、横竖屏切换、甚至 iOS 软键盘弹起/收起都会触发 resize。实测中,一次快速拖拽可能触发 20+ 次,而每次回调若包含 getBoundingClientRect() 或重绘图表,性能会断崖式下降。
- 不要在回调里直接调用
chart.resize()或修改style.width - 必须加防抖(debounce),延迟 100–150ms 再执行布局逻辑,等尺寸稳定
- 避免在回调中反复查询
document.documentElement.clientWidth—— 它虽快,但和window.innerWidth含义不同(前者不含滚动条,后者含)
用 window.innerWidth 还是 clientWidth
选 window.innerWidth,它是响应式布局的事实标准。它返回视口宽度(含垂直滚动条宽度),与 CSS 媒体查询中的 width 值一致,能和 @media (max-width: 768px) 精确对齐。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
-
document.documentElement.clientWidth排除滚动条,但在某些 zoom 场景下不稳定 -
window.outerWidth是整个浏览器窗口宽,和页面布局无关,别用 - 判断横竖屏?别比
innerWidth > innerHeight—— 用matchMedia('(orientation: landscape)')更准,无抖动
监听后怎么安全更新 DOM
resize 回调不是渲染安全区:它可能在浏览器 layout 阶段中途触发,直接改 element.style 会强制同步重排(reflow),尤其当目标元素有复杂 CSS(如 flex/grid)时,卡顿明显。
- 优先用 CSS 变量 +
:has()或媒体查询做纯样式响应,JS 只管开关类名 - 必须 JS 控制尺寸时,用
requestAnimationFrame把更新推到下一帧,例如:function handleResize() { clearTimeout(resizeTimer); resizeTimer = setTimeout(() => { requestAnimationFrame(() => { const w = window.innerWidth; if (w - 多个组件共用 resize?别各自绑
window.addEventListener—— 统一注册一个,用发布-订阅分发事件,避免重复监听
真正容易被忽略的是:resize 不代表“布局已完成”。比如你监听到宽度变小,立刻调用 ECharts resize(),但此时父容器可能还没完成 flex 重排,getBoundingClientRect().width 拿到的仍是旧值。这时候得配合 ResizeObserver 监听容器本身,而不是只信 window.resize。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










