监听某个DIV的宽高变化

监听某个DIV的尺寸变化

背景:
vue项目中用到echarts图表,页面上有侧边栏,侧边栏收缩图表不能自适应,想通过监听内容部分的宽度让图表resize,但是用window带的resize,只能监听浏览器窗口大小变化,像侧边导航隐藏的这种情况不能人echarts重置。
为了监听某元素区域的变化而使echarts的尺寸重置,我第一时间想到的是resize事件,但是实际试了试,发现并不能起到我想要的效果,加在DIV上的resize事件根本不能触发,后来百度了一下,发现resize只能加在window对象上,并不能监听具体某个DOM元素!

解决方案

通过安装插件的方式

在项目中安装:element-resize-detector

参考博客链接

知识扩展

  1. ResizeObserver

MDN ResizeObserver
ResizeObserver 接口可以监听到 Element 的内容区域或 SVGElement的边界框改变,内容区域则需要减去内边距padding。
ResizeObserver避免了在自身回调中调整大小,从而触发的无限回调和循环依赖。它仅通过在后续帧中处理DOM中更深层次的元素来实现这一点。如果(浏览器)遵循规范,只会在绘制前或布局后触发调用
ResizeObserver API

<think>嗯,用户现在问的是如何用JavaScript监听div变化。之前他们已经讨论过在Vue项目中使用Element Plus表单时,动态调整表单度的解决方案,其中提到了ResizeObserver和iframe的方法。现在用户想更深入了解纯JavaScript的方法,可能需要多种方案,并参考之前的讨论。 首先,用户之前的问题是关于表单变化时的CSS解决方案,其中提到了ResizeObserver和通过iframe的onresize事件的方法。现在用户明确想找JavaScript监听div变化的方法,所以需要整理几种常见的JS方法,并考虑兼容性和实用性。 用户提供的站内引用提到了两种方法:使用iframe的resize事件和MutationObserver。需要将这些方法整合进去,同时补充其他可能的方法,比如轮询检测或者ResizeObserver,但ResizeObserver已经在之前的回答中提过,可能用户现在想更详细地了解其他方法。 需要确保回答的结构清晰,分点列出每种方法,包括原理、实现代码、优缺点,以及注意事项。用户可能关心不同方法的兼容性,比如ResizeObserver的浏览器支持情况,或者MutationObserver的使用限制。此外,用户提到iframe的方法,需要详细解释其原理,并给出代码示例。 可能还要比较不同方法的适用场景,比如轮询简单但性能差,ResizeObserver现代但需要polyfill,MutationObserver适合DOM结构变化的情况。用户可能在实际项目中需要选择最适合他们需求的方法,因此需要给出每种方法的优缺点。 另外,用户之前的问题中提到了异步加载图片导致变化的情况,所以在解释方法时要考虑到这种情况,比如图片加载完成后触发变化,如何正确监听。可能需要提到在图片加载完成后触发检查,或者在MutationObserver中处理子元素的变化。 最后,相关问题部分需要引导用户深入,比如如何优化性能,处理兼容性,或者结合框架使用。确保回答覆盖用户可能需要的后续问题,帮助他们进一步解决问题。</think>在JavaScript监听div变化主要有以下5种实现方案,根据使用场景选择最合适的方法: ### 一、ResizeObserver API(现代浏览器推荐) ```javascript const targetDiv = document.querySelector(&#39;.box&#39;); const observer = new ResizeObserver(entries => { for (let entry of entries) { const height = entry.contentRect.height; console.log(&#39;变化:&#39;, height); // 执行业务逻辑 } }); observer.observe(targetDiv); // 停止监听 // observer.disconnect(); ``` **原理**: 通过浏览器原生API监听元素尺寸变化,支持动态内容、CSS动画、窗口缩放等场景[^1] **特点**: ✅ 性能最佳(浏览器原生支持) ✅ 精确到像素级变化 ⚠️ 需要polyfill支持IE(resize-observer-polyfill) --- ### 二、iframe代理方案(兼容性最佳) ```html <div class="box"> <iframe style="height:100%; width:0; border:0; position:absolute; opacity:0;"></iframe> <!-- 实际内容 --> </div> ``` ```javascript const box = document.querySelector(&#39;.box&#39;); const iframe = box.querySelector(&#39;iframe&#39;); iframe.contentWindow.onresize = () => { console.log(&#39;新度:&#39;, box.offsetHeight); // 执行回调逻辑 }; ``` **实现原理**: 利用iframe与其父容器度联动的特性,通过监听iframe窗口的resize事件间接检测父容器变化[^2] **优势**: ✅ 兼容所有主流浏览器(包括IE9+) ✅ 不依赖任何第三方库 --- ### 三、MutationObserver检测(DOM结构变化时) ```javascript const observer = new MutationObserver(mutations => { console.log(&#39;当前度:&#39;, targetDiv.offsetHeight); }); observer.observe(targetDiv, { attributes: true, // 监听属性变化 childList: true, // 监听子节点变化 subtree: true, // 监听所有后代节点 characterData: true // 监听文本内容变化 }); ``` **适用场景**: 当变化由以下原因引起时: - 子元素增删/内容变化 - 元素样式属性变化 - 文本内容改变 --- ### 四、轮询检测(兼容旧浏览器的保底方案) ```javascript let lastHeight = 0; function checkHeight() { const currentHeight = targetDiv.offsetHeight; if (currentHeight !== lastHeight) { console.log(&#39;变化:&#39;, currentHeight); lastHeight = currentHeight; } requestAnimationFrame(checkHeight); } checkHeight(); ``` **优化技巧**: 1. 使用`requestAnimationFrame`代替`setInterval`提升性能 2. 添加阈值检测避免微小波动: ```javascript if (Math.abs(currentHeight - lastHeight) > 2) { /*...*/ } ``` --- ### 五、CSS动画事件监听(特定场景使用) ```css .box { animation: heightMonitor 1s infinite; } @keyframes heightMonitor { from { opacity: 0.99; } to { opacity: 1; } } ``` ```javascript targetDiv.addEventListener(&#39;animationiteration&#39;, () => { console.log(&#39;当前度:&#39;, targetDiv.offsetHeight); }); ``` **原理**: 通过持续触发的CSS动画间接检测布局变化 --- ### 综合方案选择建议 | 方案 | 实时性 | 性能消耗 | 兼容性 | 实现复杂度 | |--------------------|--------|----------|--------------|------------| | ResizeObserver | ★★★★★ | ★★☆☆☆ | 现代浏览器 | 简单 | | iframe代理 | ★★★★☆ | ★★★☆☆ | 全兼容 | 中等 | | MutationObserver | ★★★☆☆ | ★★★★☆ | IE11+ | 复杂 | | 轮询检测 | ★★☆☆☆ | ★☆☆☆☆ | 全兼容 | 简单 | | CSS动画事件 | ★★☆☆☆ | ★★★★☆ | 部分旧浏览器 | 中等 | **特殊场景处理**: 1. **图片异步加载**:在`<img>`标签上添加`onload`事件 ```javascript images.forEach(img => { img.onload = () => console.log(&#39;图片加载完成,当前度:&#39;, div.offsetHeight); }); ``` 2. **过渡动画期间**:配合`transitionend`事件 ```javascript targetDiv.addEventListener(&#39;transitionend&#39;, () => { console.log(&#39;过渡结束度:&#39;, targetDiv.offsetHeight); }); ``` : ResizeObserver是现代浏览器监听元素尺寸变化的首选API [^2]: iframe方案通过代理窗口事件实现跨浏览器兼容
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值