让动态的 iframe 内容高度自适应
使用iframe加载其他页面的时候,需要自适应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);
}
让动态的 iframe 内容高度自适应的更多相关文章
- iframe的高度自适应
http://www.cnblogs.com/snandy/p/3902337.html http://www.cnblogs.com/snandy/p/3900016.html Snandy Sto ...
- 同域iframe的高度自适应
引子 父页面里控制子页面 子页面里控制父页面 一.引子 我们先看一个示例,有两个页面,1.html通过iframe嵌入2.html,两个页面都是同域的 1.html <!DOCTYPE html ...
- 跨域iframe的高度自适应
If you cannot hear the sound of the genuine in you, you will all of your life spend your days on the ...
- 动态替换iframe的src及动态改变iframe的高度
实现效果:点击左侧右侧内容变化,但左侧保持不变(如折叠等) 动态替换iframe的src <iframe width="100%" frameBorder="0&q ...
- JQuery iframe宽高度自适应浏览器窗口大小的解决方法
iframe宽高度自适应浏览器窗口大小的解决方法 by:授客 QQ:1033553122 1. 测试环境 JQuery-3.2.1.min.js 下载地址: https://gitee.com ...
- WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应
WPF设置DataGrid行内容高度自适应 TextBox/TextBlock内容高度自适应 参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...
- js动态改变iframe的高度
js动态改变iframe的高度的写法 〈iframe id="docDetail" width="100%" height="200" ...
- 页面嵌套iframe时,怎样让iframe高度根据自身内容高度自适应
总体思路是这样的,因为iframe里页面的内容是动态加载的,而且电脑屏幕宽度发生变化时,也得相应的去改变iframe标签的高度(如果高度确定就不用这么麻烦了): 首先,我们在父页面中定义一个方法,用来 ...
- 实现iframe窗口高度自适应的又一个巧妙思路
domainA 中有一个页面index.html,通过iframe嵌套了domainB中的一个页面other.html由于other.html页面在iframe中显示,而且其页面内容会动态的增加或减少 ...
随机推荐
- sql SYS对象集合
select * from SYS.objects select * from SYS.all_objects select * from SYS.tables select * from SYS.c ...
- MySQL 数据库事务与复制
好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式 ...
- Expert 诊断优化系列------------------透过等待看系统
上一篇我们简单的介绍了,语句优化的三板斧,大部分语句三板斧过后,就算不成为法拉利也能是个宝马了.为了方便阅读给出系列文章的导读链接: SQL SERVER全面优化-------Expert for S ...
- 玩转Windows服务系列——服务运行、停止流程浅析
通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大家可要睁大眼睛看清楚了. 接下来研究一下Windows服务的 ...
- lua中实现异步资源读写
同样还是更新方面的需求,当我们检测到版本是新安装的以后,要进行upd目录清除.如果使用os.execute执行 rm -rf ooxx 是非常快的但由于os.execute一旦报错,那整个lua进程就 ...
- 浅析MSIL中间语言——基础篇
一.开篇 研究MSIL纯属于个人喜好,说在前面MSIL应用于开发的地方很少,但是很大程度上能够帮着我们理解底层的原理,这是我了解MSIL的主要原因.托管代码表示应用程序的方法的功能,它们以微软的中间语 ...
- [ASP.NET MVC 小牛之路]14 - Unobtrusive Ajax
Ajax (Asynchronous JavaScript and XML 的缩写),如我们所见,这个概念的重点已经不再是XML部分,而是 Asynchronous 部分,它是在后台从服务器请求数据的 ...
- KnockoutJS 3.X API 第七章 其他技术(4) 速率限制
注意:这个速率限制API是在Knockout 3.1.0中添加的. 通常,更改的observable立即通知其订户,以便依赖于observable的任何计算的observable或绑定都会同步更新. ...
- NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”
几张图就可以说明一切 2015-03-29 21:54:09,206 [77] ERROR log - System.NotSupportedException: 无法将类型“System.DateT ...
- 开源地图SharpMap源码解析-(1)简介
1.简介 SharpMap最新版基于.NET Framework 4,采用C#开发的地图渲染引擎,非常易于使用.我这次研究的是比较稳定发布的V1.1版本.可以在GitHub下载该源码,地址:https ...