技术知识文章集合TECHNICAL ARCHIVE · 457 DOCUMENTS

显示模式

登录
ARCHIVE DOCUMENTCSS

纯 CSS 实现三角形的方式

所属馆藏
CSS
文件格式
Markdown
原始路径
CSS/27-纯 CSS 实现三角形的 方式
本文目录7 个章节
  1. 1. border 边框
  2. 2. linear-gradient 线性渐变
  3. 3. clip-path
  4. 三种方案对比
  5. 选择建议
  6. 总结
  7. 参考资料

纯 CSS 实现三角形的方式

Category(分类): CSS Status: 未知

CSS 可以通过多种方式绘制基本形状。本文保留原文的三种方案:borderlinear-gradientclip-path,并补充每种方案的原理、限制和使用建议。

三种方案并不是 CSS 绘制三角形的全部方法。实际项目中还可以使用 mask、SVG 或图片等方式。本文示例主要关注不依赖额外图片资源的纯 CSS 实现。

1. border 边框

使用 CSS 绘制三角形的第一种方法是利用 border 属性。

当一个元素的宽度和高度都为 0 时,四条边框会在中心区域相交。每条边框会呈现为一个三角形,因此可以通过设置不同的边框颜色观察这个结构:

.triangle {
  width: 0;
  height: 0;
  border: 100px solid;
  border-color: orangered skyblue gold yellowgreen;
}

零尺寸元素的四个边框三角形

可以看到,四个边框分别形成了四个三角形。绘制单个三角形时,只保留一个方向的边框颜色,将其他边框设置为透明即可。

向下的三角形

如果想要一个指向下方的三角形,可以让上边框可见,其他边框透明:

.triangle {
  width: 0;
  height: 0;
  border-top: 50px solid skyblue;
  border-right: 50px solid transparent;
  border-left: 50px solid transparent;
}

使用 border 绘制的向下三角形

向右的三角形

如果想要一个指向右方的三角形,可以让左边框可见,其他边框透明:

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid skyblue;
  border-top: 50px solid transparent;
  border-bottom: 50px solid transparent;
}

使用 border 绘制的向右三角形

上面的代码也可以使用边框简写来表达:

.triangle {
  width: 0;
  height: 0;
  border-style: solid;
  border-color: transparent;
  border-width: 50px 0 50px 50px;
  border-left-color: skyblue;
}

使用 border 简写绘制三角形

不同方向和尺寸

通过调整各方向边框的宽度和颜色,可以绘制不同比例和方向的三角形。例如,下面的代码只显示上边框,同时保留右侧的透明边框,可以得到一个不对称的三角形:

.triangle {
  width: 0;
  height: 0;
  border-top: 100px solid skyblue;
  border-right: 100px solid transparent;
}

使用不同边框尺寸绘制的不对称三角形

如果希望结果更明确,建议显式写出所有边框的样式,避免继承或默认值造成误解:

.triangle {
  width: 0;
  height: 0;
  border-top: 100px solid skyblue;
  border-right: 100px solid transparent;
  border-bottom: 0 solid transparent;
  border-left: 0 solid transparent;
}

等边三角形

通过设置两个相等的透明边框和一个有颜色的底边,可以近似绘制等边三角形:

.triangle {
  width: 0;
  height: 0;
  border-left: 69px solid transparent;
  border-right: 69px solid transparent;
  border-bottom: 120px solid skyblue;
}

使用 border 绘制的等边三角形

理论上,等边三角形的高度应满足:

height = width × √3 / 2

示例中底边约为 138px,理论高度约为 119.5px,因此 120px 是一个近似值。

border 方案的特点

优点:

  • 代码量少;
  • 兼容性好;
  • 不需要额外的背景图片;
  • 很适合下拉箭头、提示框箭头和小型装饰图形。

限制:

  • 元素本身的内容盒宽高为 0,布局和点击区域需要额外考虑;
  • 形状尺寸由边框宽度决定,不如 clip-path 直观;
  • 对复杂形状和响应式比例不够灵活;
  • 作为交互图标时,需要额外提供语义和可访问名称。

2. linear-gradient 线性渐变

linear-gradient() 需要结合 background-image 使用。通过两个渐变色块,可以拼接出一个三角形。

第一步:绘制一个长方形

.triangle {
  width: 80px;
  height: 100px;
  background-repeat: no-repeat;
  outline: 1px solid skyblue;
}

线性渐变方案的基础长方形

第二步:添加一个渐变

下面的渐变会让元素的一部分呈现红色:

.triangle {
  background-image: linear-gradient(
    45deg,
    orangered 50%,
    transparent 50%
  );
}

添加一个线性渐变

第三步:调整渐变尺寸

为了让渐变只覆盖元素的一半,可以调整 background-size

.triangle {
  background-size: 100% 50%;
}

调整渐变背景尺寸

由于渐变角度和元素宽高比不同,形状可能不符合预期。可以调整渐变角度,使三角形的边界落在目标位置:

.triangle {
  background-image: linear-gradient(
    32deg,
    orangered 50%,
    transparent 50%
  );
}

调整渐变角度

这里的 32deg 是针对示例尺寸调试得到的值,不是适用于所有宽高的通用值。

第四步:添加镜像渐变

再添加一个镜像方向的渐变:

.triangle {
  background-image:
    linear-gradient(32deg, orangered 50%, transparent 50%),
    linear-gradient(148deg, orangered 50%, transparent 50%);
}

添加第二个镜像渐变

最后通过 background-position 分别调整两个渐变的位置:

.triangle {
  background-position: top left, bottom left;
}

调整两个渐变的位置

这样就得到了三角形效果。去掉调试用的 outline 后,完整代码如下:

.triangle {
  width: 160px;
  height: 200px;
  background-repeat: no-repeat;
  background-image:
    linear-gradient(32deg, orangered 50%, transparent 50%),
    linear-gradient(148deg, orangered 50%, transparent 50%);
  background-size: 100% 50%;
  background-position: top left, bottom left;
}

linear-gradient 方案的特点

线性渐变可以创建很多形状,也适合制作背景纹理和装饰效果。但它的缺点是:

  • 渐变角度和元素宽高比强相关;
  • 修改尺寸后可能需要重新调试角度;
  • 多层背景的定位和尺寸不够直观;
  • 维护成本通常高于 borderclip-path

如果只是绘制一个简单三角形,通常不建议优先选择这种方案;如果三角形是复杂背景的一部分,渐变则可能更合适。

3. clip-path

最后一种方法是 clip-path。它的代码通常更简洁,也更容易扩展为其他多边形。

clip-path 会定义元素的可见区域。浏览器不会绘制裁剪路径以外的区域,因此可以先创建一个带背景色的长方形,再将它裁剪成三角形。

现代 Chrome、Edge、Firefox 和 Safari 对 clip-path: polygon() 的支持已经较好,但如果项目需要兼容较旧浏览器,仍应提供降级方案。

clip-path 裁剪区域示意图

第一步:绘制长方形

.triangle {
  width: 80px;
  height: 100px;
  background-color: skyblue;
}

clip-path 方案的基础长方形

第二步:使用 polygon() 裁剪

下面绘制一个指向右侧的三角形:

.triangle {
  clip-path: polygon(0 0, 0 100%, 100% 50%);
}

polygon() 中的每一组坐标代表路径上的一个点。本例定义了三个点:

  • top-left (0 0):左上角;
  • bottom-left (0 100%):左下角;
  • right-center (100% 50%):右侧中心。

连接这三个点,就得到一个指向右方的三角形。

完整代码如下:

.triangle {
  margin: 100px;
  width: 160px;
  height: 200px;
  background-color: skyblue;
  clip-path: polygon(0 0, 0 100%, 100% 50%);
}

可以使用在线工具尝试 clip-path 并绘制不同的图形:Clippy

clip-path 的兼容性与注意事项

可以使用 @supports 检测当前浏览器是否支持:

.triangle {
  width: 160px;
  height: 200px;
  background: skyblue;
}

@supports (clip-path: polygon(0 0, 100% 0, 50% 100%)) {
  .triangle {
    clip-path: polygon(0 0, 100% 0, 50% 100%);
  }
}

需要注意:

  • clip-path 只裁剪视觉区域,不会自动改变元素的布局尺寸;
  • 裁剪区域以外的部分不可见,交互行为也应单独测试;
  • 复杂路径可能增加绘制成本;
  • 三角形如果只是装饰,应使用 aria-hidden="true" 或其他方式避免干扰屏幕阅读器;
  • 如果三角形表达“展开”“返回”等含义,应提供按钮名称或可访问文本。

三种方案对比

方案主要优点主要限制适合场景
border代码少、兼容性好尺寸和布局不够直观小箭头、气泡提示、简单三角形
linear-gradient可以与背景和纹理组合角度和尺寸关系复杂背景装饰、渐变图案
clip-path语义直观、容易扩展多边形旧浏览器需要降级组件形状、响应式图形
SVG形状和路径控制精确需要额外 SVG 标记或资源图标、复杂图形、需要可缩放的图形

选择建议

  1. 只需要一个简单的小三角形时,优先使用 border
  2. 三角形属于复杂背景的一部分时,可以使用 linear-gradient
  3. 需要响应式尺寸、复杂多边形或多个顶点时,可以使用 clip-path
  4. 需要精确控制路径、描边、填充和无障碍语义时,优先考虑 SVG;
  5. CSS 三角形只是视觉表现,不能代替按钮、链接等交互元素本身。

总结

CSS 可以通过多种方式绘制三角形。本文介绍了三种常见方案:

  • border:利用零尺寸元素的边框交汇区域绘制三角形,简单且兼容性最好;
  • linear-gradient:通过多个渐变背景拼接三角形,适合复杂背景,但依赖角度和尺寸调试;
  • clip-path:先绘制元素,再裁剪出三角形,表达清晰且容易扩展,现代浏览器支持较好。

如果只绘制一个普通箭头,border 通常已经足够;如果需要更强的形状控制,可以选择 clip-path 或 SVG。无论使用哪种方式,都应同时考虑响应式尺寸、布局、点击区域和可访问性。

参考资料

457 DOCUMENTS · 10 COLLECTIONS
ARCHIVE SEARCH457 篇文章

SEARCH GUIDE

输入关键词开始搜索

支持搜索文章标题、所属分类和原始文档路径。

按分类浏览

10 COLLECTIONS