【问题标题】:CSS to make an iframe take the rest of the height of the page?CSS 使 iframe 占据页面的其余高度?
【发布时间】:2009-11-17 23:02:40
【问题描述】:

如果我有这样的事情:

<p>Element<p>
<iframe src = "otherPage.html" style = "width:100%;height:100%">
</iframe>

iframe 超出页面。由于各种原因,我无法指定绝对高度。使元素使用其容器元素的剩余高度的正确 CSS 方法是什么?一个快速的谷歌搜索声称这是不可能的,但肯定有一个解决方法。这里的内部 iframe 有一个渐变,由于 IE 无法显示清晰的 iframe 背景,它必须占据页面的其余部分。

想法?

【问题讨论】:

  • 我建议使用替代方法在您的页面上包含外部内容。据我所知,搜索引擎并未将 IFrame 编入索引,有些用户甚至可能完全禁用了框架。
  • 我建议使用&lt;table&gt; 标签。在 CSS 中没有干净的方法可以做到这一点,而 javascript 解决方案是......有点像试图用大锤压扁一个错误。
  • @Eirik:我愿意,但是 Linux 已经损坏,并且在我的页面加载时往往会导致 firefox 崩溃,但前提是启用了 SELinux 或类似的防火墙策略。使用 iframe 来模拟我之前进行的 ajax 调用,我不会崩溃。
  • @Duroth:你会如何使用表格标签?我没有看到 1:1。

标签: html css xhtml iframe


【解决方案1】:

这个问题重复了很多次:)

您可以使用 javascript 实现此目的:

此脚本取自 Dynamic Drive 并进行了修改: (请记住指定
var iframeids = ["Whatever frame id's you want to auto-resize seperated by ,"]

<script type="text/javascript" language="javascript">

    /***********************************************
    * IFrame SSI script II- © Dynamic Drive DHTML code library (http://www.dynamicdrive.com)
    * Visit DynamicDrive.com for hundreds of original DHTML scripts
    * This notice must stay intact for legal use
    ***********************************************/

    //Input the IDs of the IFRAMES you wish to dynamically resize to match its content height:
    //Separate each ID with a comma. Examples: ["myframe1", "myframe2"] or ["myframe"] or [] for none:
    var iframeids = ["contentFrame"]

    //Should script hide iframe from browsers that don't support this script (non IE5+/NS6+ browsers. Recommended):
    var iframehide = "no"

    var getFFVersion = navigator.userAgent.substring(navigator.userAgent.indexOf("Firefox")).split("/")[1]
    var FFextraHeight = parseFloat(getFFVersion) >= 0.1 ? 16 : 0 //extra height in px to add to iframe in FireFox 1.0+ browsers

    function resizeCaller() {
        var dyniframe = new Array()
        for (i = 0; i < iframeids.length; i++) {
            if (document.getElementById)
                resizeIframe(iframeids[i])
            //reveal iframe for lower end browsers? (see var above):
            if ((document.all || document.getElementById) && iframehide == "no") {
                var tempobj = document.all ? document.all[iframeids[i]] : document.getElementById(iframeids[i])
                tempobj.style.display = "block"
            }
        }
    }

    function resizeIframe(frameid) {
        var currentfr = document.getElementById(frameid)
        if (currentfr && !window.opera) {
            currentfr.style.display = "block"
            if (currentfr.contentDocument && currentfr.contentDocument.body.offsetHeight) //ns6 syntax
                currentfr.height = currentfr.contentDocument.body.offsetHeight + FFextraHeight;
            else if (currentfr.contentDocument && currentfr.contentDocument.documentElement.offsetHeight) //ns6 syntax
                currentfr.height = currentfr.contentDocument.documentElement.offsetHeight + FFextraHeight;
            else if (currentfr.Document && currentfr.Document.body.scrollHeight) //ie5+ syntax
                currentfr.height = currentfr.Document.body.scrollHeight;
            else if (currentfr.Document && currentfr.Document.documentElement.scrollHeight) //ie5+ syntax
                currentfr.height = currentfr.Document.documentElement.scrollHeight;
            if (currentfr.addEventListener)
                currentfr.addEventListener("load", readjustIframe, false)
            else if (currentfr.attachEvent) {
                currentfr.detachEvent("onload", readjustIframe) // Bug fix line
                currentfr.attachEvent("onload", readjustIframe)
            }
        }
    }

    function readjustIframe(loadevt) {
        var crossevt = (window.event) ? event : loadevt
        var iframeroot = (crossevt.currentTarget) ? crossevt.currentTarget : crossevt.srcElement
        if (iframeroot)
            resizeIframe(iframeroot.id);
    }

    function loadintoIframe(iframeid, url) {
        if (document.getElementById)
            document.getElementById(iframeid).src = url
    }

    if (window.addEventListener)
        window.addEventListener("load", resizeCaller, false)
    else if (window.attachEvent)
        window.attachEvent("onload", resizeCaller)
    else
        window.onload = resizeCaller

</script>

link text

【讨论】:

  • 这是有史以来最糟糕的解决方案。
  • 是的,同意!但是我认为不可能在 CSS 中做到这一点并使其跨浏览器兼容:/
  • ...是的。这就是为什么我给了你接受,但我拒绝投票!如果我能在不反对的情况下投票,我会的!
猜你喜欢
  • 2013-11-29
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
相关资源
最近更新 更多