IFRAME 和冲突的绝对位置

Posted

技术标签:

【中文标题】IFRAME 和冲突的绝对位置【英文标题】:IFRAME and conflicting absolute positions 【发布时间】:2011-04-28 02:21:48 【问题描述】:

我想使用以下 CSS 动态调整 IFRAME:

#myiframe 
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;

但是,似乎没有浏览器支持这一点。

在好的浏览器中,我可以用引用的 CSS 样式将 IFRAME 包装在 DIV 中,并将 IFRAME 的高度和宽度设置为 100%。但这在 IE7 中不起作用。没有使用 CSS 表达式,有没有人设法解决这个问题?

更新

MatTheCat 回答了一个场景,如果 IFRAME 直接位于 body 下方并且 body/html 标签设置了 height: 100%,则该场景有效。在我最初的问题中,我没有说明 IFRAME 在哪里以及应用于它的容器的样式。希望以下内容能解决这个问题:

<html>
    <body>
        <div id="container"><iframe id="myiframe"></iframe></div>
    </body>
</html>

让我们假设以下容器 CSS:

#container 
    position: absolute;
    top: 10px;
    bottom: 10px;
    left: 10px;
    right: 10px;

如果您现在将 height: 100% 放在 IFRAME 上,它将无法正确调整大小。

【问题讨论】:

我建议您在这里“接受”两个最新答案之一,因为两者都回答了这个问题。我获得了赏金。 【参考方案1】:

你可以试试这个:

document.getElementsByTagName('iframe')[1].style.borderWidth = '0px';
document.getElementsByTagName('iframe')[1].style.backgroundColor = 'green';

【讨论】:

【参考方案2】:

使用 div 填充所有边。使用 100% 的父 div 将 iframe 放入其中。

http://jsfiddle.net/sg3s/j8sbX/

现在您需要记住几件事。 iframe 最初是一个内联框架,所以尽管现代浏览器不在乎,但在其上设置 display:block。默认情况下,它也有一个边框。我们想要完成的任何样式都需要在 iframe 容器上完成,否则我们将打破 100% 的容器边界。

这就是我们如何在它上面放置一个元素:

http://jsfiddle.net/sg3s/j8sbX/25/(编辑:我的错,你实际上需要在 IE7 的 iframe 上设置border=0)

在 IE7+ 中应该可以正常工作(IE6 不喜欢绝对定位 + 使用 top/right/bottom/left 来给它布局)

编辑一些额外的解释

我们需要设置 iframe 容器的样式,主要是因为 iframe 本身不会让自己的大小与上/左/下/右一起调整。但可行的是将其宽度和高度设置为 100%。因此,从那里开始,我们只需将 iframe 包装在一个元素中,我们可以可靠地设置该元素的样式以使其小于 100% 的窗口,即当父元素都没有静态高度/宽度时元素默认的大小。

考虑一下,我们实际上可以放弃绝对和阻塞。 http://jsfiddle.net/sg3s/j8sbX/26/ 可能想要再次检查 IE7。

在我们将 iframe 设置为 100% 高和宽后,我们不能在其上放置任何边距、填充或边框,因为这将添加到已经 100% 的高度和宽度中。因此使其大于其容器,对于会导致溢出的 div:可见,只是显示所有超出边缘的内容。但这反过来又会弄乱我们为元素提供的边距、填充和偏移量......事实上,要使其只有 100% 的高度和宽度,您必须确保删除了 iframe 的默认边框。

通过在我的示例中向 iframe 添加更大的边框(如 3px)来尝试一下,您应该很容易看到它是如何影响布局的。

【讨论】:

这行得通。我唯一缺少的是iframe 上的position: absolute。你能解释一下为什么我需要将iframe 包装在一个容器中而不是把容器的 CSS 放在它上面吗?即使在申请display: block...【参考方案3】:

为什么不使用高度和宽度?您仍然可以通过设置上/下和左/右来获得绝对位置,如下例所示。

<!DOCTYPE HTML>
<html>
    <head>
        <style type="text/css">
            html, body 
                margin:0;
                padding:0;
                border:0px;
                height:100%;
                width:100%;
            
            #container 
                position: absolute;
                top: 10px;
                bottom: 10px;
                left: 10px;
                right: 10px;
            
            #myiframe 
                position: absolute;
                top: 0%;
                left: 0%;
                height: 100%;
                width: 100%;
            
        </style>
    </head>
    <body>
        <div id="container"><iframe id="myiframe"></iframe></div>
    </body>
</html>

这对我有用(在 IE9 上测试)。

【讨论】:

这行得通。我唯一缺少的是iframe 上的position: absolute。你能解释一下为什么我需要将iframe 包装在一个容器中而不是把容器的 CSS 放在上面吗? 把容器的CSS放在iframe上是什么意思?如果你说的是不使用容器,那么 body 元素(父元素)默认成为它的容器。 我们仍然可以通过改变iframe 上的topleftheightwidth 参数来获得相同的效果。 @Sathvik 不,我们不能。包装div在这里是必须的。【参考方案4】:

我想说看看这个堆栈溢出问题。它可能会有所帮助:

Make Iframe to fit 100% of container's remaining height

【讨论】:

【参考方案5】:
html,body 
    margin:0;
    padding:0;
    height:100%;
    min-height:100%;

#myiframe 
    width:100%;
    height:100%;
    border:0;

即使使用 IE7 也能正常工作。

【讨论】:

感谢您的回答。不幸的是,我在这个问题上不够具体。我已经对其进行了更详细的修改。

以上是关于IFRAME 和冲突的绝对位置的主要内容,如果未能解决你的问题,请参考以下文章

绝对位置冲突

JS绝对位置与我的div冲突

php 隐藏recaptcha iframe并禁用提交按钮,直到电子邮件字段为有效电子邮件。同样绝对定位以避免风格冲突。

JS如何判断元素相对于父窗口的绝对位置?

javascript中如可控制iframe的滚动条位置

javascript中如可控制iframe的滚动条位置