飞灰同学

书山有路勤为径,学海无涯苦作舟

最近出去面试,面到了某一家主营低代码页面搭建的互联网公司,其中有道面试题是如何用 CSS 画五角星。我个人的 CSS 水平不怎么高,没有完整地回答出这个问题,于是回来查漏补缺地记录一下。

面试题里给了一个类名为 star 的 DOM 节点,以下的方案都基于这个 DOM 节点实现。

html
<div class="star"></div>

clip-path

在面试的时候,我想到的方案是 clip-path 属性,但我没怎么在项目中使用过这个属性,不太清楚怎么使用,面试官也一再追问实现的细节,然后这题就被 OVER 了 🤪。

如果翻译 clip-path 这个单词,会翻译成剪切路径,这个名词来源于 Photoshop 这一类的设计软件。在 Photoshop 里,剪切路径用于定义一个图像区域的可视部分,非路径区域内的部分将被隐藏。在 CSS 中也是如此,clip-path 支持多种形式的裁剪节点的可显示区域,比如:圆形、矩形、多边形等。

而五角星就是个多边形,所以可以将五角星的每个顶点( 对应 x, y 上的坐标点,支持百分比 )作为参数,传入到 clip-pathpolygon 函数来画出一个五角星。

css
.star {
  display: inline-block;
  width: 200px;
  height: 200px;
  background-color: gold;
  clip-path: polygon(
    50% 0%,
    61% 35%,
    98% 35%,
    68% 57%,
    79% 91%,
    50% 70%,
    21% 91%,
    32% 57%,
    2% 35%,
    39% 35%
  );
}

最终效果:clip-path pentagram

多个三角形拼接

除了 clip-path 属性,还可以通过 CSS 画三角形的逻辑,将多个三角形拼接成一个五角星。

pentagram

css
.star {
  position: relative;
  margin: 80px 0;
  border-style: solid;
  border-width: 0 100px 70px 100px;
  border-color: transparent transparent gold transparent;
  transform: rotate(35deg);
}

.star:before {
  position: absolute;
  content: '';
  top: -45px;
  left: -65px;
  border-style: solid;
  border-width: 0 30px 80px 30px;
  border-color: transparent transparent gold transparent;
  transform: rotate(-35deg);
}

.star:after {
  position: absolute;
  content: '';
  top: 3px;
  left: -105px;
  border-style: solid;
  border-width: 0 100px 70px 100px;
  border-color: transparent transparent gold transparent;
  transform: rotate(-70deg);
}

参考资料

上一篇:Typescript 学习 —— 函数重载, 泛型, 类型守卫, 抽象类

下一篇:Typescript 学习 —— 数据类型,交叉类型,联合类型