Html-Css-iframe的⾃适应⾼度⽅案
先看⼀个⽰例,有两个页⾯,1.html通过iframe嵌⼊2.html,两个页⾯都是同域的
a.html
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<title>1.html</title>
</head>
<body>
<iframe id="ifr" src="b.html" frameborder="0" width="100%"></iframe>
</body>
</html>
b.html,很多P元素将⾼度撑⾼⼀些
<!DOCTYPE html>
<html>
<head>iframe参数传递
<meta charset="utf-8">
<title>b.html</title>
</head>
<body>
<p>这是⼀个ifrmae,嵌⼊在snandy.github.io/lib/iframe/1.html⾥</p>
<p>根据⾃⾝内容调整⾼度</p>
<p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p>
</body>
</html>
此时,浏览器访问1.html,效果如图
可以看到,嵌⼊的iframe出现了滚动条,需求是不想出现滚动条,页⾯多⾼就显⽰多少。我们不能随便给iframe设个⾼度,因为你不知道嵌⼊的iframe会有多⾼(内容是动态⽣成的)。
解决⽅法
解决⽅法其实很简单,⽆⾮是给1.html⾥的iframe设个⾼度,⾼度的值即为2.html的内容⾼度。要注意的是2.html的内容⾼度需要页⾯完全载⼊(onload)后获取。
有两种⽅式
A. JS代码写在⽗页⾯,即⽗页⾯(1.html)⾥获取⼦页⾯(2.html)⽂档对象,当iframe载⼊后(load)
获取⾼度,将此⾼度值赋值给iframe标签
开始测试时使⽤iframe的contentWindow的load事件,但所有浏览器均不执⾏。最后使⽤iframe的load事件,在⽗页⾯1.html底部加⼊如下JS代码
<script type="text/javascript">
// 计算页⾯的实际⾼度,iframe⾃适应会⽤到
function calcPageHeight(doc) {
var cHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)
var sHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight)
var height  = Math.max(cHeight, sHeight)
return height
}
var ifr = ElementById('ifr')
var iDoc = tDocument || ifr.document
var height = calcPageHeight(iDoc)
ifr.style.height = height + 'px'
}
</script>
这⾥有两个细节:
1. 取iframe内的⽂档对象,标准浏览器使⽤属性,IE低版本(IE6,7,8)使⽤属性。
2. calcPageHeight函数计算页⾯的实际⾼度,标准浏览器使⽤document.documentElement,低版本IE使⽤document.body,默认取clientHeight,出现滚动条的取scrollHeight,最后取两个值中最⼤的。
B. JS代码写在⼦页⾯,即⼦页⾯在window load后计算⾼度,将此⾼度值赋值给⽗页⾯的iframe
在⼦页⾯(2.html)底部加⼊如下代码
<script>
// 计算页⾯的实际⾼度,iframe⾃适应会⽤到
function calcPageHeight(doc) {
var cHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)
var sHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight)
var height  = Math.max(cHeight, sHeight)
return height
}
var height = calcPageHeight(document)
ElementById('ifr').style.height = height + 'px'
}
</script>
通过这两种⽅式都可以实现iframe的⾼度⾃适应,可以看到重新设置iframe的⾼度后,其滚动条都去掉了。
另总结:
第⼀种⽅法:
function SetWinHeight(obj)
{
var win=obj;
if (ElementById)
{
if (win && !window.opera)
{
if (tDocument && tDocument.body.offsetHeight)
win.height = tDocument.body.offsetHeight;
else if(win.Document && win.Document.body.scrollHeight)
win.height = win.Document.body.scrollHeight;
}
}
}
最后,加⼊iframe,不能丢掉onload属性,当然了,id也必须也函数中的win匹配
<iframe width="778" align="center" height="200" id="win" name="win" onload="Javascript:SetWinHeight(this)" frameborder="0" scrolling="no" src="1.htm"></iframe>
这么的这种也是跟上⾯的解决⽅法类似的代码
经典代码 iFrame ⾃适应⾼度,在IE6/IE7/IE8/Firefox/Opera/Chrome/Safari通过测试。
HTML代码:
<iframe src="www.fufuok/" id="iframepage" name="iframepage" frameBorder=0 scrolling=no width="100%" onLoad="iFrameHeight()"></iframe>Javascript代码:
<script type="text/javascript" language="javascript">
function iFrameHeight() {
var ifm= ElementById("iframepage");
var subWeb = document.frames ? document.frames["iframepage"].document : tDocument;
if(ifm != null && subWeb != null) {
ifm.height = subWeb.body.scrollHeight;
}
}
</script>
下⾯这个兼容性更好⼀些
<script language="javascript" type="text/javascript">
function dyniframesize(down) {
var pTar = null;
if (ElementById){
pTar = ElementById(down);
}
else{
eval('pTar = ' + down + ';');
}
if (pTar && !window.opera){
//begin resizing iframe
pTar.style.display="block"
if (tDocument && tDocument.body.offsetHeight){
//ns6 syntax
pTar.height = tDocument.body.offsetHeight +20;
pTar.width = tDocument.body.scrollWidth+20;
}
else if (pTar.Document && pTar.Document.body.scrollHeight){
//ie5+ syntax
pTar.height = pTar.Document.body.scrollHeight;
pTar.width = pTar.Document.body.scrollWidth;
}
}
}
</script>
<iframe src ="/default2.aspx" frameborder="0" marginheight="0" marginwidth="0" frameborder="0" scrolling="auto" id="ifm" name="ifm" onload="javascript:dyniframesize('ifm');" width="100%"> </iframe>
另⼀种情况的iframe解决⽅案(超简单)
重要提⽰:src=中你必须填写的⽹页地址,⼀定要和本页⾯在同⼀个站点上,否则,会抱错,说“拒绝访问!”(实际上这是因为Js的跨域问题导致拒绝访问的)
之前⾃⼰也碰到过这个问题,为了得到答案去⽹上搜索,发现有不少⼈也遇到了这样的问题,现在就把解决⽅法共享⼀下
1、建⽴⼀个bottom.js的⽂件,然后输⼊下⾯的代码(只有两⾏哦)
parent.document.all("框架ID名").style.height=document.body.scrollHeight;
parent.document.all("框架ID名").style.width=document.body.scrollWidth;
这⾥的框架ID名就是Iframe的ID,⽐如:
<IFRAME id="框架ID名" name="left" frameBorder=0 scrolling=no src="XXX.asp" width="100%"></IFRAME>
2、给你⽹站⾥所有的被包含⽂件⾥⾯每个都加⼊
<script language = "JavaScript" src = "bottom.js"/></script>
3、OK,收⼯!
在WINXP、IE6下⾯测试通过。很简单吧!
实现 iframe 的⾃适应⾼度
实现 iframe 的⾃适应⾼度,能够随着页⾯的长度⾃动的适应以免除页⾯和 iframe 同时出现滚动条的现象。
<script type="text/javascript">
//** iframe⾃动适应页⾯ **//
//输⼊你希望根据页⾯⾼度⾃动调整⾼度的iframe的名称的列表
//⽤逗号把每个iframe的ID分隔. 例如: ["myframe1", "myframe2"],可以只有⼀个窗体,则不⽤逗号。
//定义iframe的ID
var iframeids=["test"]
//如果⽤户的浏览器不⽀持iframe是否将iframe隐藏 yes 表⽰隐藏,no表⽰不隐藏
var iframehide="yes"
function dyniframesize()
{
var dyniframe=new Array()
for (i=0; i<iframeids.length; i++)
{
if (ElementById)
{
//⾃动调整iframe⾼度
dyniframe[dyniframe.length] = ElementById(iframeids);
if (dyniframe && !window.opera)
{
dyniframe.style.display="block"
if (tDocument && tDocument.body.offsetHeight) //如果⽤户的浏览器是NetScape
dyniframe.height = tDocument.body.offsetHeight;
else if (dyniframe.Document && dyniframe.Document.body.scrollHeight) //如果⽤户的浏览器是IE
dyniframe.height = dyniframe.Document.body.scrollHeight;
}
}
//根据设定的参数来处理不⽀持iframe的浏览器的显⽰问题
if ((document.all || ElementById) && iframehide=="no")
{
var tempobj=document.all? document.all[iframeids] : ElementById(iframeids)
tempobj.style.display="block"
}
}
}
if (window.addEventListener)
window.addEventListener("load", dyniframesize, false)
else if (window.attachEvent)
window.attachEvent("onload", dyniframesize)
else
</script>
第三中⽅法批量iframe⾃适应:
⼯作中遇到iframe随所含内容⾃适应⾼度的问题,以前在⽹上看到过类似问题的解决⽅法,于是搜索⼀下,到了⼀个⽐较完整的能够兼容浏览器的解决⽅法,省得⾃⼰写了。
虽然不⽤⾃⼰写,思路还是要明⽩,基本上就是取得iframe属性src所指定的包含⽂档中内容的⾼度,然后⽤来设置iframe⾃⾝的⾼度,在iframe所在页⾯载⼊时对页⾯中的所有需要⾃适应⾼度的iframe进⾏⾃动设置,省时省⼒,如果确定页⾯中全部iframe都需要⾃适应⾼度,直接取得iframe数组给代码,就连ID都不⽤⾃⼰写了,完成程序搞定。(代码贴上来:)
<script language="javascript">
//输⼊你希望根据页⾯⾼度⾃动调整⾼度的iframe的名称的列表
//⽤逗号把每个iframe的ID分隔. 例如: ["myframe1", "myframe2"],可以只有⼀个窗体,则不⽤逗号。
//定义iframe的ID
var iframeids=["test"];
//如果⽤户的浏览器不⽀持iframe是否将iframe隐藏 yes 表⽰隐藏,no表⽰不隐藏
var iframehide="yes";
function dyniframesize()
{
var dyniframe=new Array()
for (i=0; i<iframeids.length; i++)
{
if (ElementById)
{
//⾃动调整iframe⾼度
dyniframe[dyniframe.length] = ElementById(iframeids[i]);
if (dyniframe[i] && !window.opera)
{
dyniframe[i].style.display="block";
if (dyniframe[i].contentDocument && dyniframe[i].contentDocument.body.offsetHeight) //如果⽤户的浏览器是NetScape
dyniframe[i].height = dyniframe[i].contentDocument.body.offsetHeight;
else if (dyniframe[i].Document && dyniframe[i].Document.body.scrollHeight) //如果⽤户的浏览器是IE
dyniframe[i].height = dyniframe[i].Document.body.scrollHeight;
}
}
//根据设定的参数来处理不⽀持iframe的浏览器的显⽰问题
if ((document.all || ElementById) && iframehide=="no")
{
var tempobj=document.all? document.all[iframeids[i]] : ElementById(iframeids[i]);
tempobj.style.display="block";
}
}
}
if (window.addEventListener)
window.addEventListener("load", dyniframesize, false);
else if (window.attachEvent)
window.attachEvent("onload", dyniframesize);
else
</script>
⽹上有⼈改进了⽅法,解决了当iframe所包含⽂档内容⾼度动态变化时⾃动调整iframe⾼度的问题,原
理是在iframe所在页⾯不断扫描iframe包含⽂档的内容⾼度并改变iframe⾃⾝⾼度,这种⽅法貌似解决了问题,但是对页⾯速度和系统资源占⽤是否有影响还很难说,感觉⽅法有些偏执,应该有更好的解决⽅法。
第四种⽅法,只针对知道的iframe的ID调⽤不推荐
function iframeAutoFit(iframeObj){
setTimeout(function(){if(!iframeObj) return;iframeObj.height=(iframeObj.Document?iframeObj.Document.body.tDocument.body.offsetHeight);},200)
}