学习总结
原文:https://www.zhangxinxu.com/wordpress/2016/01/understand-css-stacking-context-order-z-index/
如果一个元素含有层叠上下文,我们可以理解为这个元素在z轴上就“高人一等”。没错这个z就是三维中的z轴
作用:在同样是层叠上下文元素的情况下谁的层叠上下文大在(两着出现重叠的时候)高的就理所应当的回遮盖底的
例子:
这里先说明下由于父元素设置了flex,那么他的子项就分别都是层叠上下文
注:经过测试不管子项z-index设置为什么,其子项都会产生层叠上下文
.container { display: flex; width: 100px; height: 500px; border: 1px solid red;}
.box { width: 50px; height: 50px; display: 50px;}
.box-1 {background-color: seagreen;}
.box-2 {background-color: sienna;margin-left: -20px;}
作用:决定了在同一个层叠上下文中元素在z轴上的显示顺序
我的理解:有几个元素如果他们同时都在一个层叠上下文里面,那么他们就是的层叠水平就是有自己的层叠顺序(下面会说)决定,如果不在同一个层叠上下文,那么他们的层叠水平优先取绝与他们所依托的层叠上下文,
普通元素的层叠水平优先由层叠上下文决定,因此,层叠水平的比较只有在当前层叠上下文元素中才有意义。 --- 旭哥
作用:他规定了层叠上下文中元素的层叠水平
图来自旭哥网址,图的顺序我都测试过是没问题的
let * = 内部子元素 (下文*代表'内部子元素’)
(父层叠上下文的背景图,边框...) < (*负z-index) < (*block块水平盒子) < (*float浮动盒子) < (*inline/ inline-block 水平盒子) < (*z-index:0 ; 或者看成z-index:0,也就是不依赖z-index的层叠上下文) < (*z-index为正)
::before 和 ::after 就相对与一个普通元素的inline盒子
注意:这里需要注意的移动地方就是第一张图的层叠上下文是最底底,对,大家没看错,我的理解就是:层叠上下文上的每一个元素都是以这个层叠上下文为依托,所以他的顺序最低
1.根层叠上下文
指的是页面根元素,也就是滚动条的默认的始作俑者元素。这就是为什么,绝对定位元素在
left
/top
等值定位的时候,如果没有其他定位元素限制,会相对浏览器窗口定位的原因。
注意:所以absolute不一定是相对与上一个元素的position: relative定位,而是他所在的层叠上下文内定位或者通过指定元素相对于最近的非 static 定位祖先元素
2.定位元素与传统层叠上下文
position:relative
/position:absolute
:声明的定位元素,当其z-index
值不是auto
的时候,会创建层叠上下文。
/
position:fixed/position:sticky 直接就会产生层叠上下文
3.CSS3与新时代的层叠上下文
z-index
值不为auto
的flex
项(父元素display:flex|inline-flex
).opacity
值不是1
.transform
值不是none
.mix-blend-mode
值不是normal
.filter
值不是none
.isolation
值是isolate
.will-change
指定的属性值为上面任意一个。-webkit-overflow-scrolling
设为touch
.具体测试可以看下旭哥的文章,我已经测试过,把代码放入文章会过长
z-index
数值,则其层叠顺序是z-index:auto
可看成z:index:0
级别;(css3的一些产生的层叠上下文)z-index
数值,则其层叠顺序由z-index
值决定。(定位元素)(对没错依旧是旭哥的图)
其根本原因就在于,元素一旦成为定位元素,其z-index
就会自动生效,此时其z-index
就是默认的auto
,也就是0
级别,根据上面的层叠顺序表,就会覆盖inline
或block
或float
元素。注意:position:relative
/position:absolute 并不会产生层叠上下文,要设置z-index不为auto的时候
而不支持z-index的层叠上下文元素天然z-index:auto
级别,也就意味着,层叠上下文元素和定位元素是一个层叠顺序的,于是当他们发生层叠的时候,遵循的是“后来居上”准则。
注意:这里的第一层和第六的的区别一个是祖先元素(是层叠顺上下文)一个是其内部的(层叠上下文)
opacity
的值不是1
的时候,是具有层叠上下文的,层叠顺序是z-index:auto
级别,跟没有z-index
值的absolute
绝对定位元素同一层叠水平的,而如果图片的html结构写在文字的后面,所以就会盖住文字
@keyframes fadeIn {
0% { opacity: 0; }
100% { opacity: 1; }
}
.box { width: 256px; height: 191px; position: relative; }
.text { line-height: 30px; position: absolute; /* z-index: 1; */ left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, .5); color: #fff;text-align: center; font-size: 14px;}
.fade {animation: fadeIn 2s 2s infinite;}
快播的辩词再精彩 也不配赢得掌声
解决方法
1. 调整DOM流的先后顺序;
2. 提高文字的层叠顺序,例如,设置z-index:1
;因为不依赖z-index产生的层叠上下文z-index可以看作为0