最近在项目的过程当中遇到了一个问题,menu-bar但愿始终显示在最上面,而在以后的元素都显示在它之下,当时设置了 z-index 也没有效果,不知道什么缘由,所以找了一下css有关层叠方面的资料,解决了这个问题,这里记录一下~css
屏幕是一个二维平面,然而HTML元素倒是排列在三维坐标系中,x为水平位置,y为垂直位置,z为屏幕由内向外方向的位置,咱们在看屏幕的时候是沿着z轴方向从外向内的;由此,元素在用户视角就造成了层叠的关系,某个元素可能覆盖了其余元素也可能被其余元素覆盖;html
那么这里有几个重要的概念:层叠上下文 (堆叠上下文, Stacking Context)、层叠等级 (层叠水平, Stacking Level)、层叠顺序 (层叠次序, 堆叠顺序, Stacking Order)、z-index前端
声明:web
position: absolute|fixed|relative|sticky
position: initial|static
感兴趣的同窗能够加文末的微信群,一块儿讨论吧~segmentfault
层叠上下文 (堆叠上下文, Stacking Context),是HTML中一个三维的概念。在CSS2.1规范中,每一个元素的位置是三维的,当元素发生层叠,这时它可能覆盖了其余元素或者被其余元素覆盖;排在z轴越靠上的位置,距离屏幕观察者越近性能优化
文章<关于z-index 那些你不知道的事>有一个很好的比喻,这里引用一下;微信
能够想象一张桌子,上面有一堆物品,这张桌子就表明着一个层叠上下文。 若是在第一张桌子旁还有第二张桌子,那第二张桌子就表明着另外一个层叠上下文。前端性能
如今想象在第一张桌子上有四个小方块,他们都直接放在桌子上。 在这四个小方块之上有一片玻璃,而在玻璃片上有一盘水果。 这些方块、玻璃片、水果盘,各自都表明着层叠上下文中一个不一样的层叠层,而这个层叠上下文就是桌子。post
每个网页都有一个默认的层叠上下文。 这个层叠上下文(桌子)的根源就是<html></html>
。 html标签中的一切都被置于这个默认的层叠上下文的一个层叠层上(物品放在桌子上)。性能
当你给一个定位元素赋予了除 auto
外的 z-index 值时,你就建立了一个新的层叠上下文,其中有着独立于页面上其余层叠上下文和层叠层的层叠层, 这就至关于你把另外一张桌子带到了房间里。
层叠上下文1 (Stacking Context 1)是由文档根元素造成的, 层叠上下文2和3 (Stacking Context 2, 3) 都是层叠上下文1 (Stacking Context 1) 上的层叠层。 他们各自也都造成了新的层叠上下文,其中包含着新的层叠层。
在层叠上下文中,其子元素按照上面解释的规则进行层叠。造成层叠上下文的方法有:
<html></html>
position
值为absolute | relative
,且z-index
值不为 auto
position
值为 fixed | sticky
z-index
值不为 auto
的flex元素,即:父元素display: flex | inline-flex
opacity
属性值小于 1
的元素transform
属性值不为 none
的元素mix-blend-mode
属性值不为 normal
的元素filter
、perspective
、clip-path
、mask
、mask-image
、mask-border
、motion-path
值不为 none
的元素perspective
值不为 none
的元素isolation
属性被设置为 isolate
的元素will-change
中指定了任意 CSS 属性,即使你没有直接指定这些属性的值-webkit-overflow-scrolling
属性被设置 touch
的元素总结:
层叠等级 (层叠水平, Stacking Level) 决定了同一个层叠上下文中元素在z轴上的显示顺序的概念;
注意,层叠等级并不必定由 z-index 决定,只有定位元素的层叠等级才由 z-index 决定,其余类型元素的层叠等级由层叠顺序、他们在HTML中出现的顺序、他们的父级以上元素的层叠等级一同决定,详细的规则见下面层叠顺序的介绍。
在 CSS 2.1 中, 全部的盒模型元素都处于三维坐标系中。 除了咱们经常使用的横坐标和纵坐标, 盒模型元素还能够沿着"z 轴"层叠摆放, 当他们相互覆盖时, z 轴顺序就变得十分重要。
z-index 只适用于定位的元素,对非定位元素无效,它能够被设置为正整数、负整数、0、auto,若是一个定位元素没有设置 z-index,那么默认为auto;
元素的 z-index 值只在同一个层叠上下文中有意义。若是父级层叠上下文的层叠等级低于另外一个层叠上下文的,那么它 z-index 设的再高也没用。因此若是你遇到 z-index 值设了很大,可是不起做用的话,就去看看它的父级层叠上下文是否被其余层叠上下文盖住了。
层叠顺序 (层叠次序, 堆叠顺序, Stacking Order) 描述的是元素在同一个层叠上下文中的顺序规则,从层叠的底部开始,共有七种层叠顺序:
同一个层叠顺序的元素按照在HTML里出现的顺序层叠;第7级顺序的元素会显示在以前顺序元素的上方,也就是看起来覆盖了更低级的元素:
三个relative
定位的div
块中各有absolute
的不一样颜色的span.red
、span.green
、span.blue
,它们都设置了position: absolute
;
那么当没有元素包含z-index属性时,这个例子中的元素按照以下顺序层叠(从底到顶顺序):
红绿蓝都属于 z-index 为auto的定位元素,所以按照7层层叠顺序规则来讲同属于层叠顺序第6级,因此按HTML中的出现顺序层叠:红->绿->蓝
红绿位于一个div.first-box
下,蓝位于div.second-box
下,红绿蓝都设置了position: absolute
,first-box
与second-box
都设置了position: relative
;
这个例子中,红蓝绿元素的父元素first-box
与second-box
都没有生成新的层叠上下文,都属于根层叠上下文中的元素,且都是层叠顺序第6级,因此按HTML中的出现顺序层叠:红->绿->蓝
红绿位于一个div.first-box
下,蓝黄位于div.second-box
下,红绿蓝都设置了position: absolute
,若是这时给绿加一个属性z-index: 1
,那么此时.green
位于最上面;
若是再在.second-box
下.green
后加一个绝对定位的 span.gold
,设置z-index: -1
,那么它将位于红绿蓝的下面;
这个例子中,红蓝绿黄元素的父元素中都没有生成新的层叠上下文,都属于根层叠上下文中的元素
因此这个例子中的从底到高显示的顺序就是:黄->红->蓝->绿
红绿位于一个div.first-box
下,蓝位于div.second-box
下,红绿蓝都设置了position: absolute
,若是first-box
的z-index设置的比second-box
的大,那么此时不管蓝的 z-index 设置的多大z-index: 999
,蓝都位于红绿的下面;若是咱们只更改红绿的z-index值,因为这两个元素都在父元素first-box
产生的层叠上下文中,此时谁的z-index值大,谁在上面;
这个例子中,红绿蓝都属于设置了z-index的定位元素,不过他们的父元素建立了新的层叠上下文;
first-box
是设置了正z-index的定位元素,所以建立了一个层叠上下文,属于层叠顺序中的第7级;second-box
也一样建立了一个层叠上下文,属于层叠顺序中的第6级;first-box
中全部元素都排在second-box
上;first-box
中且设置了不一样的正 z-index,都属于层叠顺序中第7级;second-box
,且设置了一个很大的正 z-index,属于层叠元素中第7级;second-box
的层叠等级比first-box
小,所以位于红绿之下;因此这个例子中从低到到显示的顺序:蓝->红->绿
(我遇到的的状况就属于这个例子相似情形)
红绿位于div.first-box
下,蓝位于div.second-box
下,红绿蓝都设置了position: absolute
,绿设置了z-index: 1
,那么此时绿位于红蓝的最上面;
若是此时给first-box
设置opacity: .99
,这时不管红绿的 z-index 设置的多大z-index: 999
,蓝都位于红绿的上面;
若是再在.second-box
下.green
后加一个span.gold
,设置z-index: -1
,那么它将位于红绿蓝的下面;
以前已经介绍了,设置opacity
也能够造成层叠上下文,所以:
first-box
设置了opacity
,first-box
成为了一个新的层叠上下文;second-box
没有造成新的层叠上下文,所以其中的元素都属于根层叠上下文;first-box
属于第6级,蓝属于层叠顺序中第6级且按HTML出现顺序位于first-box
之上;因此这个例子中从低到到显示的顺序:黄->红->绿->蓝
网上的帖子大多深浅不一,甚至有些先后矛盾,在下的文章都是学习过程当中的总结,若是发现错误,欢迎留言指出~
参考:
- 你不知道的Z-Index
- MDN - z-index
- What No One Told You About Z-Index
- 完全搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index
- 前端性能优化之更平滑的动画
- 关于z-index 那些你不知道的事
- 聊聊CSS中的层叠相关概念
推介阅读:
PS:欢迎你们关注个人公众号【前端下午茶】,一块儿加油吧~
另外能够加入「前端下午茶交流群」微信群,长按识别下面二维码便可加我好友,备注加群,我拉你入群~