当前位置: 首页 > 科技观察

CSS奇思妙想-圆角三角形的巧妙实现

时间:2023-03-21 14:51:28 科技观察

本文前面的文章——《老生常谈之 CSS 实现三角形》[1],介绍了6种用CSS实现三角形的方法。但是漏掉了一个很重要的场景,如何用纯CSS实现圆角三角形?,像这样:本文将介绍几种实现圆角三角形的方法。方法一、完全兼容SVG方法如果要生成圆角三角形,用最少的代码生成三角形最好的方法就是使用SVG。使用SVG的多边形标签生成三角形,使用SVG的stroke-linejoin="round"在连接处生成圆角。代码量很少,核心代码如下:.triangle{fill:#0f0;stroke:#0f0;stroke-width:10;}实际图形如下:stroke-linejoin的帮助:SVG多边形圆角的圆形属性,什么是stroke-linejoin?用于控制两条描边线段之间的距离,共有三个可选值:miter为默认值,表示在接缝处使用方形笔刷形成尖角;round表示使用圆角连接。平滑效果的斜角连接将形成斜接。我们实际上是通过一个带边框的多边形生成一个圆角三角形,边框连接类型是stroke-linejoin:round。如果我们把背景颜色和边框颜色区分开来,其实是这样的:如何控制圆角的大小呢?这也很简单。通过控制stroke-width的大小,可以改变圆角的大小。当然,要保持三角形大小一致,需要在增加/减少stroke-width的同时减少/增加图形的宽度/高度:完整的DEMO可以点这里:CodePenDemo--UsingSVGtoRealizea圆角三角形[2]方法二、图形拼接不过上面说了用纯CSS实现圆角三角形,不过上面的第一种方法其实是借助了SVG。那么有没有办法只使用CSS呢?当然,发散思维,CSS有趣的地方就在这里,配合一张图,可以有很多妙招!看一下,一个圆角三角形,其实可以拆分成几个部分:那么,其实我们只需要能够画出这样一个圆角的菱形,通过三次旋转叠加,就可以得到一个圆角三角形:画一个圆角菱形那么,接下来我们的目标就是画一个圆角菱形。有很多方法。本文给出其中一种方法:1、首先,将正方形变成菱形。有固定公式使用transform:

/div>div{width:10em;height:10em;transform:rotate(-60deg)skewX(-30deg)scale(1,0.866);}2.转其中一个将角变成圆角:div{width:10em;height:10em;transform:rotate(-60deg)skewX(-30deg)scale(1,0.866);+border-top-right-radius:30%;}至此,我们就成功得到了一个圆角菱形!匹配3个圆角菱形很简单,我们只需要利用元素的另外两个伪元素生成2个圆角菱形,用旋转和位移拼接一共3个图形!完整代码如下:}div,div:before,div:after{width:10em;height:10em;border-top-right-radius:30%;}div{transform:rotate(-60deg)skewX(-30deg)scale(1,.866);}div:before{transform:rotate(-135deg)skewX(-45deg)scale(1.414,.707)translate(0,-50%);}div:after{transform:rotate(135deg)skewY(-45deg)scale(.707,1.414)translate(50%);},就可以得到一个圆角三角形!效果如下:完整代码可以点击这里:CodePenDemo--Atrianglewithrounded[3]方法三。图形拼接实现渐变圆角三角形?不!上面的方案虽然不是太复杂,但有一点不完美就是不能支持渐变圆角三角形。像这样:如果需要实现一个渐变的圆角三角形,还是有点复杂。但仍有人对其进行了修补。以下方法参考——如何在CSS中制作三角圆角三角形[4]。也是使用多个块进行拼接,但是这次我们的基础图形会很复杂。首先我们要实现这样一个容器框,和上面的方法类似,可以理解为一个圆角的菱形(为了便于理解画出边框):
div{width:200px;height:200px;transform:rotate(30deg)skewY(30deg)scaleX(0.866);border:1pxsolid#000;border-radius:20%;}接下来我们同样使用两个伪元素来实现两个略显怪异的拼接graphics,它是transform的各种用法的集合:div::before,div::after{content:"";position:absolute;width:200px;height:200px;}div::before{border-radius:20%20%20%55%;变换:scaleX(1.155)skewY(-30deg)rotate(-30deg)translateY(-42.3%)skewX(30deg)scaleY(0.866)translateX(-24%);background:red;}div::after{border-radius:20%20%55%20%;background:blue;transform:scaleX(1.155)skewY(-30deg)rotate(-30deg)translateY(-42.3%)skewX(-30deg)scaleY(0.866)translateX(24%);}为了方便理解,做了一个简单的变换动画:其实质就是实现这样一个图形:finally,给父元素添加一个overflow:hidden,去掉父元素的border,得到一个圆角三角形:由于这两个元素重叠空间的特殊结构,此时,添加相同的渐变色到两个伪元素会完美重叠:div::before,div::after,{background:linear-gradient(#0f0,#03a9f4);}最后得到一个渐变圆角三角形:完整代码以上图形,你可以点击这里:CodePenDemo--Atrianglewithroundedandgradientbackground[5]最后,本文介绍几种在CSS中实现圆角三角形的方法。虽然有些比较繁琐,但也体现了CSS“有趣又折磨人”的一面。到具体应用的时候,还是需要自己思考的。选择是否使用上面的方法,有时候,裁剪图片可能是更好的解决方法参考[1]《老生常谈之 CSS 实现三角形》:https://juejin.cn/post/6950081305560219679[2]CodePenDemo——用SVG实现Trianglewith圆角:https://codepen.io/Chokcoco/pen/eYWZvKo[3]CodePen演示——带圆角的三角形:https://codepen.io/Chokcoco/pen/vYmLVZr[4]Howtomake3-corner-CSS中的圆角三角形:https://stackoverflow.com/questions/14446677/how-to-make-3-corner-rounded-triangle-in-css[5]CodePen演示——具有圆形和渐变背景的三角形:https://codepen.io/Chokcoco/pen/LYyGRpV[6]Github——iCSS:https://github.com/chokcoco/iCSS