关于前端:CSS-奇思妙想-巧妙的实现带圆角的三角形

6次阅读

共计 3306 个字符,预计需要花费 9 分钟才能阅读完成。

之前在这篇文章中 —《陈词滥调之 CSS 实现三角形》,介绍了 6 种应用 CSS 实现三角形的形式。

然而其中漏掉了一个十分重要的场景,如何应用纯 CSS 实现带圆角的三角形呢?,像是这样:

本文将介绍几种实现带圆角的三角形的实现形式。

法一. 全兼容的 SVG 大法

想要生成一个带圆角的三角形,代码量起码、最好的形式是应用 SVG 生成。

应用 SVG 的 多边形标签 <polygon> 生成一个三边形,应用 SVG 的 stroke-linejoin="round" 生成连接处的圆角。

代码量非常少,外围代码如下:

<svg  width="250" height="250" viewBox="-50 -50 300 300">
  <polygon class="triangle" stroke-linejoin="round" points="100,0 0,200 200,200"/>
</svg>
.triangle {
    fill: #0f0;
    stroke: #0f0;
    stroke-width: 10;
}

理论图形如下:

这里,其实是借助了 SVG 多边形的 stroke-linejoin: round 属性生成的圆角,stroke-linejoin 是什么?它用来管制两条描边线段之间,有三个可选值:

  • miter 是默认值,示意用方形画笔在连接处造成尖角
  • round 示意用圆角连贯,实现平滑成果
  • bevel 连接处会造成一个斜接

咱们理论是 通过一个带边框,且边框连贯类型为 stroke-linejoin: round 的多边形生成圆角三角形的

如果,咱们把底色和边框色辨别开,理论是这样的:

.triangle {
    fill: #0f0;
    stroke: #000;
    stroke-width: 10;
}

通过 stroke-width 管制圆角大小

那么如何管制圆角大小呢?也非常简单,通过管制 stroke-width 的大小,能够扭转圆角的大小。

当然,要放弃三角形大小统一,在增大 / 放大 stroke-width 的同时,须要放大 / 增大图形的 width/height

残缺的 DEMO 你能够戳这里:CodePen Demo — 应用 SVG 实现带圆角的三角形

法二. 图形拼接

不过,上文提到了,应用纯 CSS 实现带圆角的三角形,然而上述第一个办法其实是借助了 SVG。那么仅仅应用 CSS,有没有方法呢?

当然,发散思维,CSS 有意思的中央正在于此处,用一个图形,可能有十分多种奇妙的解决方案!

咱们看看,一个圆角三角形,它其实能够被拆分成几个局部:

所以,其实咱们只须要可能画出一个这样的带圆角的菱形,通过 3 个进行旋转叠加,就能失去圆角三角形:

绘制带圆角的菱形

那么,接下来咱们的指标就变成了绘制一个带圆角的菱形,办法有很多,本文给出其中一种形式:

  1. 首先将一个正方形变成一个菱形,利用 transform 有一个固定的公式:

<div></div>
div {
    width:  10em;
    height: 10em;
    transform: rotate(-60deg) skewX(-30deg) scale(1, 0.866);
}

  1. 将其中一个角变成圆角:

    div {
     width:  10em;
     height: 10em;
     transform: rotate(-60deg) skewX(-30deg) scale(1, 0.866);
      + border-top-right-radius: 30%;
    }

至此,咱们就顺利的失去一个带圆角的菱形了!

拼接 3 个带圆角的菱形

接下来就很简略了,咱们只须要利用元素的另外两个伪元素,再生成 2 个带圆角的菱形,将一共 3 个图形旋转位移拼接起来即可!

残缺的代码如下:

<div></div>
div{
    position: relative;
    background-color: orange;
}
div:before,
div:after {
    content: '';
    position: absolute;
    background-color: inherit;
}
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%);
}

就能够失去一个圆角三角形了!成果如下:

残缺的代码你能够戳这里:CodePen Demo — A triangle with rounded

法三. 图形拼接实现渐变色圆角三角形

完了吗?没有!

上述计划,尽管不算太简单,然而有一点还不算太完满的。就是无奈反对渐变色的圆角三角形。像是这样:

如果须要实现渐变色圆角三角形,还是有点简单的。但真就还有人鼓捣进去了,下述办法参考至 — How to make 3-corner-rounded triangle in CSS。

同样也是利用了多块进行拼接,然而这次咱们的根底图形,会十分的简单。

首先,咱们须要实现这样一个容器外框,和上述的办法比拟相似,能够了解为是一个圆角菱形(画出 border 不便了解):

<div></div>
div {
    width: 200px;
    height: 200px;
    transform: rotate(30deg) skewY(30deg) scaleX(0.866);
    border: 1px solid #000;
    border-radius: 20%;
}

接着,咱们同样应用两个伪元素,实现两个稍显怪异的图形进行拼接,算是对 transform 的各种用法的合集:

div::before,
div::after {
    content: "";
    position: absolute;
    width: 200px;
    height: 200px;
}
div::before {
    border-radius: 20% 20% 20% 55%;
    transform: 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%);
}

为了不便了解,制作了一个简略的变换动画:

实质就是实现了这样一个图形:

最初,给父元素增加一个 overflow: hidden 并且去掉父元素的 border 即可失去一个圆角三角形:

因为这两个元素重叠空间的非凡构造,此时,给两个伪元素增加同一个渐变色,会完满的叠加在一起:

div::before,
div::after, {background: linear-gradient(#0f0, #03a9f4);
}

最终失去一个突变圆角三角形:

上述各个图形的残缺代码,你能够戳这里:CodePen Demo — A triangle with rounded and gradient background

最初

本文介绍了几种在 CSS 中实现带圆角三角形的形式,尽管局部有些繁琐,然而也体现了 CSS”乏味且折磨人“的一面,具体利用的时候,还是要思考一下,对是否应用上述形式进行取舍,有的时候,切图兴许是更好的计划。

好了,本文到此结束,心愿对你有帮忙 :)

想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 — iCSS 前端趣闻 😄

更多精彩 CSS 技术文章汇总在我的 Github — iCSS,继续更新,欢送点个 star 订阅珍藏。

如果还有什么疑难或者倡议,能够多多交换,原创文章,文笔无限,满腹经纶,文中若有不正之处,万望告知。

正文完
 0