z-index不适用于固定定位

Dan*_*man 405 css z-index

我有一个div默认定位(即position:static)和一个divfixed位置.

如果我设置元素的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;
    }
Run Code Online (Sandbox Code Playgroud)
    <!DOCTYPE html>
    <html>
       <body>
          <div id="over">
             Hello Hello HelloHelloHelloHelloHello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello
          </div>  
          <div id="under">
          </div>
       </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

或者在这里的jsfiddle:http://jsfiddle.net/mhFxf/

我可以通过使用position:absolute 静态元素解决这个问题 ,但任何人都可以告诉我为什么会这样吗?

(似乎有一个类似的问题,这个问题,(固定位置打破了z-index)但它没有一个令人满意的答案,因此我在这里用我的示例代码问这个问题)

ste*_*och 444

添加position: relative;到#over

    #over {
      width: 600px;
      z-index: 10;
      position: relative;    
    }
    
    #under {
      position: fixed;
      top: 5px;
      width: 420px;
      left: 20px;
      border: 1px solid;
      height: 10%;
      background: #fff;
      z-index: 1;
    }
Run Code Online (Sandbox Code Playgroud)
    <!DOCTYPE html>
    <html>
    <body>
    	<div id="over">
    		Hello Hello HelloHelloHelloHelloHello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello
    	</div>  
    
    	<div id="under"></div>
    </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

小提琴

  • http://updates.html5rocks.com/2012/09/Stacking-Changes-Coming-to-position-fixed-elements是关于位置固定,绝对和相对如何与z-index相互作用的极好参考. (14认同)
  • [这里是一个小提琴](http://jsfiddle.net/A2xht/)展示了堆栈上下文。在[此处](https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context)中对此进行了说明。 (2认同)

Mr_*_*ags 128

这个问题可以通过多种方式解决,但实际上,了解堆叠规则可以让您找到最适合您的答案.

解决方案

<html>元素是你唯一的叠加背景下,所以只要按照堆叠环境内堆叠规则,你会看到,元素顺序堆叠

  1. 堆叠上下文的根元素(<html>本例中的元素)
  2. 具有负z-index值的定位元素(及其子元素)(较高值堆叠在较低值的前面;具有相同值的元素根据HTML中的外观堆叠)
  3. 非定位元素(按HTML中的外观排序)
  4. z-index值为auto的定位元素(及其子元素)(按HTML中的外观排序)
  5. 具有正z-index值的定位元素(及其子元素)(较高值堆叠在较低值的前面;具有相同值的元素根据HTML中的外观堆叠)

所以你可以

  1. 将z-index设置为-1,对于#under定位的-ve z-index出现在非定位#over元素后面
  2. 设置#overto 的位置,relative以便规则5适用于它

真正的问题

在尝试更改元素的堆叠顺序之前,开发人员应该了解以下内容.

  1. 当形成堆叠上下文时
    • 默认情况下,<html>元素是根元素,是第一个堆叠上下文
  2. 堆叠上下文中的堆叠顺序

下面的堆叠顺序和堆叠上下文规则来自此链接

当形成堆叠上下文时

在堆叠上下文中堆叠顺序

元素的顺序:

  1. 堆叠上下文的根元素(<html>默认情况下,元素是唯一的堆叠上下文,但任何元素都可以是堆叠上下文的根元素,请参阅上面的规则)
    • 您不能将子元素放在根堆叠上下文元素后面
  2. 具有负z-index值的定位元素(及其子元素)(较高值堆叠在较低值的前面;具有相同值的元素根据HTML中的外观堆叠)
  3. 非定位元素(按HTML中的外观排序)
  4. z-index值为auto的定位元素(及其子元素)(按HTML中的外观排序)
  5. 具有正z-index值的定位元素(及其子元素)(较高值堆叠在较低值的前面;具有相同值的元素根据HTML中的外观堆叠)

  • 有些人可能也觉得这很有帮助:[关于Z-Index没人告诉过您](https://philipwalton.com/articles/what-no-one-told-you-about-z-index/) (3认同)
  • 感谢您的简洁回答。“您不能将子元素放在根堆叠上下文元素后面”。我会将其扩展为*任何*新的堆叠上下文元素。不幸的是,这结束了我的粘性元素具有在滚动时激活的阴影层,因为由于“position:sticky”创建的堆叠上下文,我无法将 z-index 设置为显示在粘性元素后面。 (3认同)

cus*_*ar9 34

错误的答案:

z索引仅在特定上下文即内工作relative,fixedabsolute位置.

相对div的z-indexz-index绝对或固定div 无关.

编辑 这是一个不完整的答案.这个答案提供了虚假信息.请查看@ Dansingerman的评论和示例如下.

  • ***这个答案是错误的.***[这是一个小提琴](http://jsfiddle.net/A2xht/)展示堆叠上下文,因为它在这里解释[https://developer.mozilla.org/ EN-US /文档/网络/指南/ CSS/Understanding_z_index/The_stacking_context).@Dansingerman. (64认同)
  • z-index影响两个div的顺序,即使一个是位置相对而另一个是绝对的. (13认同)
  • @JoeMorano,无论绝对位置还是相对位置,高级z都接近顶部.重要的是文档树中的级别.Div 4,5,6是div 3的子节点,而div 1和2是div 3的兄弟节点.Div 1的z高于div 3,因此div 1位于div 3及其所有子节点之上.Div 2的z比div 3低,所以div 3和它的所有孩子都在div 2之上 (8认同)
  • 您能否扩展z-index在特定上下文中的工作方式,和/或提供参考? (3认同)

iam*_*ous 29

因为你的overdiv没有定位,所以z-index不知道在哪里以及如何定位它(以及关于什么?).只需将你的div的位置改为亲戚,这样就不会对那个div产生任何副作用,然后under div会服从你的意志.

这是你在jsfiddle上的例子:小提琴

编辑:我看到有人已经提到了这个答案!


Car*_*oso 18

给出#under否定的z-index,例如-1

发生这种情况是因为z-index忽略了属性position: static;,这恰好是默认值; 所以在你编写的CSS代码中,无论你设置多高,它z-index1适用于这两个元素#over.

通过给出#under负值,它将落后于任何z-index: 1;元素,即#over.


the*_*tto 5

我正在构建导航菜单。我overflow: hidden在导航的CSS中隐藏了所有内容。我以为这是z-index问题,但实际上我将所有内容都隐藏在导航之外。