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加載完成后的高度值,自適應展示出來