2014-10-11 16 views
1

我有一个关于z-index属性的奇怪行为的问题。在术语或层的情况如下:避免z-index相对于父元素工作

div#wrapper 
    div#sidebar (fixed position and 5 as z-index) 
     div#pop-up (absolute position and 15 as z-index) 
div#black-layer (fixed position and 10 as z-index) 

的事情,然后是我想拥有了一切半透明黑色层,下一个例外:在这我想其他的任意格(视案子)。有点像典型的灯箱。

现在发生的事情是,弹出框应该位于黑色层之上,因为它们的z-索引更高,实际上是在它之下。

我在几次尝试之后得出的结论是,这种情况发生的原因是因为#弹出窗口是#sidebar的子窗口。事实上,如果我把它放在外面,它就像我假装一样。像:

div#wrapper 
    div#sidebar 
    div#pop-up 
div#black-layer 

但是,这不是一个好的解决方案。首先,因为从HTML的角度来看,它在语义上是不正确的。另外,因为我有必要在代码的其他部分添加更多的“弹出窗口”,并且不是一个好主意,因此通过分开保存所有这些方法来分割逻辑。

谢谢你的优势。

更新:现在更奇怪了。我没有改变任何东西,只是在Firefox而不是Chrome上进行测试,并且按照我的预期在那里工作,所以弹出窗口实际上是在黑色层。而且在Opera中。在傲游中不起作用。就像一个笔记,我正在使用Linux。

+0

通常处理的方式是,当显示弹出窗口时,它的内容从它所在的位置移动(或复制)到(通常是一个)“body”元素驻留容器,该容器用于创建覆盖。内容的“语义”与标记有关,而不是内容的DOM表示。所以你没有通过这样做打破任何语义规则。 – 2014-10-11 13:16:25

+1

请参阅:https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context♦http://www.w3.org/TR/CSS21/zindex.html – 2014-10-11 13:40:37

+0

我不同意你,杰瑞德。语义也与HTML元素的父子关系有关。例如,有一个

标签是不正确的,但将主要内容放置在它外面。关于复制的想法,如果我不关心弹出窗口的位置(如果它是固定的并且与屏幕相关的),那么可以,但是如果你想要的话,我不认为这是一个解决方案以保持元素相对于其父元素的位置(我希望弹出元素位于侧边栏的底部)。 – DanielM 2014-10-11 14:54:56

回答

3

现在发生的事情是,弹出窗口应该在黑色层以上,因为他们的z-索引更高,实际上是在它之下。

因为它应该是完美的。 z-indexperfectly well defined,例如在this part of the spec

每个框属于一个堆叠内容。给定堆叠上下文中的每个定位框在 中都有一个整数堆栈级别,它是相对于同一个 堆栈上下文中的其他堆栈级别在z轴上的位置。具有较高堆叠等级的盒子总是在具有较低堆叠等级的盒子前格式化为 。盒子可能有负数 堆栈级别。根据文档树的顺序,在堆叠环境 中具有相同堆栈级别的框按照先后顺序堆叠。

根元素形成根堆栈上下文。其他堆栈 上下文由具有除“ ”auto之外的'z-index'的计算值的任何定位元素(包括相对定位元素的相对 )生成。堆叠上下文不一定与包含 块有关。

在每个堆叠上下文中,下面的层被涂在背面 到前序:

  1. 背景和形成堆叠环境的元素的边界。
  2. 孩子堆叠负面堆栈级别的情况下(最负面的第一个)。
  3. 流入式,非内联式,非定位后代。
  4. 非定位花车。
  5. 流入内联级别的未定位后代,包括内联表和内联块。
  6. 子堆叠堆栈级别为0的上下文以及堆栈级别为0的定位后代。
  7. 子堆叠正堆栈级别(最不积极优先)的上下文。

你错误地认为Z-索引整个文档之间共享,而他们只是自己的堆叠环境,这实际上是为每一个Z-索引元素创建内有效 - 因此你#popup是最高的元素#sidebar,但两者都堆叠在#black-layer之下,因为它在根堆栈上下文中更高。旧版本的IE(以怪癖模式)实际上使用了您期望的模型,但稍后会修复此模型。

所以,你需要移动一些元素。从语义上讲,这根本就没有关系,因为无论如何,您需要JS来在实践中克隆/生成弹出窗口。

+0

谢谢你的评论,尼尔斯。我最终通过将侧边栏向左侧移动而不是将其固定在同一位置并添加一个位置来解决问题:相对于此位置。然后侧边栏页脚可以相对于侧栏正确定位(位置:绝对),并且z-index属性正常工作,因为所有元素都处于相同的堆叠环境中 - 如果我理解的很好。 – DanielM 2014-10-12 12:03:09

+0

为了完成我的回答(尽管我避开了最初的问题,真的,这就是为什么我不发布答案本身),我后来发现问题,如果你不修复侧边栏,那么当主要内容增长,滚动时边栏不会“跟随你”。我处理这个问题的方法是将主要内容设置为100%高度,并使溢出-y上的滚动,所以现在我们正在考虑主要内容,因为它是整个窗口。 – DanielM 2014-10-13 19:01:49

+0

我不太了解你的第二条评论。我确实认识到侧边栏看起来不会增长。 – 2015-05-13 21:32:41

相关问题