Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CSS 奇思妙想 | 巧妙的实现带圆角的三角形

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

作者头像
Sb_Coco
发布于 2021-07-15 01:51:34
发布于 2021-07-15 01:51:34
5.1K014
代码可运行
举报
文章被收录于专栏:Coco的专栏Coco的专栏
运行总次数:14
代码可运行

之前在这篇文章中 -- 《老生常谈之 CSS 实现三角形》,介绍了 6 种使用 CSS 实现三角形的方式。

但是其中漏掉了一个非常重要的场景,如何使用纯 CSS 实现带圆角的三角形呢?,像是这样:

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

法一. 全兼容的 SVG 大法

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

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

代码量非常少,核心代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<svg  width="250" height="250" viewBox="-50 -50 300 300">
  <polygon class="triangle" stroke-linejoin="round" points="100,0 0,200 200,200"/>
</svg>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.triangle {
    fill: #0f0;
    stroke: #0f0;
    stroke-width: 10;
}

实际图形如下:

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

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

我们实际是通过一个带边框,且边框连接类型为 stroke-linejoin: round 的多边形生成圆角三角形的

如果,我们把底色和边框色区分开,实际是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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 有一个固定的公式:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div></div>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
div {
    width:  10em;
    height: 10em;
    transform: rotate(-60deg) skewX(-30deg) scale(1, 0.866);
}
  1. 将其中一个角变成圆角:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
div {
    width:  10em;
    height: 10em;
    transform: rotate(-60deg) skewX(-30deg) scale(1, 0.866);
  + border-top-right-radius: 30%;
}

至此,我们就顺利的得到一个带圆角的菱形了!

拼接 3 个带圆角的菱形

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

完整的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div></div>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 方便理解):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div></div>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
div {
    width: 200px;
    height: 200px;
    transform: rotate(30deg) skewY(30deg) scaleX(0.866);
    border: 1px solid #000;
    border-radius: 20%;
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 即可得到一个圆角三角形:

由于这两个元素重叠空间的特殊结构,此时,给两个伪元素添加同一个渐变色,会完美的叠加在一起:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
div::before,
div::after, {
    background: linear-gradient(#0f0, #03a9f4);
}

最终得到一个渐变圆角三角形:

上述各个图形的完整代码,你可以戳这里:CodePen Demo -- A triangle with rounded and gradient background

最后

本文介绍了几种在 CSS 中实现带圆角三角形的方式,虽然部分有些繁琐,但是也体现了 CSS ”有趣且折磨人“ 的一面,具体应用的时候,还是要思考一下,对是否使用上述方式进行取舍,有的时候,切图也许是更好的方案。

好了,本文到此结束,希望对你有帮助 ?

更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用css画一个三角形
代码如下:原理是设置宽高为0,只设置border-style:solid和border-width、border一个的颜色。这时得到的效果就是一个三角形,如果位置不对,可以用rotate进行角度转化。
用户1149564
2021/03/19
6790
【CSS】CSS特效集锦,视觉魔法的碰撞与融合(一)
在本文中我讲述了7种CSS的特效,它们也许看起来并不惊艳,但是我认为却足够传达本文的理念:编写一些特殊的CSS样式的时候需要不拘于常理,要用特殊的认识角度看待标签和样式属性,从而用「绕个弯」的方式达到效果。
啦啦啦321
2019/09/27
2.2K0
CSS画各种图形(五角星、吃豆人、太极图等)
这里说的用css做图形,其实是使用一个html元素,结合它的伪元素 ::before & ::after (不需要其他额外的非伪元素的html元素),然后定义样式来生成所需的图形。
Javanx
2019/09/04
2.1K0
CSS画各种图形(五角星、吃豆人、太极图等)
CSS绘制三角形和箭头,不用再用图片了
还在用图片制作箭头,三角形,那就太lou了。css可以轻松搞定这一切,而且颜色大小想怎么变就怎么变,还不用担心失真等问题。 先来看看这段代码:
Javanx
2019/09/04
2.2K0
纯CSS实现 | yoyo摸鱼(click)
掘金是一个技(摸)术(鱼)社区,每天上班开机第一时间就是打开掘金快乐的学(摸)习(鱼),借着代码块的功能推出,今天来用自己的渣渣CSS试着画一下yoyo摸鱼(click)
jayjay
2022/11/02
4820
纯CSS实现 | yoyo摸鱼(click)
前端|如何用HTML打印一个六边形
六边形在我们网页的制作中,运用得并不是特别广泛。但在一些制作精美,要求创新的一些网页上,我们还是不难看到六边形的身影,如下图1.1所示。用六边形组合的蜂窝状图形,相对来说可能运用的范围应该是最广的。下面我们就来介绍一下如何用HTML打印六边形吧。
算法与编程之美
2019/11/07
1.2K0
前端|如何用HTML打印一个六边形
css画三角形
若我们只想要一个三角形,可以把其他三个三角形的颜色变白,那就只剩下一个。css中有这样一个属性,transparent,背景透明。这样便可以达到我们的目的了。
全栈程序员站长
2022/09/07
1K0
css画三角形
纯CSS画三角形
之前遇到过的问题如果查了然后懂了,然后没有及时复盘思考,就很容易还回去,今天把许久之前的这个知识点再整理一下,一是加深自己的记忆,二也是让初学者更容易懂。
全栈程序员站长
2022/09/12
9830
纯CSS画三角形
不同样式tooltip对话框小三角的css实现
开发过程中已经遇到过好多次需要手动实现 tooltip 样式了,这里就总结下,以便未来更好的复制粘贴。
用户4456933
2021/07/12
2.2K0
不同样式tooltip对话框小三角的css实现
带三角形的进度条 原
(adsbygoogle = window.adsbygoogle || []).push({});
tianyawhl
2019/04/04
8120
带三角形的进度条
                                                                            原
CSS实现图形效果
CSS实现正方形、长方形、圆形、半圆、椭圆、三角形、平行四边形、菱形、梯形、六角星、五角星、心形、消息框。
WindRunnerMax
2020/09/01
2.4K0
一张图不用,纯CSS 做个生日贺卡
朋友生日了,直接画,炫技并且表示本人闲的全身疼才会去拿CSS画画,以此嘲弄对方的加班:
1_bit
2022/06/12
5830
一张图不用,纯CSS 做个生日贺卡
CSS画三角形及其原理
其实使用CSS代码绘制三角形,只是对盒子模型中的”border”属性的简单应用。盒子模型将HTML元素划分为内容(Content)、填充(Padding)、边框(Border)和边界(Margin)四部分,参照下图。
全栈程序员站长
2022/09/12
8660
CSS画三角形及其原理
CSS 奇思妙想边框动画
今天逛博客网站 -- shoptalkshow[1],看到这样一个界面,非常有意思:
微芒不朽
2022/09/13
9520
【CSS3】CSS3 2D 转换 - rotate 旋转 ② ( 使用 rotate 旋转绘制三角形 )
一、使用 rotate 旋转绘制三角形 ---- 使用 rotate 旋转绘制三角形 的原理 : 先绘制正方形 , 为该正方形设置边框 , 只设置 右侧 和 下方的 边框 , div { width: 40px; height: 40px; border-right: 2px solid black; border-bottom: 2px solid black; } 如果要一
韩曙亮
2023/04/24
4940
【CSS3】CSS3 2D 转换 - rotate 旋转 ② ( 使用 rotate 旋转绘制三角形 )
手撸一个在线css三角形生成器
为了提高 前端开发 效率, 笔者先后写了上百个前端工具, 有些是给公司内部使用的, 有些单纯是因为自己太“懒”, 不想写代码, 所以才“被迫”做的. 接下来介绍的一款工具——css三角形生成器也是因为之前想要解放设计师的生产力, 自己又懒得切图或者写css代码, 所以想来想去还是自己做一个能自动生成css三角形代码的工具吧.
徐小夕
2020/12/18
8010
css 画三角形
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148063.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
8240
使用CSS画一个三角形
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147767.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/02
5030
使用CSS画一个三角形
CSS画圆、三角形、品字、骰子
让 border-radius属性的值等于盒子高度的一半就行(当然,盒子得是正方形才能得到圆,否则便不是圆)
赤蓝紫
2023/01/05
1.3K0
CSS画圆、三角形、品字、骰子
css绘制三角形
青年时鲁莽,老年时悔恨——富兰克林 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title>
阿超
2023/02/25
8990
css绘制三角形
相关推荐
用css画一个三角形
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验