监听div的resize

本文介绍了一种使用iframe监听div元素宽度和高度变化的方法,通过在div内嵌入一个不可见的iframe并监听其resize事件,可以实时监测div尺寸的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  简单点说,就是:
     在被监听的 div 中添加 iframe 标签,设置其高宽均为 100%;
     在 iframe 的 resize 被触发时,则表明 div 的大小正在改变!

参考

Resize on div element 来源于stackoverflow 的回答

历程

日常开发中,遇到元素宽高改变时需要广播事件,由于此时窗口大小并未改变,故添加resize回调没用;而且该元素是因为某些dom隐藏,其高宽自适应所导致,而不是通过js设置,故 MutationObserver 也无法监听到。
上网找了找,对于div的resize事件的监听,实现方式有很多,比如:

基于jquery的小插件
通过object元素进行监听
scroll来监听元素resize
基于requestanimationframe的周期性检查

虽然是实现了对元素宽高的监听,但看上去很瓜。直到看到了stackoverflow 的回答...

代码

这是我们要监听的元素和样式

<style>
    .container {
        position: relative;
        width: 500px;
        height: 300px;
        background-color: black;
    }
</style>

<div class="container"></div>

模拟resize的函数,参数el为被监听的元素,cb为回调函数

function riseze (el, cb) {
    // 创建iframe标签,设置样式并插入到被监听元素中
    var iframe = document.createElement('iframe');
    iframe.setAttribute('class', 'size-watch');
    el.appendChild(iframe);

    // 记录元素当前宽高
    var oldWidth = el.offsetWidth;
    var oldHeight = el.offsetHeight;

    // iframe 大小变化时的回调函数
    function sizeChange () {
        // 记录元素变化后的宽高
        var width = el.offsetWidth;
        var height = el.offsetHeight;
        // 不一致时触发回调函数 cb,并更新元素当前宽高
        if (width !== oldWidth || height !== oldHeight) {
            cb({width: width, height: height}, {width: oldWidth, height: oldHeight});
            oldWidth = width;
            oldHeight = height;
        }
    }

    // 设置定时器用于节流
    var timer = 0;
    // 将 sizeChange 函数挂载到 iframe 的resize回调中
    iframe.contentWindow.onresize = function () {
        clearTimeout(timer);
        timer = setTimeout(sizeChange, 20);
    };
}

这边是iframe的样式

.size-watch {
    width: 100%;
    height: 100%;
    position: absolute;
    visibility:hidden;
    margin: 0;
    padding: 0;
    border: 0;
}

测试

试一哈...

<script>
    var el = document.querySelector('.container');
    riseze(el, (val, oldVal) => {
        console.log(`size changed!new: ${JSON.stringify(val)}, old: ${JSON.stringify(oldVal)}`);
    });
</script>

结果就是这样子
clipboard.png

clipboard.png

溜溜球~

### 前端 `div` 监听 `resize` 事件 由于标准的 `resize` 事件仅适用于窗口对象,对于特定的 DOM 元素如 `<div>` 并不支持此事件。为了实现对单个 `div` 的尺寸变化监听,可以采用几种不同的策略。 #### 使用 ResizeObserver API 现代浏览器提供了 `ResizeObserver` 接口来观察目标元素的尺寸更改。这允许开发者监控任何元素的内容矩形的变化情况,并相应地作出反应[^4]。 ```javascript const elementToWatch = document.querySelector('#myDiv'); // 创建一个新的 ResizeObserver 实例并定义回调函数 const resizeObserver = new ResizeObserver((entries) => { for (let entry of entries) { console.log('Element resized:', entry.contentRect); } }); // 开始观察指定的目标节点 resizeObserver.observe(elementToWatch); // 如果不再需要观察,则可以通过下面的方法停止观察 // resizeObserver.unobserve(elementToWatch); ``` 这种方法的优势在于它不需要依赖于定时器轮询或其他间接手段就能精确捕捉到元素的实际大小改变。 #### 老版本兼容方案 如果考虑到较旧版浏览器的支持问题,可能无法使用 `ResizeObserver` 。此时可考虑其他替代方式,比如通过检测属性变动或布局更新触发自定义逻辑: 一种常见的做法是在每次页面重绘时检查感兴趣元素的新尺寸并与之前记录下来的值对比;当发现差异时即认为发生了调整行为。不过这种方式效率较低且容易造成性能瓶颈,在实际应用中应谨慎选用。 另一种思路是利用 MutationObserver 来监视 DOM 结构上的变更,虽然这不是直接针对尺寸变化的设计初衷,但在某些场景下也能起到一定作用。 需要注意的是,以上提到的老版本兼容方案并不是最佳实践,推荐尽可能使用最新的 Web 标准特性如 `ResizeObserver` ,除非确实存在跨平台兼容性的严格要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值