只用1个div,你能用CSS常规属性绘制:正3、4、5、6、7、8边形吗?

本文介绍了如何仅使用CSS和一个div,通过border及伪元素来绘制正三角形至正八边形。通过三角函数计算各边长度,详细解析了每个形状的实现原理。此外,还展示了如何为这些形状添加动画效果,让CSS变得既有趣又有挑战性。
摘要由CSDN通过智能技术生成
640?wx_fmt=png

关注前端达人,与你共同进步


640?wx_fmt=jpeg

开篇


今天我们来玩一个有趣的CSS实验,想象下,只用一个div,你能用CSS绘制一个正三角形,正方形,正五边形,正六边形,正七边形,正八边形吗?


也许此时你想了好几种方法进行实现,比如clip-path,渐变等(感谢鱼头的Web海洋的号主——KRIS不只是一只?鱼头提议的方法)。不过本篇文章将用大家熟悉的CSS属性border结合伪元素before、after进行实现。


由于正多边形用到不少三角函数计算,为了方便计算,这里正多边形的边统一设定为100像素。


本篇文章阅读时间预计15分钟。


内容来源:https://www.oxxostudio.tw/articles/201503/css-regular-polygon-transform.html

作者:oxxostudio

注:由于网站是繁体内容,由于话术差异再结合本公众号风格的基础上做了调整,文中的内容和例子笔者都做了验证无误。


01

正三角形

正三角形不需要用到伪元素,只需要设定div本身的边框宽度即可产生,先来看一下正三角形的边长与中线,若边长为100px,则中线四舍五入就是87px(100 x sin( 60)= 87)。

640?wx_fmt=jpeg

因此我们要将div的长宽都设为0,接着把底部border的宽度设为为87px,左右的border width度设为50px(颜色设为透明),就可以做出一个漂亮的三角形。

.a{
   
width:0;
height:0;
border-width:0 50px 87px ;
border-style:solid;
border-color:transparent transparent #095;
}
640?wx_fmt=jpeg


02

正方形

正方形应该是最简单的,只要设定长宽设定为同样数值就可以了,不过其实还有另外两种方法,第一种你可以把长宽设为0,把上下左右的border设为50px也可以,第二种则是高度设为0,宽度设为100px,然后某个边宽也设为100,都是可以的。

.a{
   
width:100px;
height:100px;
background:#c00;
}
.b{
width:0;
height:0;
border-width:50px;
border-style:solid;
border-color:#095;
}
.c{
width:100px;
height:0;
border-width:0 0 100px;
border-style:solid;
border-color:#069;
}
640?wx_fmt=jpeg


03

正五边形

正五边形就需要进入基本的三角函数领域了,其实知道了原理还是蛮简单的。让我们先把正五边形分解,用原本的div作为上方的三角形,然后用一个伪元素制作下方的梯形,因为正五边形每边的夹角为108度,所以可以藉由三角函数计算出上方三角形的高度为59px ( 100 x cos(54) ),宽度为192px ( 100 x sin(54) x 2 ),下方梯形的高度为95px ( 100 x sin(72) ),长边的宽度跟上面的三角形一样都是192px。

640?wx_fmt=jpeg

了解原理之后,就可以利用伪元素来搭配制作啰!

.a{
   
position:relative;
width:0;
height:0;
border-width:0 81px 59px;
border-style:solid;
border-color:transparent transparent #069;
}
.a:before{
position:absolute;
content:"";
top:59px;
left:-81px;
width:100px;
height:0;
background:none;
border-width:95px 31px 0;
border-style:solid;
border-color:#069 transparent transparent;
}
640?wx_fmt=jpeg


04

正六边形

正六边形的每个夹角是120度,如果以纯CSS的方向来看的话,就是把正五边形上面的三角形改变一下,就可以做出正六边形,也就是变成上下两个梯形的组合而已,梯形的长边为200px ( 100 x cos(60) x 2 + 100 ),梯形的高度为87px ( 100 x sin(60) )。

640?wx_fmt=jpeg

所以只要把正五边形的CSS稍作修改就可以做出正六边形了。

.a{
   
position:relative;
width:100px;
height:0;
border-width:0 50px 87px;
border-style:solid;
border-color:transparent transparent #f80;
}
.a:before{
position:absolute;
content:"";
top:87px;
left:-50px;
width:100px;
height:0;
background:none;
border-width:87px 50px 0;
border-style:solid;
border-color:#f80 transparent transparent;
}
640?wx_fmt=jpeg


05

正七边形

正七边形开始就必须再使用after 这个伪元素了,因为正七边形必须要拆解为三个区块,分别是用原本的div作为上面的三角形,一个伪元素作为中间的梯形,然后另一个伪元素作为底部的梯形,正七边形的夹角比较特殊不是整数,而是128又4/7 度,大概取到小数第二位是128.57,所以计算起来结果就如下图所示,重点就是必须要清楚地知道长宽是多少。

640?wx_fmt=jpeg

有了长宽之后,就开始用CSS来写啰!

.a{
   
position:relative;
width:0;
height:0;
border-width:0 90px 43px;
border-style:solid;
border-color:transparent transparent #09c;
}
.a:before{
position:absolute;
content:"";
top:140px;
left:-112px;
width:100px;
height:0;
border-width:78px 62px 0;
border-style:solid;
border-color:#09c transparent transparent;
}
.a:after{
position:absolute;
content:"";
top:43px;
left:-112px;
width:180px;
height:0;
border-width:0 22px 97px;
background:none;
border-style:solid;
border-color:transparent transparent #09c
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值