iframe会根据内容自动调整高度而不使用滚动条?

aka*_*hbc 475 html iframe height scrollbar

例如:

<iframe name="Stack" src="http://stackoverflow.com/" width="740"
        frameborder="0" scrolling="no" id="iframe"> ...
</iframe>
Run Code Online (Sandbox Code Playgroud)

我希望它能够根据其中的内容调整其高度,而不使用滚动.

hjp*_*r92 622

将其添加到您的<head>部分:

<script>
  function resizeIframe(obj) {
    obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
  }
</script>
Run Code Online (Sandbox Code Playgroud)

并将您的iframe更改为:

<iframe src="..." frameborder="0" scrolling="no" onload="resizeIframe(this)" />
Run Code Online (Sandbox Code Playgroud)

如在sitepoint讨论中找到的那样.

  • 如果iframe包含来自另一个域的内容,由于[同源策略](http://en.wikipedia.org/wiki/Same_origin_policy),这将无效,还有另一个关于SO的问题,其中包含一些跨域解决方案http:/ /stackoverflow.com/questions/5589756/is-there-a-cross-domain-iframe-height-auto-resizer-that-works (286认同)
  • 他们还需要考虑其他一些问题,iframe中的内容更改,调整大小的浏览器,第一次检查和跨域时iframe未满载.我把一个小库放在一起,因为我找不到涵盖每个问题的解决方案.https://github.com/davidjbradshaw/iframe-resizer (22认同)
  • 应该是`onload ="resizeIframe(this);"`:) (18认同)
  • 如果iframe的内容有js的高度变化(例如滑块),解决方案似乎不起作用 (17认同)
  • 如果iframe的内容在加载后高度增加,可能值得将`scrolling`更改为`auto`. (4认同)

use*_*310 87

您可以使用此库,它最初可以正确地调整iframe的大小,并通过检测iframe内容的大小(通过定期检查setInterval或通过MutationObserver)和调整大小来确保其大小合适.

https://github.com/davidjbradshaw/iframe-resizer

这适用于跨域和相同的域iframe.

  • 注意:当用于跨域时,要求您能够将js文件注入iframe ...当您不控制iframe源时,似乎不是一个可行的选项. (8认同)
  • 它说它支持IE8. (2认同)
  • 这是迄今为止最可靠的解决方案。 (2认同)
  • @RickardElimää 很乐意接受 PR 来修复“vh”。 (2认同)

Cho*_*ang 48

这是一个紧凑版本:

<iframe src="hello.html"
        onload="this.style.height=this.contentDocument.body.scrollHeight +'px';">
</iframe>
Run Code Online (Sandbox Code Playgroud)

  • 我没有尝试过其他浏览器,但我需要在Chrome中添加10px,否则会出现垂直滚动条.我做了'this.style.height =(this.contentDocument.body.scrollHeight + 15)+'px';`只是为了确保它看起来不错. (3认同)
  • 无法正常工作。.阻止源为“ {url}”的框架访问跨域框架。 (2认同)
  • 在 Firefox 上也不在这里工作 (2认同)

小智 41

hjpotter92的建议在safari中不起作用!我对脚本进行了一些小调整,所以它现在也适用于Safari.

只有更改是在每次加载时将高度重置为0,以便使某些浏览器降低高度.

将其添加到<head>标记:

<script type="text/javascript">
  function resizeIframe(obj){
     obj.style.height = 0;
     obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
  }
</script>
Run Code Online (Sandbox Code Playgroud)

并将以下onload属性添加到iframe中,如下所示

<iframe onload='resizeIframe(this)'></iframe>
Run Code Online (Sandbox Code Playgroud)

  • `obj.style.height = 0;`是非常重要的行,导致scrollHeight重新计算(否则,你的contentWindow高度只会增加). (6认同)
  • 你不需要封装`{}`的那些 (4认同)
  • 谢谢,这可能应该是对hjpotter的后记的评论/建议。 (2认同)

Jim*_*ine 14

hjpotter92的答案在某些情况下运行得很好,但我发现iframe内容经常在Firefox和IE中被截屏,而Chrome则很好.

以下适用于我并修复剪辑问题.该代码可在http://www.dyn-web.com/tutorials/iframes/height/找到.我做了一些修改,从HTML中获取了onload属性.将以下代码放在<iframe>HTML之后和结束</body>标记之前:

<script type="text/javascript">
function getDocHeight(doc) {
    doc = doc || document;
    // stackoverflow.com/questions/1145850/
    var body = doc.body, html = doc.documentElement;
    var height = Math.max( body.scrollHeight, body.offsetHeight, 
        html.clientHeight, html.scrollHeight, html.offsetHeight );
    return height;
}

function setIframeHeight(id) {
    var ifrm = document.getElementById(id);
    var doc = ifrm.contentDocument? ifrm.contentDocument: 
        ifrm.contentWindow.document;
    ifrm.style.visibility = 'hidden';
    ifrm.style.height = "10px"; // reset to minimal height ...
    // IE opt. for bing/msn needs a bit added or scrollbar appears
    ifrm.style.height = getDocHeight( doc ) + 4 + "px";
    ifrm.style.visibility = 'visible';
}

document.getElementById('ifrm').onload = function() { // Adjust the Id accordingly
    setIframeHeight(this.id);
}
</script>
Run Code Online (Sandbox Code Playgroud)

您的iframe HTML:

<iframe id="ifrm" src="some-iframe-content.html"></iframe>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您希望<head>在文档中包含Javascript,则可以恢复使用HTML中的内联onload属性iframe,如dyn-web网页中所示.


ryb*_*111 12

避免使用内联JavaScript; 你可以使用一个类:

<iframe src="..." frameborder="0" scrolling="auto" class="iframe-full-height"></iframe>
Run Code Online (Sandbox Code Playgroud)

并使用jQuery引用它:

$('.iframe-full-height').on('load', function(){
    this.style.height=this.contentDocument.body.scrollHeight +'px';
});
Run Code Online (Sandbox Code Playgroud)


Luc*_*cky 7

尝试这个:

<iframe name="Stack" src="http://stackoverflow.com/" style='height: 100%; width: 100%;' frameborder="0" scrolling="no" id="iframe">...</iframe>
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要为一种浏览器编写?许多使用多种操作系统和多种浏览器的人都会查看您的网站。 (5认同)
  • 作品!(在 Chrome、Firefox、Safari、IE 上) (4认同)
  • 高度:100vh 比我这边的 % 效果更好 (2认同)
  • 这只是将 iframe 样式设置为适合 100% 的容器。OP 询问如何使 iframe 适合其内容 - 这意味着 iframe _itself_ 是容器。我认为这个答案并没有真正解决问题。人们只是幸运,有时它会起作用。 (2认同)

Nat*_*ier 6

jQuery的.contents()方法方法允许我们搜索DOM树中元素的直接子元素.

jQuery的:

$('iframe').height( $('iframe').contents().outerHeight() );
Run Code Online (Sandbox Code Playgroud)

请记住,iframe内部页面的主体必须具有高度

CSS:

body {
  height: auto;
  overflow: auto
}
Run Code Online (Sandbox Code Playgroud)

  • 与以前相同的问题,跨源不起作用 (2认同)
  • jQuery的( 'IFRAME')的高度(jQuery的( 'IFRAME')内容()发现( '主体')的高度()...).iframe加载后为我工作 (2认同)

归档时间:

查看次数:

1018319 次

最近记录:

5 年,11 月 前