我有一堆CSS应用于父元素及其子元素:
.parent {
position: fixed;
top: 0px;
}
.el {
position: fixed;
top: 5px;
z-index: 100;
}
.bodycontent {
z-index: 1;
position: relative;
}

<div class="parent">
<div class="el">
<button></button>
</div>
</div>
<div class="bodycontent"></div>
&#13;
制作页面时,滚动时.parent
位于.bodycontent
下方,但.el
位于其上方。这可以解决我在Firefox中的需求,但不适用于Chrome。
有什么建议吗?我尝试过使用不同的z-index
值和不同的position
值但没有成功。
答案 0 :(得分:15)
从版本22 开始,这就是Chrome有意处理fixed
元素堆叠的方式。正如谷歌自己的一篇文章所述:
在Chrome 22中,
position:fixed
元素的布局行为与以前的版本略有不同。现在,所有position:fixed
元素都会形成新的堆叠上下文。这将改变某些页面的堆叠顺序,这可能会破坏页面布局。
Firefox正在按计划运作。 Mozilla文档声明此行为本地化为移动WebKit和Chrome 22以后:
在移动WebKit和Chrome 22+上,position:fixed总是创建一个新的堆叠上下文,即使z-index是“auto”
(https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context)
此更改的结果意味着,即使父容器的z-index
设置为auto
(默认值),Chrome也会始终创建新的堆叠上下文。这与position: absolute;
和position: relative;
不同,因为当z-index
未设置为auto
时,它们仅形成自己的堆叠上下文。
页面上的大多数元素都在单个根堆叠上下文中,但是具有非自动
z-index
值的绝对或相对定位的元素形成了它们自己的堆叠上下文(也就是说,它们的所有子元素都将是z-在父级内排序,而不是与父级外部的内容交错)。从Chrome 22开始,position:fixed
元素也会创建自己的堆叠上下文。
这意味着,在您的示例中,.el
的{{1}}相对于其父z-index
进行计算。它显示在.parent
下,因为:
.bodycontent
的{{1}}相对于根.bodycontent
的{{1}}与z-index
.el
的{{1}}相对于根z-index
的{{1}}未指定,因此设置为默认.parent
(实际上为.parent
)z-index
的{{1}}低于.parent
,因此显示在z-index
下方。由于auto
属于它,因此它也显示在0
。
.parent
z-index
上述代码将在Chrome和Firefox中产生以下结果:
Chrome似乎没有遵循W3C规范,并且进行了此更改,以便桌面实施与移动设备实现相匹配:
移动浏览器(移动Safari,Android浏览器,基于Qt的浏览器)将位置:固定元素放置在自己的堆叠上下文中并且有一段时间(因为iOS5,Android Gingerbread等),因为它允许某些滚动优化,使得网页对触摸的响应速度更快。由于三个原因,这一变化正在进入桌面:
1 - 在“移动”和“桌面”浏览器上具有不同的呈现行为是网络作者的绊脚石;在可能的情况下,CSS应该在任何地方都一样。
2 - 对于平板电脑,不清楚哪种“移动”或“桌面”堆叠上下文创建算法更合适。
3 - 将滚动性能优化从移动设备优化到桌面设备对用户和作者都有好处。
Firefox正在以正确的方式处理堆叠。
可以绕过这种行为的唯一方法是将.bodycontent
移出.el
,而不是让它成为兄弟姐妹:
.bodycontent
body {
margin: 0;
}
div {
height: 100px;
width: 100px;
}
.parent {
background-color: red;
position: fixed;
top: 0;
}
.el {
background-color: blue;
left: 25px;
position: fixed;
top: 25px;
z-index: 100;
}
.bodycontent {
background-color: green;
left: 50px;
position: relative;
top: 50px;
z-index: 1;
}