z-index:绝对定位元素位于相对定位元素之下。

5
我正在尝试将一个绝对定位的元素放在一个相对定位的元素下面。由于站点开发的限制,蓝色框必须是相对定位的。
想象一下,一个漫画气泡是蓝色框,气泡的尾巴是:after伪元素。我需要绿色框在这两个元素后面,因为它要为这两个元素提供背景。

div.layer01 {
    background-color: blue;
    position: relative;
    z-index: 10;
}
div.layer01:after {  /* This is the tail of the bubble */
    display: block;
    background-color: red;
    content: '\00a0';
    width: 30px;
    height: 30px;
    position: absolute; 
    right: 20px;
    top: 50px;
    border: 3px #fff solid;
}    

/* This should be behind the tail and the blue box (bubble) */
div.layer01 div.layer02 { 
    background-color: green;
    width: 320px;
    height: 125px;
    display: block;
    position: absolute; 
    z-index: 5;
}
<div class="layer01"> <!-- speech bubble -->
    <div class="layer02">Why isn't this below the blue?</div>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus non dolor quis leo malesuada pharetra at in massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
</div>

修复:

将我想要定位的元素从相对定位的元素中取出,然后将内容包装到一个新的 div 中。虽然增加了标记,但似乎这是唯一可行的方法。


1
您不能将元素放置在其容器下方。请重新考虑布局。 - lorenzo-s
Jared的回答是正确的。采纳他的建议并重构你的标记。有关z-index的更多信息,请参见:http://timkadlec.com/2008/01/detailed-look-at-stacking-in-css/ - Faust
Jared的答案是错误的,并且完全依赖于错误的主张,即常识方法是不明确的。当没有必要时,不要玩hacky游戏。 - John Haugeland
2个回答

8

编辑:我被误导了,负索引是在CSS2.1中引入的。这个解决方案仍然是正确的,尽管我的评论说它是一个hack不正确。

即使是绝对定位的子元素,也不能在其父元素下面,除非你使用hack。

这个hack是从父元素中删除z-index属性,并给子元素一个负的z-index。

http://jsfiddle.net/uZdy3/1/

div.layer01 {
    background-color: blue;
    position: relative;
}
div.layer01:after {  /* This is the tail of the bubble */
    display: block;
    background-color: red;
    content: '\00a0';
    width: 30px;
    height: 30px;
    position: absolute; 
    right: 20px;
    top: 50px;
    border: 3px #fff solid;
}    

/* This should be behind the tail and the blue box (bubble) */
div.layer01 div.layer02 { 
    background-color: green;
    width: 320px;
    height: 125px;
    display: block;
    position: absolute; 
    z-index: -5;
}

最好重构您的布局以避免使用这种hack。

2
z-indexes不应该有负值,并且在不同的浏览器中行为不能保证。 - JaredMcAteer
我会看一下重构代码。谢谢你的回答。 - beingalex
这不是黑客行为,实际上在各种浏览器中都有保证的行为。主机的回答是不正确的。在CSS2中,负Z-Index是不合法的,但它们在CSS2.1中是合法的,这是在此回答撰写约一年前发布的。它们被所有主要的浏览器支持,包括IE4、原始Chrome、Firefox 4、原始Opera和原始Safari。https://developer.mozilla.org/en-US/docs/Web/CSS/z-index - John Haugeland
已经注意到CSS2.1的更新,但是我的解决方案仍然是正确的。 - JaredMcAteer
许多不良的解决方案根据规范严格合法。然而,为什么要这样做而不是语言建议的方式的辩护理由是一种误导,即直接方式在某种程度上是一种“hack”,这实际上并不正确。CSS2从未表示过这是一个坏主意。虽然您的实现策略是合法的,但您给出的答案使用虚假数据来支持其方法,导致了一个极其不良的过于复杂的策略,需要解释(大多数人称之为“hack”)。 - John Haugeland

3

自2011年中期CSS2.1以来,使用负Z-Index是正确的、安全的、合法的做法。这种行为在所有主要浏览器中都得到了良好的支持,包括最初的Chrome、最初的Safari、最初的Opera、IE4和Firefox 3。最后一个支持此功能的浏览器始于2008年。

https://developer.mozilla.org/en-US/docs/Web/CSS/z-index


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