子元素的z-index如何高于父元素的兄弟元素的z-index值?
1.文字描述如下:
有A、B两个同级div,A的z-index为888,B的z-index为999,A下有H,z-index为1000,但是发现H并没有在B的上层,不改变层次结构能否使H在B的上层?
2.代码描述如下
<div class='A' style="background-color:rgba(0, 0, 0, 0.9);position: absolute;z-index: 888;">
<h1 class='H' style="position: absolute;color: #fff;z-index: 1000;display: block;">
This is a heading
</h1>
</div>
<div class='B' style="position: absolute;height: 100%;width: 100%;background: #000;z-index: 999;"></div>
3.可以改变任意样式,但是不能改变(A>H,B)的层次结构以及他们的z-index,如何使得H在B之上?
4,划重点!!!!
仅不能改变(A>H,B)的层次结构以及他们的z-index,其他style随便,包括但不限于position、width,height随便改,随便加,随便减”
仅不能改变(A>H,B)的层次结构以及他们的z-index,其他style随便,包括但不限于position、width,height随便改,随便加,随便减”
仅不能改变(A>H,B)的层次结构以及他们的z-index,其他style随便,包括但不限于position、width,height随便改,随便加,随便减”
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
根据规范,z-index是应用到定位元素的,也就是
position
属性不为static
的元素(感谢@a_dust和@ymwangel),否则,设置z-index是没有意义的;z-index的作用有两点,一是设置在当前堆叠上下文(stacking context)中的层级;二是创建一个新的堆叠上下文;
z-index并不是设置的值越高,就会越靠近用户,还和堆叠上下文有关系;
举例如下:
对于.div1div1div1和.div2div1,虽然后者的z-index(800)高于前者(10),但是因为前者所在的堆叠上下文(.div1div1)的z-index(500)高于后者所在的堆叠上下文(.div2div1)的z-index(400),所以前者是在后者上面的。
评论里面你设置
div{z-index:9;position:relative;}
会建立一个新的堆叠上下文,和div同级的元素是0
,img元素是9 -1
,因为9>0,所以img是在上面的。按照你的题目,其实position属性是不能改的,如果把position属性改为relative,那你的z-index属性其实就不起作用了,在z-index都起作用的情况下,是没有办法达到你的要求的,理由如下:
A, B和H的层级如上,因为888 < 999,所以A和H都在B的下边。
其实看下
z-index
的规则就清楚了也就是,假设有以下文档:
显示效果如下图:
注:红色为a,绿色为b,蓝色为c
由此可见无论元素 c 的
z-index
设的多高,都将显示在元素 a 的下面。所以要解决题主所说的 A>H,B 问题
有一个最好的办法,那就是去掉 A 的
z-index
,这样 H 的z-index
就不会受限于 A 的z-index
了不能父级限制了子元素的 位置
不能。因为你的H和B都是
position: absolute
,可以认为,绝对定位的元素在z轴上的偏移量远远大于z-index可以设置的量(可以认为绝对定位元素有着无穷大的z偏移)。因此,H和B两个元素的z-index实际上并不起到任何作用。去掉了
position: absolute
之后,代码如下效果:
首先A,B,H都是绝对定位,然后z-index,B>A了,自然而然,B就挡住了A,H在A里面,又是绝对定位于A,自然也就挡住H了,解决方法就是设置z-index,A>B就行了。这样布局,H的z-index,没有实在的意义(只要遮住了A,也就遮住了H)!除非H不在A里面!
可以想象成每一个元素的
z-index
都声明了一个平面世界,平面世界的高度就是z-index
的值。 而子元素的z-index
都是在这个世界相比较。如果外面的z-index前者小于后者,没有办法让前者的子节点超过后者,只能改变层级,不过这样子的话,前者就可能把后者全都档住了,所以楼主还是把H从A中拿出来对应的层级设置好就能达到效果了
仅供参考,欢迎交流
那我们不用z-index实现B>A不可以吗,定位的基础知识,当使用定位时,后写的盒子会覆盖前面的盒子,说白了就是同一层级先写A盒子再写B盒子,这时候B就是在A上面的,然后H给z-index就可以生效了,因为它是唯一一个
<div class='A' style="background-color:rgba(0, 0, 0, 0.9);position: absolute">
</div>
<div class='B' style="position: absolute;height: 100%;width: 100%;background: #000"></div>
楼主的代码就把A、B的z-index删掉就实现了你的要求了啊