用了那么久的 CSS ,但你还是不懂它
前段时间有人问:为什么我设置的 z-index 值不生效呢?
我说:那可能是你真的不知道 CSS 层叠上下文。
但是话说回来,都用了那么久 CSS 了,这都不知道是不是有些说不过去呀,这也是本文产生的主要原因,希望对你有所帮助!
本文就以 CSS 层叠上下文 和 图层 Layers 为主,来探讨一下那些不被你重视的 CSS 基本知识。
你可能奇怪那什么会涉及到 图层 呢?
因为怕你可能会 搞混、分不清 呗,带来的后果就是你在做语言表达时就会互相混用概念!
先看示例(修炼假秘籍)

float 元素
<div class=”float-box”>float box</div> // float: left
<div class=”div-box”>div box</div>
</body>

<div class=”div-box”>div box</div>
<div class=”float-box”>float box</div> // float: left
</body>

-
当一个元素产生 浮动 后,它会被移出 正常文档流,要么 向左 或 向右 平移 -
一直平移直到碰到了所处的 容器边框,或碰到 另外一个浮动元素 为止

float 元素 和 inline 元素


为什么需要 CSS 层叠上下文?

什么是 CSS 层叠上下文?


如何生成 CSS 层叠上下文?
-
文档根元素(<html>) -
position 值为 absolute(绝对定位)或 relative(相对定位),且 z-index 值不为 auto 的元素 -
position 值为 fixed(固定定位)或 sticky(粘滞定位)的元素 -
flex 容器的 子元素,且 z-index 值不为 auto -
grid 容器的 子元素,且 z-index 值不为 auto -
opacity 属性值小于 1 的元素 -
transform 属性不为 none 的元素 -
will-change 值设定任一 CSS 属性 的元素

值得注意的是:
-
层叠上下文 可 包含 在 其他层叠上下文 中,并共同创建一个层叠上下文层级
-
【大白话】:一个 父层叠上下文 中可以包含多个 子层叠上下文,且它们都所属于 父层叠上下文,而不是生成和 父层叠上下文 同级的 新层叠上下文
-
每个层叠上下文都 完全独立 于它的兄弟元素
-
当处理层叠时只考虑子元素 -
【大白话】:对外部而言,父叠上下文 不论包含了多少 子层叠上下文 都会作为 整体 按优先级渲染;对内部而言,父叠上下文 中的多个 子层叠上下文 还是会按优先级渲染
-
每个层叠上下文都是 自包含 的
-
当一个元素的内容发生层叠后,该元素将被 作为整体 在父级层叠上下文中按顺序进行层叠 -
【大白话】:一个元素变成 层叠元素 后,其与其子元素 就会与其他 兄弟层叠元素 按优先级进行渲染

层叠上下文 中 子元素 的 绘制顺序 规则如下,每个元素的渲染基本遵循 背景色 — 背景图(如果有) — 边框(如果有) 的顺序:
- 元素为 根元素(HTML)
- 背景色
- 背景图
- 元素为 z-index < 0 的 定位元素(position)
- 元素为 (非定位)块元素(block)
- 非 table 元素
- 背景色
- 背景图
- 边框
- table 元素
- <table> 背景色
- <table> 背景图
- <table> 列 背景色、背景图
- <table> 行 背景色、背景图
- <table> 单元格 背景色、背景图
- <table> 边框
- 元素为 (非定位)浮动元素(float)
- 元素为 (非定位)内联(块)元素(inline/inline-block)
- 元素为 z-index = 0 | auto 的 定位元素(position)
- 元素为 z-index >= 1 的 定位元素(position)


如何确定两个元素的层叠顺序?
要比较两个元素的层叠顺序,我们先要确定它们 所在的层叠上下文 的层叠顺序:
-
若两个元素处于 同一个层叠上下文 中,那么就按同一层叠上下文中的渲染顺序来计算 -
若两个元素处于 不同层叠上下文 中,那么它们 所在的层叠上下文的顺序 就决定了目标元素的层叠顺序
-
-
假设 A 层叠上下文 的层级高于 B 层叠上下文,那么 A 中的子元素 都会高于 B 中的子元素,此时对 B 中的子元素 设置多大的 z-index 都没有用,因为 z-index 只能控制 同一层叠上下文中元素的 堆叠顺序 -
假设 A 层叠上下文 和 B 层叠上下文 层级相同,那么 后面的层叠上下文 就会覆盖 前面的层叠上下文
-



再看示例(修炼真秘籍)
示例一:利用 CSS 层叠上下文不让 浮动元素 覆盖 块元素



示例二:z-index 申请出战
<style>
.abs-box{
background-color: red;
position: absolute;
}
.div-box {
background-color: rgb(16, 4, 181);
}
</style>
<body>
<div class="box abs-box">absolute box</div>
<div class="box div-box">div box</div>
</body>




什么是图层?
-
构建 DOM Tree -
构建 CSSOM -
构建 Render Tree -
构建 Layout Tree -
构建 Layer Tree(划分图层) -
根据视口大小对 图层 进行 分块 -
栅格化 raster -
合成 和 显示

什么样的元素会创建新图层?

怎么观察图层?
Safari Devtools

Chrome Devtools

- 一个元素产生层叠上下文,那么它会比其他元素拥有高优先级
- 一个层叠上下文中元素的排列顺序:
- 层叠上下文的 背景色、背景图(如果有)、边框(如果有)
- 定位元素,且 z-index < 0
- (非定位)块元素
- (非定位)浮动元素
- (非定位)行内(块)元素
- 定位元素,且 z-index = auto | 0
- 定位元素,且 z-index > 0
- 比较两个元素的层叠顺序,先确定它们 所处的层叠上下文 的层叠顺序
- 处于 相同层叠上下文,则按如上顺序计算
- 处于 不同层叠上下文,则比较它们各自层叠上下文的顺序
- 层叠上下文 和 图层 不是同一个东西,即使从视图表现来看是相似的,但本质不同
微信赞赏
支付宝扫码领红包
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。侵权投诉:375170667@qq.com