解析:
在前端整个体系里, 屏幕除了我们能感受到的 X ,Y轴,还有条 我们眼睛到屏幕的 Z轴.
Z轴的存在,就引申出 一个问题: 各元素之间 里 观察者 谁近谁远的 问题. 也就是 ''上下文堆叠顺序 (stack contex)''
这里,我们来解析 一个元素自己内部的上下文堆叠顺序,也就是 元素的伪元素 和 元素的子元素 之间的堆叠关系
请看下面一个例子 :
<!-- html -->
<div class="box">
<div class="item-1"></div>
<div class="item-2"></div>
</div>
/* css */
.box {
height: 100px;
width: 100px;
background: #ddd;
}
.box::before {
content: "";
display: inline-block;
width: 20px;
height: 30px;
background: blue;
transform: translate( 40px , 10px)
}
.box::after {
content: "";
display: inline-block;
width: 20px;
height: 30px;
background: orange;
transform: translate( 65px , -60px)
}
.item-1 {
height: 30px;
width: 20px;
background: green;
transform: translate( 45px , -20px)
}
.item-2 {
height: 30px;
width: 20px;
background: purple;
transform: translate( 55px , -40px)
}
运行结果:
解析总结:
盒子在默认情况下,也就是没有设置Z-index的情况下:
① 一个盒子 它的 ::before伪类在最底层, ::after 伪元素在最上层, 其子元素在中间层
② 盒子的 子元素堆叠关系 由 子元素在 html中的先后顺序, 谁出现的后面 谁就在上面的一层.
应用:
我们通过上面的解析知道了 盒子伪元素和子元素的关系, 但具体能体现在那些方面呢? 请看下图 :
上图效果怎么做到呢?! 那就运用到 这里的 堆叠关系了. 请看下面代码:
<!-- html -->
<div class="box">xx</div>
/* css */
.box {
width: 100px;
height: 100px;
background: #bbb;
border: 2px solid red;
transform: translate( 50px, 10px);
margin: 20px;
}
.box::after { /* after 在上 */
content: "";
display: inline-block;
height: 0;
width: 0;
border-width: 20px;
border-style: solid;
border-color: transparent transparent #bbb transparent;
transform: translate( -14px , -39px)
}
.box::before { /* before 在下 */
content: "";
display: inline-block;
height: 0;
width: 0;
border-width: 20px;
border-style: solid;
border-color: transparent transparent red transparent;
transform: translate( 42px , -42px)
}
简单概括步骤就是:
① 设置 伪元素::before 背景颜色为 盒子的边框颜色, 通过translate 移动到 盒子上沿
② 设置 伪元素::after 的背景颜色== 盒子的背景颜色 ,通过translate 移动到 盒子上沿,但Y轴跟 before 的Y轴保持 几个像素的距离.
③ 因为 after 背景颜色 == 盒子的背景颜色, 这样视觉上就达到了盒子有 凸出来的 颜色边框.