CSS浮点数和位置的原因不明的堆叠:相对

时间:2017-04-04 17:40:43

标签: html css css-float css-position z-index

如果我有一个浮动的<div id='1' style='float:right;'>controls and links</div>后跟一个<div id='2' style='position:relative;'>lorem ipsum text here...</div>,那么&lt; div&gt; #2位于&lt; div&gt;之上#1,阻止任何鼠标交互。 (如果&lt; div&gt;#2具有纯色背景颜色,则它会完全隐藏&lt; div&gt;#1,但仍然&#34;包围&#34;围绕&lt; div&gt;#1。)为什么会这样?

即使我在两者上都设置z-index值,尝试强制浮动的&lt; div&gt;也是如此。 #1到顶部。

有四种情况可供考虑。我已将它们全部放入this JSFiddle。 (JSFiddle也使用不透明度来说明堆叠。)

  1. Floated&lt; div&gt; #1没有z-index或position;以下&lt; div&gt; #2也没有z-index或position。 结果:&lt; div&gt; #1堆叠在&lt; div&gt;的顶部#2,鼠标交互很好。
  2. Floated&lt; div&gt; #1没有z-index或position; &LT; DIV&GT; #2也没有z-index但有position:relative结果:&lt; div&gt; #2堆叠在&lt; div&gt;的顶部#1。无法与鼠标进行交互。
  3. Floated&lt; div&gt; #1有z-index:1000但没有位置;以下<div>#2包含z-index:0position:relative结果:&lt; div&gt; #2仍然堆放在&lt; div&gt;的顶部#1。无法与鼠标进行交互。
  4. Floated&lt; div&gt; #1有z-index:1000position:relative;以下&lt; div&gt; #2有z-index:0position:relative结果:&lt; div&gt; #1堆叠在&lt; div&gt;的顶部#2,鼠标交互很好。
  5. 我已经看过一些类似的SO问题,但没有一个能够解决这个问题。我还阅读了一些CSS浮动和定位文章,但似乎都没有解决这个问题。

2 个答案:

答案 0 :(得分:2)

在处理堆叠订单时,我建议您仔细阅读section 9.9 of CSS2中的以下列表:

  

在每个堆叠上下文中,以下按顺序绘制以下图层:

     
      
  1. 构成堆叠背景的元素的背景和边框。
  2.   
  3. 子堆叠上下文具有负堆栈级别(最多为负数)。
  4.   
  5. 流入的,非内联级别,未定位的后代。
  6.   
  7. 未定位的花车。
  8.   
  9. in-flow,内联级别,非定位后代,包括内联表和内联块。
  10.   
  11. 堆叠级别为0的子堆叠上下文和堆栈级别为0的已定位后代。
  12.   
  13. 具有正堆栈级别的子堆叠上下文(最少积极的第一个)。
  14.   

首先,您需要记住两件事:

  1. z-index对非定位元素没有影响。这包括花车。这就是为什么在没有定位的情况下在浮动上设置z-index不会改变任何东西。
  2. 从我对a very similar question的回答:“Floats不会自己建立堆叠上下文。如果它们位于并且的z-index不是自动的,它们将只会这样做(不计算any of the numerous other ways an element may do so)。“
  3. 这两点涵盖了在情景2和3中浮动从未出现在其定位兄弟前面的原因:定位的兄弟姐妹具有堆叠等级0(#6),这确保它被涂在浮子前面(#4)

    在情景1中,未定位的兄弟姐妹属于#3,这就是为什么它被涂在浮子后面(#4)。

    在方案4中,浮动变得无关紧要。您现在在同一堆叠上下文中有两个定位元素,一个具有比另一个更高的堆栈级别(并且,暗示为elsewhere,更大的是完全不必要的数量),因此堆栈级别越高,堆栈级别越小。

答案 1 :(得分:0)

这确实是定位如何运作的。

  1. 没有定位,元素的行为与您期望的一样。

  2. 定位元素会将其置于新的堆叠上下文中。因此,在未定位的之后的相对div表现得好像它堆叠得更高。 (即当你以任何方式使它们重叠时,第二个会遮挡第一个。)

  3. 如果您希望z-index工作,则必须定位元素。所以在场景3中,z-index什么都不做,使其在功能上与场景2相同。

  4. 因此,方案4是您想要的解决方案。

  5. 希望这能解释事情!

    编辑:或不。见评论。