前言
前2天和同事聊天的时候,被问到如何利用CSS手绘一个 5角星 图形,简单思考了下,想出了个比较简易的办法,详细分析见下文
分析
我们先来观察下5角星,发现它有以下几个特征:
- 有5个角,对应5个三角形
- 每个三角形都是等边三角形
- 每个三角形之间间隔同样的角度,并按圆形排列
结合上述特征,就可以把问题进行切割,分解成下面几步:
- 创建5个一样的等边三角形
- 把每个三角形按(360°/5 = 72°)进行间隔排列
- 给最后的中心空白区域位置填色
实现
创建三角形
我们利用 border 法画三角形,进行三角形绘制之前,得先搞懂一个图,如下所示:
分析上图,蓝色三角形(bottom)其实从它的顶点垂直下来一条线为准,将蓝色三角形分为左右两个小三角形,左边小三角形底边受left值影响,右边小三角形底边受right值影响,其它三角形也一样。
根据上述规则, 我们可以很方便得到一个角度为60°的等边三角形:
- 指定bottom border的宽度,举例我们设为100px
- 由于要创建一个 角度为指定角度(60°)的等边三角形,我们把三角形对分,成为2个直角三角形,这样,我们就有了一个指定为 30°的角和一个给定的bottom 值,通过勾股定理公式:
tan30°= X/(bottom值)
,很容易得到X的值,这样我们就确定了 left 和 right 的值为 √3/3*100px ≈ 58px
具体的代码如下所示:
1 | div{ |
按圆形排列三角形
上面我们得到了我们想要的三角形,接下来我们就把他们按72°间隔进行排列,具体代码如下所示
1 | #div1 { |
填充图形中间位置颜色
多个三角形围城一圈会组成,一个空白的区域,我们需要把它填充为与边框同样的颜色
1 | #fill { |
注意: border 和 填充体的颜色都取 currentcolor
DEMO
DEMO链接地址(可在线测试): https://codepen.io/shellWolf/pen/YgxOVm
结语
增强自己的分解意识,还有更好的方法等待去探索。