before和after伪元素相对原来元素的位置

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来确认的)

http://img1.sycdn.imooc.com//climg/5ded11540970eab005750310.jpg

为什么不是像文档流一样,伪元素(before和after)分别挨着star的上方和下方?

div的before和after伪元素的默认显示位置,究竟是如何规定的呢?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,首先很抱歉第一次没有理解同学的意思。

1、我们可以给四个边框都设置颜色看一下:

http://img1.sycdn.imooc.com//climg/5dee22e30998cc2b06050391.jpg

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

http://img1.sycdn.imooc.com//climg/5dee236a0911510f15800723.jpg

http://img1.sycdn.imooc.com//climg/5dee239609e9efe604190220.jpg

可以看出, 由于stars盒子宽高为0, 图片中四个边框的交点位置,就是内容的位置,所以显示的这两个伪类从内容位置开始显示,覆盖到边框上了。

2、又因为每个伪元素都设置了绝对定位,脱离了标准流不占位置,所以after就覆盖了before,可以将定位去掉再看一下:

http://img1.sycdn.imooc.com//climg/5dee244309a7927002140191.jpg

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

好帮手慕粉 2019-12-09 10:50:50

同学你好,关于同学的问题解答如下:

1、before和after是有顺序的,当不给伪元素设置宽高和边框时,让其由内容撑开显示的就是是一个在前,一个在后的。例:

http://img1.sycdn.imooc.com//climg/5dedb520093e2d3305300500.jpg

http://img1.sycdn.imooc.com//climg/5dedb53909677c1a04140419.jpg

因为同学给伪元素设置了高度和定位等,所以就按照同学设置的进行排列了。

2、一般我们是不会使用到上面那种方法的,都是通过伪元素来实现小图标等,这个时候就要设置定位,同学现阶段会使用就可以了。

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

  • 提问者 幕布斯3322991 #1
    老师回答的内容,我是理解的。但是我希望追问的是,我提问的问题中,伪元素的默认定位是为什么是如此呈现的?
    2019-12-09 11:26:13
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师