before和after伪元素相对原来元素的位置
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>the Five-Starred Red Flag</title>
<style>
.flag {
width: 600px;
height: 400px;
background: red;
margin: 100px auto;
position: relative;
}
.stars {
width: 0;
height: 0;
border-left: 57px solid transparent;
border-right: 57px solid transparent;
border-top: 42px solid yellow;
position: absolute;
top: 82px;
left: 52px;
}
.stars::before,
.stars::after {
display: block;
content: "";
width: 0;
height: 0;
border-left: 57px solid transparent;
border-right: 57px solid transparent;
border-top: 42px solid yellow;
position: absolute;
}
.stars::before {
/*left: -57px;
top: -42px;*/
/*transform: rotate(-72deg);*/
}
.stars::after {
/*left: -65px;
top: -40px;*/
/*transform: rotate(-143deg);*/
}
.star-2 {
transform: scale(0.33) rotate(20deg);
left: 150px;
top: 20px;
}
.star-3 {
transform: scale(0.33) rotate(40deg);
left: 190px;
top: 60px;
}
.star-4 {
transform: scale(0.33) rotate(60deg);
left: 190px;
top: 120px;
}
.star-5 {
transform: scale(0.33) rotate(80deg);
left: 150px;
top: 160px;
}
</style>
</head>
<body>
<div class="flag">
<div class="star-1 stars"></div>
<div class="star-2 stars"></div>
<div class="star-3 stars"></div>
<div class="star-4 stars"></div>
<div class="star-5 stars"></div>
</div>
</body>
</html>取消了line:38~40 以及 line:43~45的位置和旋转设置,可以看到如图,右下的三角形(before和after重合)左上角对齐stars元素的content盒子的左上角(在console中调试了一下stars的width和height来确认的)

为什么不是像文档流一样,伪元素(before和after)分别挨着star的上方和下方?
div的before和after伪元素的默认显示位置,究竟是如何规定的呢?
37
收起
正在回答
2回答
同学你好,首先很抱歉第一次没有理解同学的意思。
1、我们可以给四个边框都设置颜色看一下:

因为::before和::after添加的伪元素是作为stars的子元素,默认是从父元素内容的左上角开始显示的。


可以看出, 由于stars盒子宽高为0, 图片中四个边框的交点位置,就是内容的位置,所以显示的这两个伪类从内容位置开始显示,覆盖到边框上了。
2、又因为每个伪元素都设置了绝对定位,脱离了标准流不占位置,所以after就覆盖了before,可以将定位去掉再看一下:

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~


恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星