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

IT技术 javascript html iframe height scrollbar
2021-01-09 23:53:05

例如:

<iframe name="Stack" src="http://stackoverflow.com/" width="740"
        frameborder="0" scrolling="no" id="iframe"> ...
</iframe>

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

6个回答

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

<script>
  function resizeIframe(obj) {
    obj.style.height = obj.contentWindow.document.documentElement.scrollHeight + 'px';
  }
</script>

并将您的 iframe 更改为:

<iframe src="..." frameborder="0" scrolling="no" onload="resizeIframe(this)" />

正如在站点讨论中发现的那样

如果 iframe 的内容通过 js(例如滑块)改变了高度,则解决方案似乎不起作用
2021-03-17 23:53:05
如果 iframe 由于同源策略而包含来自另一个域的内容,这将不起作用,还有另一个关于 SO 的问题,有一些跨域解决方案 stackoverflow.com/questions/5589756/...
2021-03-21 23:53:05
也许改变scrollingauto万一iframe的内容加载后增加高度。
2021-03-22 23:53:05
应该是onload="resizeIframe(this);":)
2021-04-08 23:53:05
它们是您需要考虑的其他一些问题,iframe 中的内容更改、浏览器调整大小、首次检查 iframe 和跨域时 iframe 未完全加载。我整理了一个小库,因为我找不到涵盖所有问题的解决方案。 github.com/davidjbradshaw/iframe-resizer
2021-04-09 23:53:05

您可以使用这个库,它既可以正确调整 iframe 的大小,也可以通过检测 iframe 内容的大小何时发生变化(通过定期检查 asetInterval或 via MutationObserver)并调整其大小来将其保持在正确的大小

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

他们也是 React 版本。

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

这适用于跨域和同域 iframe。

注意:当用于跨域时,要求您能够将 js 文件注入 iframe...当您不控制 iframe 源时,这似乎不是一个可行的选择。
2021-03-15 23:53:05
对我来说它没有用
2021-03-15 23:53:05
这个库中的一个主要错误是它无法处理vh.
2021-03-16 23:53:05
@RickardElimää 很乐意接受 PR 来修复vh
2021-03-16 23:53:05
这是迄今为止最强大的解决方案。
2021-03-31 23:53:05

这是一个紧凑的版本:

<iframe src="hello.html" sandbox="allow-same-origin"
        onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';">
</iframe>
我没有在其他浏览器上试过这个,但我需要用 Chrome 添加 10px 否则会出现垂直滚动条。我这样做this.style.height=(this.contentDocument.body.scrollHeight + 15) + 'px';只是为了确保它看起来没问题
2021-03-15 23:53:05
不工作.. 访问跨源框架时阻止了源为“{url}”的框架。
2021-03-26 23:53:05
两者都可以。试试他们。
2021-03-31 23:53:05
这个解决方案添加了“max-height:400px !important;”来修复最大高度,这对我来说是完美的。
2021-04-04 23:53:05
它应该是 onload="this.style.height = this.contentWindow.document.body.scrollHeight + 'px';"
2021-04-05 23:53:05

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>

并将以下onload属性添加到您的 iframe,就像这样

<iframe onload='resizeIframe(this)'></iframe>
谢谢,这可能应该是对 hjpotter 后记的评论/建议...
2021-03-13 23:53:05
首先将高度设置为零不仅适用于 IE。
2021-03-23 23:53:05
你不需要那些封装{}
2021-03-23 23:53:05
obj.style.height = 0; 是非常重要的行,会导致 scrollHeight 重新计算(否则,您的 contentWindow 高度只会增加)。
2021-03-30 23:53:05
如果 iframe 内容来自 srcdoc 属性,这也不起作用。高度将设置错误。
2021-04-04 23:53:05

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>

您的 iframe HTML:

<iframe id="ifrm" src="some-iframe-content.html"></iframe>

请注意,如果您更喜欢<head>在文档中包含 Javascript,那么您可以恢复使用HTML 中的内联onload属性iframe,就像在dyn-web网页中一样。

这是唯一对我有用的方法。太感谢了!
2021-03-31 23:53:05