绝对定位内部的绝对定位

104

我有3个div元素。

第一个div更大(包裹)且具有position:relative;

第二个div相对于第一个div进行绝对定位(并包含在第一个div中)

第三个div包含在第二个div中,也具有绝对定位。

<div id="1st">
   <div id="2nd">
     <div id="3rd"></div>
   </div>
</div>
为什么第三个 div 的定位是相对于第二个 div(第二个 div也是相对于第一个具有相对定位的 div),而不是相对于第一个具有相对定位的 div
因为第三个 div 是相对于已经绝对定位的第二个 div 定位的。

这真的是我正在寻找的东西,而您对问题的回答让我大开眼界。: - Benjamin
absolute:该元素相对于其第一个已定位的(而非静态的)祖先元素进行定位。 - Oswaldo Zapata
6个回答

108

因为position: absoluteposition: relative一样,会重置子元素的相对位置。

没有绕过这个问题的方法——如果您想要第三个div相对于第一个div进行绝对定位,那么您必须将它设为第一个div的子元素。


所以基本上绝对定位的父级元素对于其绝对定位的子元素来说会变成相对定位? - pufos
@pufos 有点。子元素的“0px / 0px”位置会被“position: absolute”重置。 - Pekka
29
我会尽力为您翻译内容。@pufos,我认为您有些混淆了。 position: relative 的意思是该元素将通过使用 top、right、bottom 和 left 相对于其当前位置进行定位。而 position: absolute 的意思是该元素将相对于浏览器窗口或第一个具有 position: absoluteposition: relative 的父元素进行定位。我的翻译是否清晰易懂? - seler
你能分享一下这个在线参考资料的链接吗?因为我找不到... 谢谢! - pufos
2
@pufos,非常基本的参考文献在这里:http://www.w3.org/TR/CSS2/visuren.html#choose-position - Pekka
@seler - 这是一个非常简洁的解释。 - Adam Tolley

33

position:relativeposition:absolute都会将其包含元素作为定位祖先。

如果你需要基于div 1定位div 3,则让它成为div 1的直接子元素。

请注意,position: relative表示元素相对于其自然位置定位,而position: absolute表示元素相对于其第一个具有position: relativeposition: absolute属性的祖先元素进行定位。


我想让第三个div相对于绝对定位的div进行绝对定位,但我不知道这是否是标准(跨浏览器)... 我在网上找不到规范... 非常感谢。 - pufos
该部分中的绝对定位:http://www.w3.org/TR/CSS21/visuren.html#comp-abspos - Mike Tunnicliffe
@MikeTunnicliffe absolute 意味着元素相对于其最初位置定位:fixed 也是如此。 - Trần Kim Dự

15

静态定位:如果一个元素没有指定定位属性,那么它在 HTML 文件中的默认位置称为静态位置。

重要提示:在静态定位元素上,toprightbottomleft 属性无效。

相对定位:将元素定位属性设置为相对定位会使该元素(及其所占用的空间)保留在 HTML 文件的正常流程中。

您可以使用属性 leftrighttopbottom 将元素移动一定距离。但是,这可能导致该元素与页面上的其他元素重叠,这可能是您想要的效果,也可能不是。

相对定位的元素可以移动,但是它所占用的空间仍然在原处。

绝对定位:将元素的定位属性设置为绝对定位可将其从正常流程中移除。当您移动绝对定位的元素时,其参考点是最近的具有非静态定位声明的包含元素的左上角,也称为最近的定位上下文。因此,如果不存在具有非静态定位的包含元素,则它将从 body 元素的左上角定位。

在您的情况下,第三个元素的最近包含容器是第二个元素。


6

再次给您一个明确的答案。

您当前的情况是这样的:

#my-parent {position: absolute}
#my-parent .my_child {position: absolute}

如果你对此感到困惑,这里提供一些帮助:

如果你可以修改HTML,只需按照以下步骤进行:

#my-parent {position: absolute}
#my-parent .my-wrapper {position: relative}        /* Since you've added the wrapper in HTML */
#my-parent .my-wrapper .my-child {position: absolute}  /* Now you can play with it */

2
我的包装器应该是 .my-wrapper。 - jdavid.net
这种方法非常棒,但我仍然不知道为什么它解决了我的问题。我的问题是,由于某些其他原因,我不能让我的第三个元素成为第一个元素的子元素。 - windmaomao

3
第��个 div 元素绝对定位到第二个 div 元素的原因是,根据 CSS 规范在这里解释的那样(链接)绝对定位元素的“父”元素(更好的说法是:包含块)不一定是它的直接父元素,而是它的直接定位元素,即任何其位置设置为除 static 以外的值的元素,例如 position: relative/absolute/fixed/sticky;

因此,在您的代码中只要可能,如果您想让第三个 div 元素相对于第一个 div 元素绝对定位,您应该将第二个 div 元素设置为 position: static;,这是它的默认值(或者只需在第二个 div 元素的规则集中简单地删除任何 position: ... 声明)。

上述方法将使第一个 div 成为第三个绝对定位 div包含块,在此定位目的上忽略第二个 div

希望这有所帮助。


你所提到的,在这里精确的URL链接,谢谢这正是我要找的。 - devstefancho

0
如果还有人在寻找答案,我能够通过为第一个绝对定位的 div 添加 clear: both; 样式来实现这个结果,这样可以重置子元素并允许其使用自己的 absolute 定位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接