6 ways to make iframes highly adaptive

Original link: http://caibaojian.com/iframe-adjust-content-height.html

JS adaptive height, in fact, is to set the height of the iframe so that it is equal to the height of the embedded web page, so that scroll bars and nested traces cannot be seen. It plays an important role in the user experience and the aesthetics of the website.

If the content is fixed, then we can directly define a height for it through CSS , which can also achieve the above requirements. When the content is unknown or changing. At this time, there are several situations.

The iframe content is unknown and highly predictable

At this point, we can add a default CSS min-height value to it, and then use JavaScript to change the height at the same time. Commonly used compatible codes are:


// 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'));
};

demo address

Demo 1 (if information is exchanged between different subdomains under the same top-level domain name, set document.domain="caibaojian.com" ·

Just modify the ID of the above iframe. Or you can write the code directly in the iframe, we generally recommend using the above code in order not to pollute the HTML code.

//code from http://caibaojian.com/iframe-adjust-content-height.html
<iframe src="backtop.html" frameborder="0" scrolling="no" id="external-frame" onload="setIframeHeight(this)"></iframe>

demo two

In the case of multiple iframes

<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>

demo three

Called against the ID of a known iframe

function iframeAutoFit(iframeObj){
setTimeout(function(){if(!iframeObj) return;iframeObj.height=(iframeObj.Document?iframeObj.Document.body.scrollHeight:iframeObj.contentDocument.body.offsetHeight);},200)
}

demo four

iframe height adaptive when content width changes

<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>

Demo five

Open the debug run window to see the run.

iframe adaptive height under cross domain

When cross-domain, due to the same-origin policy of js, the js in the parent page cannot obtain the height of the iframe page. Requires a page to act as a proxy.
The method is as follows: Suppose a page a.html under www.a.com contains a page c.html under www.b.com.
We use another page agent.html under www.a.com as an agent, get the height of the iframe page through it, and set the height of the iframe element.

a.html contains iframe:

<iframe src="http://www.b.com/c.html" id="Iframe" frameborder="0" scrolling="no" style="border:0px;"></iframe>

Add the following code to c.html:

<iframe id="c_iframe"  height="0" width="0"  src="http://www.a.com/agent.html" style="display:none" ></iframe>
<script type="text/javascript">
(function autoHeight(){
var b_width = Math.max(document.body.scrollWidth,document.body.clientWidth);
var b_height = Math.max(document.body.scrollHeight,document.body.clientHeight);
var c_iframe = document.getElementById("c_iframe");
c_iframe.src = c_iframe.src + "#" + b_width + "|" + b_height;  // 这里通过hash传递b.htm的宽高
})();
</script>

Finally, put a section of js in agent.html:

<script type="text/javascript">
var b_iframe = window.parent.parent.document.getElementById("Iframe");
var hash_url = window.location.hash;
if(hash_url.indexOf("#")>=0){
var hash_width = hash_url.split("#")[1].split("|")[0]+"px";
var hash_height = hash_url.split("#")[1].split("|")[1]+"px";
b_iframe.style.width = hash_width;
b_iframe.style.height = hash_height;
}
</script>

agent.html gets the width and height values ​​from the URL, and sets the height and width of the iframe (because agent.html is under www.a.com, it is not subject to the same-origin restriction of JavaScript when operating a.html)

demo six


Source: Front-End Development Blog

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324647624&siteId=291194637