iframe高度自适应的方法
JS自适应高度,其实就是设置iframe的高度,使其等于内嵌网页的高度,从而看不出来滚动条和嵌套痕迹。对于用户体验和网站美观起着重要作用。·
如果内容是固定的,那么我们可以通过CSS来给它直接定义一个高度,同样可以实现上面的需求。当内容是未知或者是变化的时候。这个时候又有几种情况了。
iframe内容未知,高度可预测
这个时候,我们可以给它添加一个默认的CSS的min-height值,然后同时使用JavaScript改变高度。常用的兼容代码有:
// document.domain = "caibaojian.com"; function setIframeHeight(iframe) { if (iframe) { var iframeWin = iframe.contentWindow || iframe.contentDocument.parentWindow; if (iframeWin.document.body) { iframe.height = iframeWin.document.documentElement.scrollHeight || iframeWin.document.body.scrollHeight; } } }; window.onload = function() { setIframeHeight(document.getElementById('external-frame')); };
只要修改以上的iframe的ID即可了。或者你可以直接在iframe里面写代码,我们一般为了不污染HTML代码,建议使用上面的代码。
<iframe src="backtop.html" frameborder="0" scrolling="no" id="external-frame" onload="setIframeHeight(this)"></iframe>
多个iframe的情况下
<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 (document.getElementById) { //自动调整iframe高度 dyniframe[dyniframe.length] = document.getElementById(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 || document.getElementById) && iframehide == "no") { var tempobj = document.all ? document.all[iframeids[i]] : document.getElementById(iframeids[i]); tempobj.style.display = "block"; } } } if (window.addEventListener) window.addEventListener("load", dyniframesize, false); else if (window.attachEvent) window.attachEvent("onload", dyniframesize); else window.onload = dyniframesize;
</script>
针对知道的iframe的ID调用
function iframeAutoFit(iframeObj) { setTimeout(function() { if (!iframeObj) return; iframeObj.height = (iframeObj.Document ? iframeObj.Document.body.scrollHeight: iframeObj.contentDocument.body.offsetHeight); }, 200) }
内容宽度变化的iframe高度自适应
<iframe src="backtop.html" frameborder="0" scrolling="no" id="test" onload="this.height=100"></iframe> <script type="text/javascript">
function reinitIframe() { var iframe = document.getElementById("test"); try { var bHeight = iframe.contentWindow.document.body.scrollHeight; var dHeight = iframe.contentWindow.document.documentElement.scrollHeight; var height = Math.max(bHeight, dHeight); iframe.height = height; console.log(height); } catch(ex) {} } window.setInterval("reinitIframe()", 200);
</script>
项目中用到了第一种,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>办理足迹线索采集详情</title> <%@include file="/commons/include/newGet.jsp"%> <script type="text/javascript"> $(function(){ <c:forEach items="${map}" var="m"> judgeClueDetail(${m.key},${m.value}) </c:forEach> }) function setIframeHeight(iframe) { if (iframe) { var iframeWin = iframe.contentWindow || iframe.contentDocument.parentWindow; if (iframeWin.document.body) { iframe.height = (iframeWin.document.documentElement.scrollHeight || iframeWin.document.body.scrollHeight)+15; } } } //案源详情 function judgeClueDetail(caseId,caseType){ var _url = ''; switch (caseType) { case 0: _url='${ctx }/pwlp/collect/casePenalty/get.ht?caseId='+caseId+'&ifShowAccept=fasle&timeLineFlag=yes'; break; case 1: _url='${ctx }/pwlp/collect/publicOpinion/get.ht?id='+caseId+'&ifShowAccept=fasle&timeLineFlag=yes'; break; case 3: _url='${ctx }/pwlp/collect/complaintsReport/get.ht?id='+caseId+'&ifShowAccept=fasle&timeLineFlag=yes'; break; case 4: _url='${ctx }/pwlp/collect/caseJudgment/get.ht?id='+caseId+'&ifShowAccept=fasle&timeLineFlag=yes'; break; case 5: _url='${ctx }/pwlp/collect/crimeCase/get.ht?id='+caseId+'&ifShowAccept=fasle&timeLineFlag=yes'; break; case 6: _url='${ctx }/pwlp/collect/leaderHotline/get.ht?id='+caseId+'&ifShowAccept=fasle&timeLineFlag=yes'; break; case 7: _url='${ctx}/pwlp/collect/unifyBuz/get.ht?id='+caseId+'&ifShowAccept=fasle&timeLineFlag=yes'; break; case 8: _url='${ctx }/pwlp/collect/environmentSupervise/get.ht?id='+caseId+'&ifShowAccept=fasle&timeLineFlag=yes'; break; } //添加iframe标签 var body = document.getElementsByTagName("body"); var div = document.createElement("div"); div.innerHTML = "<iframe src='"+_url+"' frameborder='0' scrolling='no' style='width:100%; padding-bottom:0px' onload='setIframeHeight(this)'></iframe>"; document.body.appendChild(div); } </script> </head> <body style="background: #f4f4f4"> </body>
该页面并列展示多个iframe,每个iframe展示不同详情页面,调用该方法后,加载各个iframe时不需要再设置各个iframe的高度,该方法会自动获取iframe加载完成后的高度值,自适应展示出来