在网页开发过程中,很多时候需要绘制五角星这类特殊图形,不需要额外引入图片资源,借助CSS3的相关特性就能轻松实现。不同的实现方式背后的原理有所区别,适用场景也各不相同。

伪元素拼接实现五角星
这种方式的原理是利用两个三角形伪元素叠加,拼接出五角星的形状。首先给容器设置相对定位,然后分别用::before和::after伪元素生成两个等边三角形,通过旋转调整位置完成拼接。
具体实现步骤如下:
- 设置容器的基础宽高和背景色,作为五角星的显示区域
- 用
::before伪元素生成一个向下的三角形,调整位置和层级 - 用
::after伪元素生成一个向上的三角形,旋转后叠加到合适位置
/* 五角星容器 */
.star {
width: 0;
height: 0;
position: relative;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 35px solid #ff9800;
margin: 50px auto;
}
/* 上方三角形伪元素 */
.star::before {
content: "";
width: 0;
height: 0;
position: absolute;
top: 20px;
left: -50px;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 35px solid #ff9800;
transform: rotate(72deg);
transform-origin: 50px 35px;
}
/* 下方三角形伪元素 */
.star::after {
content: "";
width: 0;
height: 0;
position: absolute;
top: 20px;
left: -50px;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 35px solid #ff9800;
transform: rotate(-72deg);
transform-origin: 50px 35px;
}
clip_path裁剪实现五角星
这种方式的原理是利用CSS3的clip_path属性,直接按照五角星的路径裁剪元素,只需要一个普通的元素就能生成五角星,代码更简洁。
clip_path的polygon函数可以定义多个坐标点,五角星的十个顶点坐标计算完成后传入,就能裁剪出对应形状。需要注意的是clip_path的兼容性在旧版本浏览器中稍差,如果需要兼容IE等旧浏览器不建议使用。
/* clip_path实现五角星 */
.star-clip {
width: 100px;
height: 100px;
background-color: #ff5722;
/* 五角星路径坐标,百分比为单位适配不同尺寸 */
clip-path: polygon(
50% 0%,
61% 35%,
98% 35%,
68% 57%,
79% 91%,
50% 70%,
21% 91%,
32% 57%,
2% 35%,
39% 35%
);
margin: 50px auto;
}
旋转叠加实现五角星
这种方式的原理是生成一个正方形,通过伪元素旋转叠加出五角星的五个角,适合需要动态调整五角星颜色和尺寸的场景。
先生成一个黄色的正方形作为五角星的一个角,然后通过::before和::after伪元素旋转不同角度,叠加出完整的五角星形状,调整旋转角度和位置即可。
/* 旋转叠加实现五角星 */
.star-rotate {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid #ffc107;
position: relative;
margin: 50px auto;
}
.star-rotate::before {
content: "";
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid #ffc107;
position: absolute;
top: 30px;
left: -50px;
transform: rotate(72deg);
transform-origin: 50px 100px;
}
.star-rotate::after {
content: "";
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid #ffc107;
position: absolute;
top: 30px;
left: -50px;
transform: rotate(-72deg);
transform-origin: 50px 100px;
}
不同实现方式对比
三种实现方式的特性对比如下:
| 实现方式 | 原理 | 兼容性 | 代码复杂度 |
|---|---|---|---|
| 伪元素拼接 | 两个三角形伪元素旋转叠加 | 较好,支持大部分现代浏览器和旧版本浏览器 | 中等 |
| clip_path裁剪 | 直接按五角星路径裁剪元素 | 一般,不支持IE浏览器 | 低 |
| 旋转叠加 | 正方形伪元素旋转生成五个角 | 较好,支持大部分浏览器 | 中等 |
实际开发注意事项
在实际项目中实现五角星样式时,需要注意以下几点:
- 如果需要兼容旧版本浏览器,优先选择伪元素拼接或者旋转叠加的方式
- 如果只需要支持现代浏览器,优先选择
clip_path方式,代码更简洁易维护 - 五角星的尺寸和颜色可以通过调整CSS变量动态修改,方便适配不同场景
- 如果需要在五角星中添加文字或者其他内容,建议选择
clip_path方式,容器本身还是普通盒模型,内容不会被裁剪
通过以上几种实现方式和原理解析,开发者可以根据项目的实际需求和浏览器兼容要求,选择最合适的方案来实现网页中的五角星样式。