堆叠上下文

堆叠上下文:就是指在在HTML中的三维概念。作用就是在z轴上把各元素及其子元素层叠分开。

形成条件

文档中的层叠上下文由满足以下任意一个条件的元素形成:

  • 根元素 (HTML),

  • z-index 值不为 "auto"的 绝对/相对定位,

  • 一个 z-index 值不为 "auto"的 flex 项目 (flex item),即:父元素 display: flex|inline-flex,

  • opacity 属性值小于 1 的元素(参考 the specification for opacity),

  • transform 属性值不为 "none"的元素,

  • mix-blend-mode 属性值不为 "normal"的元素,

  • filter值不为“none”的元素,

  • perspective值不为“none”的元素,

  • isolation 属性被设置为 "isolate"的元素,

  • position: fixed

  • will-change 中指定了任意 CSS 属性,即便你没有直接指定这些属性的值(参考 这篇文章

  • -webkit-overflow-scrolling 属性被设置 "touch"的元素

通常情况下堆叠上下文的八层空间(如图一)

Fr55.jpg

在没有设置定位时,八层空间如下

  1. background:背景作为底层
  2. border:边框作用在背景之上(层叠在上)
  3. 块级元素在第三层
  4. 浮动元素在第四层
  5. 内联元素在第五层(inline,inline-block)
  6. 设置了定位的元素在第六层
  7. 负z-index在背景之后;正z-index在最上层

堆叠上下文的相对性及注意事项

由于HTML就是一个堆叠上下文,故在其他元素没有形成堆叠上下文时,HTML就是作为最底层。

相对于同级元素:块级元素在相同条件下,越迟出现的层级最高。(内联元素同理)

demo1
在没有设定z-index时,由于存在相同情况下,后者覆盖前者的情况;
故例子中绿色方块覆盖蓝色方块;绿色方块内的字体覆盖蓝色方框内的字体。
但是注意,蓝色方框的字体悬浮在绿色方框之上;真是因为原始状态下内联元素始终高于块级元素

image.png

相对于不同级元素:每一个堆叠上下文相对于一个部门,部门等级高于员工等级

demo2
当设置了堆叠上下文时,虽然两者z-index属性相同,但是后者出现还是会全面覆盖前者
因为此时两个子div都是堆叠上下文,就像是两个部门,部门内的员工(孙元素)的高低取决于部门(子元素)的层级

image.png

负z-index

当z-index设为负值时,正常情况下时位于background后方,属于看不见状态;
但是当父元素也作为一个堆叠上下文时,父元素就是相对于HTML的第二底层,就算z-index为负无穷也必须要在父元素之上。

此时负z-index元素位于图一中的,border之上,块级元素之下

demo3

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容