我有一个默认位置为div
(即position:static
)的div
和一个默认位置为fixed
的div
。
如果我设置元素的z索引,似乎不可能使固定元素位于静态元素之后。
#over {
width: 600px;
z-index: 10;
}
#under {
position: fixed;
top: 5px;
width: 420px;
left: 20px;
border: 1px solid;
height: 10%;
background: #fff;
z-index: 1;
}
<div id="over">
Hello Hello HelloHelloHelloHelloHello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello
</div>
<div id="under"></div>
或者在jsfidle上点击这里:http://jsfiddle.net/mhFxf/
我可以通过在静态元素上使用position:absolute
来解决这个问题,但是有人能告诉我 * 为什么 * 会发生这种情况吗?
(似乎有一个类似的问题,(Fixed Positioning breaking z-index),但它没有一个令人满意的答案,因此我在这里用我的示例代码问这个问题)
8条答案
按热度按时间vhmi4jdf1#
将
position: relative
添加到#over
,如以下代码段所示:Fiddle
kmynzznz2#
这个问题可以用很多方法来解决,但实际上,了解堆叠规则可以让您找到适合您的最佳答案。
溶液
<html>
元素是您唯一的堆叠上下文,因此只需遵循堆叠上下文中的堆叠规则,您将看到元素按此顺序堆叠1.堆栈上下文的根元素(本例中为
<html>
元素)1.具有负z索引值的定位元素(及其子元素)(较高值堆叠在较低值之前;具有相同值的元素根据HTML中的外观进行堆叠)
1.未定位元素(按HTML中的外观排序)
1.具有正z索引值的定位元素(及其子元素)(较高的值堆叠在较低的值前面;具有相同值的元素根据HTML中的外观进行堆叠)
所以你可以
1.将z-index设置为-1,对于定位的
#under
-ve z-index出现在未定位的#over
元素后面1.将
#over
的位置设置为relative
,以便规则5应用于它真正的问题
<html>
元素是根元素,并且是第一个堆栈上下文The Stacking order and stacking context rules below are from this link
堆叠上下文形成时
<html>
元素)堆叠上下文中的堆叠顺序
元素的顺序:
<html>
元素是唯一的堆栈上下文,但任何元素都可以是堆栈上下文的根元素,请参阅上面的规则)uqzxnwby3#
由于
over
div没有定位,z-index不知道在哪里以及如何定位它(相对于什么?)。只需将上div的位置更改为相对,这样就不会对该div产生副作用,然后下div将服从您的意愿。这是你的example on jsfiddle。
zqry0prt4#
z-index仅在特定上下文中起作用,即
relative
、fixed
或absolute
位置。相对div的z-index与绝对或固定div的
z-index
无关。vql8enpb5#
为
#under
指定一个负的z-index
,例如-1
发生这种情况是因为
z-index
属性在position: static;
中被忽略,而z-index
恰好是默认值;所以在您编写的CSS代码中,无论您在#over
中将其设置为多高,z-index
对于两个元素都是1
。通过给
#under
一个负值,它将在任何z-index: 1;
元素之后,即#over
。xtfmy6hx6#
我在建一个导航菜单。我在导航菜单的css中有
overflow: hidden
,它隐藏了所有的东西。我以为是z轴的问题,但实际上我隐藏了导航菜单之外的所有东西。jvlzgdj97#
当元素位于正常流之外时,它们可以与其他元素重叠。
根据http://web.archive.org/web/20130501103219/http://w3schools.com/css/css_positioning.asp上的重叠元素部分
00jrzges8#
CSS规范中定义的固定元素(和绝对元素)的行为:
它们的行为就像是从文档中分离出来,并放置在最近的固定/绝对位置的父文档中。(不是逐字引用)
这使得zindex的计算有点复杂,我通过在body元素中动态创建一个容器并移动所有这样的元素(在body元素中被分类为“my-fixed-ones”)来解决我的问题(同样的情况)