怎么让动态的 iframe 高度自适应里面内容

这里加载了两个不同内容高度的页面至iframe中

 

1. 没有设置高度

      <div class="iframe-wrapper">
            <iframe name="iframe1" src="iframe1.html" frameborder="0" width="100%"></iframe>
            <iframe name="iframe2" src="iframe2.html" frameborder="0" width="100%"></iframe>
        </div>

默认长这样

有滚动条,可以看到iframe并不会因为内容高度自动撑开

 

2. 显示地设置高度

        <div class="iframe-wrapper">
            <iframe name="iframe1" src="iframe1.html" frameborder="0" width="100%" height="300px"></iframe>
            <iframe name="iframe2" src="iframe2.html" frameborder="0" width="100%" height="300px"></iframe>
        </div>

内容长这样,但可以看到,高度定死了,没有自适应

 

3. 在onload事件触发时,根据body的高度自适应iframe的高度

        <div class="iframe-wrapper">
            <iframe name="iframe1" onload="this.height=this.contentWindow.document.body.scrollHeight" src="iframe1.html" frameborder="0" width="100%"></iframe>
            <iframe name="iframe2" onload="this.height=iframe2.document.body.scrollHeight" src="iframe2.html" frameborder="0" width="100%"></iframe>
        </div>

注意到这里的 this.contentWindow 其实就类似与下方的 name值对应的iframe2,两种引用方式是等价的

可以发现,高度虽然能自适应,不过只支持高度了“从小到大”的自适应

如iframe2的内容比iframe1的高,后者动态加载出前者能自适应,但前者动态加载出后者就不行了,这种高度减小不了

 

最后的解决办法是

4. 在onload事件中动态设置高度为body高度之前,先将原高度还原为auto或空值

可以用setTimeout(fn,0)将高度设置放到下一轮事件循环中执行,或者在 onbeforeunload 事件中先把高度设置为auto

setTimeout

复制代码
      var iframes = document.getElementsByTagName('iframe');

        for (var i = 0, j = iframes.length; i < j; ++i) {
            // 放在闭包中,防止iframe触发load事件的时候下标不匹配
            (function(_i) {
                iframes[_i].onload = function() {
                    // 提前还原高度
                    this.setAttribute('height', 'auto'); // 或设为''
                    // 再在下一轮事件循环中设置新高度
                    setTimeout(function() {
                        iframes[_i].setAttribute('height', iframes[_i].contentWindow.document.body.scrollHeight);
                    }, 0);
                }
            })(i);
        }
复制代码

onbeforeunload

复制代码
        var iframes = document.getElementsByTagName('iframe');

        for (var i = 0, j = iframes.length; i < j; ++i) {
            // 放在闭包中,防止iframe触发load事件的时候下标不匹配
            (function(_i) {
                iframes[_i].onload = function() {
                    this.contentWindow.onbeforeunload = function() {
                        iframes[_i].setAttribute('height', 'auto');
                    };

                    this.setAttribute('height', this.contentWindow.document.body.scrollHeight);
                };
            })(i);
        }
复制代码

基本ok了,不过偶尔(可能是电脑卡了?)会看到些抖动闪动的情况

 

5. 要避免这个情况,可暂时将它隐藏

先设置display为none,再设置为block;或者先设置visibility为hidden,再设置为visible 。 用visibility看起来变化地更自然一点

setTimeout

复制代码
       var iframes = document.getElementsByTagName('iframe');

        for (var i = 0, j = iframes.length; i < j; ++i) {
            // 放在闭包中,防止iframe触发load事件的时候下标不匹配
            (function(_i) {
                iframes[_i].onload = function() {
                    this.style.visibility = 'hidden';
                    // this.style.display = 'none';

                    // 提前还原高度
                    this.setAttribute('height', 'auto'); // 或设为''

                    // 再在下一轮事件循环中设置新高度
                    setTimeout(function() {
                        iframes[_i].setAttribute('height', iframes[_i].contentWindow.document.body.scrollHeight);

                        iframes[_i].style.visibility = 'visible';
                        // iframes[_i].style.display = 'block';
                    }, 0);
                }
            })(i);
        }
复制代码

onbeforeunload

复制代码
        var iframes = document.getElementsByTagName('iframe');

        for (var i = 0, j = iframes.length; i < j; ++i) {
            // 放在闭包中,防止iframe触发load事件的时候下标不匹配
            (function(_i) {
                iframes[_i].onload = function() {
                    this.contentWindow.onbeforeunload = function() {
                        iframes[_i].style.visibility = 'hidden';
                        // iframes[_i].style.display = 'none';

                        iframes[_i].setAttribute('height', 'auto');
                    };

                    this.setAttribute('height', this.contentWindow.document.body.scrollHeight);

                    this.style.visibility = 'visible';
                    // this.style.display = 'block';
                };
            })(i);
        }
复制代码

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现 iframe动态自适应高度,可以使用以下方法: 1. 使用 JavaScript 监听 iframe 内容的完成事件,然后动态设置 iframe高度。这样可以确保在内容加载完成后再调整高度。你可以使用以下代码: ```javascript var iframe = document.getElementById('your-iframe-id'); // 监听 iframe 内容加载完成事件 iframe.addEventListener('load', function() { // 设置 iframe高度内容高度 iframe.style.height = iframe.contentWindow.document.body.scrollHeight + 'px'; }); ``` 这样,当 iframe 内容加载完成后,会自动调整 iframe高度以适应内容。 2. 如果 iframe 内容来自同源的页面,你还可以使用 postMessage API 来进行跨域通信。在 iframe 内容页面中,将内容高度通过 postMessage 发送给父页面。然后在父页面中,使用 JavaScript 监听 message 事件,并根据接收到的高度值来设置 iframe高度。以下是一个简单的示例: 在 iframe 内容页面: ```javascript // 获取内容高度 var height = document.body.scrollHeight; // 发送高度给父页面 parent.postMessage(height, '*'); ``` 在父页面: ```javascript var iframe = document.getElementById('your-iframe-id'); // 监听 message 事件 window.addEventListener('message', function(event) { // 接收到消息后设置 iframe高度 iframe.style.height = event.data + 'px'; }); ``` 这样,当 iframe 内容页面发送消息时,父页面会接收到消息并设置 iframe高度。 以上是两种常用的方法来实现 iframe动态自适应高度。根据你的具体需求和情况,选择适合的方法来实现即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值