CSS 三角形生成器

通过 border hack 生成任意方向的 CSS 三角形,选择方向、尺寸和颜色,即时获得可用的 CSS 代码。免费在线工具。

  • 在浏览器中处理
  • 数据不离开你的设备
  • 免费 · 无需注册
选择八个方向之一。四个角按钮生成直角三角形。
宽度为 1 到 500 之间的整数像素。上下方向会将奇数宽度分成向下与向上取整的两条边,例如 25px 分成 12px + 13px。
高度为 1 到 500 之间的整数像素。左右方向会将奇数高度分到上下两条透明边框。
选择颜色或输入 # 加六位十六进制数字。其他文字保留原颜色并显示提示。Ctrl/⌘+L 清空文本与结果,并保留尺寸、方向和颜色选择器。
复制完整的 .triangle 规则。width 与 height 为零,边框绘制三角形。复制失败会显示提示,可直接重试。

HTML 用法
复制固定的 triangle 类 div。使用其他选择器时,同时修改 HTML 与 CSS 中的类名。
<div class="triangle"></div>

调整任意控件即可预览三角形。

示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。

生成的 CSS 怎么读

生成的规则始终以 width: 0 和 height: 0 开始,元素没有内容区,整个盒子都由边框组成。上、右、下、左四个方向各用三条边框:两条透明边框合起来就是底边的长度,一条实色边框的宽度就是三角形的高。四个角方向只用两条边框:一条实色、一条透明,从矩形的一角切出一个直角三角形。复制后把 .triangle 换成自己的类名即可。

聊天气泡的小箭头

聊天界面里,对方的消息通常靠左、气泡上有一个朝左的小箭头,自己的消息靠右、箭头朝右。先做对方那一侧:方向选「左」,宽度 8、高度 12,颜色填气泡的白色 #ffffff:

.triangle {
  width: 0;
  height: 0;
  border-top: 6px solid transparent;
  border-bottom: 6px solid transparent;
  border-right: 8px solid #ffffff;
}

高度 12 被平分成上下两条 6px 的透明边框,右边框 8px 是箭头伸出的长度。自己那一侧方向选「右」,尺寸不变,颜色换成绿色 #95ec69:

.triangle {
  width: 0;
  height: 0;
  border-top: 6px solid transparent;
  border-bottom: 6px solid transparent;
  border-left: 8px solid #95ec69;
}

实际使用时不必多写一个 div,把这些声明放进气泡的伪元素,再用绝对定位挂到气泡外侧。箭头宽 8px,所以向左移出 8px:

.bubble-left {
  position: relative;
  background: #ffffff;
}
.bubble-left::before {
  content: "";
  position: absolute;
  top: 12px;
  left: -8px;
  width: 0;
  height: 0;
  border-top: 6px solid transparent;
  border-bottom: 6px solid transparent;
  border-right: 8px solid #ffffff;
}

右侧气泡同理,用 right: -8px 和朝右的那组边框。

奇数尺寸会让尖角偏半个像素

上一节如果把高度改成 13,两条透明边框就不能平分:工具按向下取整和向上取整拆成 6px 和 7px,两者之和仍是 13px,但尖角比正中偏上 0.5px。

.triangle {
  width: 0;
  height: 0;
  border-top: 6px solid transparent;
  border-bottom: 7px solid transparent;
  border-left: 8px solid #95ec69;
}

写成两条 6.5px 也没有用:浏览器会把边框宽度向下取整到整数个设备像素(CSS Backgrounds and Borders Level 3),在普通屏幕上底边会变成 12px。需要尖角正好居中时,上下方向用偶数宽度,左右方向用偶数高度。

全角字符不会改变颜色

颜色文本框只认 # 加六位半角十六进制。中文输入法全角状态下打出的 #ffffff 不符合格式,状态行会显示格式提示,颜色不变,CSS 里仍是原来的颜色。下面是默认颜色 #3b82f6 时,方向「右」、宽 8、高 12,输入全角白色之后的输出:

.triangle {
  width: 0;
  height: 0;
  border-top: 6px solid transparent;
  border-bottom: 6px solid transparent;
  border-left: 8px solid #3b82f6;
}

如果复制出的颜色和预期不符,先检查文本框里的 # 和字母是不是全角。

限制

  • 只有一种纯色。 一条边框只有一个颜色,做不出渐变、图片填充、描边,也没有沿斜边的 box-shadow。需要这些效果时,用 clip-path 生成器的 clip-path: polygon(50% 0, 100% 100%, 0 100%) 裁出形状。
  • 尺寸为 1 到 500 之间的整数像素。 宽度或高度为空、为 0、为负数、带小数或超过 500 时,生成的 CSS 下方显示错误,CSS 和预览清空,改回有效值后恢复。
  • 只能用像素。 边框宽度不能写百分比,所以边框三角形不会随容器缩放。
  • 颜色只接受 # 加六位十六进制。 三位或八位的码、颜色名和 rgba() 都会保留原颜色并显示提示。想用 currentColor 或 CSS 变量,复制后自己改。
  • HTML 片段固定为 <div class="triangle"></div>。 只起装饰作用的三角形对读屏软件没有意义;如果它是唯一表示状态的标记(比如展开箭头),状态还要写在文字或 aria-expanded 里。

常见使用场景

CSS 三角形常用于工具提示箭头、下拉菜单指示符、面包屑分隔符和聊天气泡的尾部。它只是几条边框,不用加载图片,颜色也能用 CSS 变量随主题切换。

FAQ

CSS 三角形的原理是什么?

把元素的 width 和 height 设为 0,元素就只剩边框。四条边框在角上按斜线相接,所以每条边框各是一个三角形或梯形。例如左右边框透明、下边框为实色,看到的就是一个朝上的三角形。

尖角为什么偏了半个像素?

工具输出的边框宽度都是整数像素。上下方向的三角形,两条透明边框之和必须等于宽度,所以奇数宽度无法平分,较小的一半写在前面:宽度 25 拆成 12px + 13px,底边仍是 25px,尖角在正中偏左 0.5px。左右方向的三角形按同样的方法拆分高度。改成两边各 12.5px 在普通屏幕上也没有用,浏览器会把边框宽度向下取整到整数个设备像素,底边会变成 24px。需要尖角正好居中时请用偶数。

width 和 height 对各方向分别控制什么?

上下方向的三角形:宽度是底边的总长,高度是三角形的高。左右方向:宽度是三角形伸出的长度,高度是竖直方向的总长。四个角方向(如左上):宽度和高度是切出直角三角形的那个矩形的两条边,例如 16 × 10 得到两条直角边分别为 16px 和 10px 的三角形。

该用边框技巧、clip-path 还是 SVG?

边框技巧不需要任何资源,主流浏览器都支持,但只能是一种纯色。clip-path: polygon() 可以裁切任意元素,三角形因此可以用渐变或图片填充,也能用百分比随容器缩放。需要描边、圆角或三个以上顶点的形状,用 SVG 更合适。只是工具提示的小箭头或下拉标记时,边框技巧写起来最短。

CSS 三角形支持暗黑模式吗?

支持。由于三角形由 border 构成,你可以用 CSS 自定义属性或暗色模式媒体查询来覆盖 border 颜色。例如,使用 CSS 变量作为颜色值,即可在明暗主题之间自动切换。

输入的尺寸和颜色会发送或保存吗?

不会。CSS 在浏览器标签页里生成,方向、尺寸和颜色不会发送到服务器,也不会保存到浏览器存储。页面统计只记录使用事件(工具名和动作),不包含尺寸或颜色。