使用方法
- 「基准色相 H」默认
210,单位度,范围 0 到 360,可用方向键按 0.1 度微调。改动任意一栏、或光标停在输入框里按回车,都会立刻重算。 - 「饱和度 S」默认 65、「明度 L」默认 50,都是百分比。三色共用同一组 S 与 L,只改 H,这是三角色与「随便挑三个色」的区别。
- 「亮度小数位」默认 4,只影响感知亮度与相对亮度的显示位数,不影响色值输出。
- 「批量取色」默认写好五行,每行一个六位十六进制色值。工具先把色值反解成 HSL,取出 H,再按同一个 120 度规则展开;按 Ctrl+Enter(Mac 上 Cmd+Enter)一次算完。
- 结果区先给基色与三个色相角度,再逐行列出三色的十六进制、RGB、感知亮度与相对亮度,最后一行是亮度极差——它告诉你这三个色里最亮和最暗差多少。
- 色块条把三色并排显示,方便直接比较明暗。三色按「主色 + 两个辅色」排列,第一个是基准色。
- 下方是二十行色相速查表,默认显示 12 行,点「加载更多」展开余下 8 行;「导出 CSV」把全部二十行存成带字节序标记的文件。
- 色相、饱和度、明度留空或不是数字、超出各自范围,小数位不是 0 到 4 的整数,批量行不是六位十六进制(三位缩写、缺井号以外的字符、位数不对),都会给出写明行号与原因的具体提示。
这个三角色颜色方案生成器能解决什么
配色最省事的一类方案就是三角色:在色环上均匀取三个点,彼此相隔 120 度。它比互补色多一个色,比随便挑三色多一层秩序,因此既够跳、又不至于失控。这一页做的就是把「选一个基色」这一步直接折成完整三色,并把每色的亮度一起摆出来。
第一类是给品牌或活动定主视觉。手头只有一个品牌色,比如 #3498DB,输入后立刻得到 #3498DB、#DB3498、#98DB34 三色,可以直接拿去做主色、强调色与辅助色。三色的 HSL 明度完全一致,所以放在一起不会有某一色特别突兀。
第二类是数据可视化取色。三个系列要保证彼此可区分,三角色天然满足:色相相距 120 度,人眼基本不会混淆。这一页顺带给出每色的感知亮度,三色分别是 135.5774、94.7242、192.6984,差距明显,即使转成灰度图也能靠明度区分。
第三类是排查「配色看着别扭」的原因。三角色最典型的毛病是三色亮度差太大:默认 H=210 这组,最亮 180.7886、最暗 85.8470,极差接近一倍。等面积平铺会显得吵,正确做法是保留一色为主、另两色降饱和或缩小面积点缀。
还有一类边界要说清:三角色只解决色相关系,不解决可读性。文字与背景的对比要按 WCAG 的相对亮度与对比度单独核算,那需要线性化而不是直接读 HSL 的 L;本页给出的相对亮度可以直接用于这类核算。
计算原理与变量说明
三角色的定义只有一句话:三个色相在色环上均匀三分,即 H、(H+120)%360、(H+240)%360。三组共用同一对 S 与 L,所以三色在 HSL 空间里只差一个坐标。这里的取模是真正的取模运算,H=280 时第三色是 (280+240)%360=160,而不是 520。
HSL 转 RGB 走标准分段式。先算 q = L < 0.5 ? L×(1+S) : L+S−L×S 与 p = 2L − q,再对每个通道按 t 落在 [0,1/6)、[1/2,2/3)、[2/3,1) 等区间分段求值,其中 t 分别取 H/360+1/3、H/360、H/360−1/3。最后把 0~1 的值乘 255 并四舍五入,拼成六位十六进制。先转 RGB 再转十六进制是必须的,反过来无法保证位深一致。
| 量 | 符号 | 算式 | 默认值 |
|---|---|---|---|
| 基准色相 | H | 输入,0 ~ 360 度 | 210° |
| 三色相 | H1..3 | H、(H+120)%360、(H+240)%360 | 210°/330°/90° |
| 饱和度 | S | 输入,0 ~ 100 百分比 | 65% |
| 明度 | L | 输入,0 ~ 100 百分比 | 50% |
| 感知亮度 | Y | 0.2126R + 0.7152G + 0.0722B | 115.8643 |
| 相对亮度 | Lw | 先线性化再按同系数加权 | 0.2052950078 |
| 亮度极差 | ΔY | max(Y) − min(Y) | 94.9416 |
同样的 L,感知亮度可以差一倍。这是本页真正的技术内核。HSL 的 L 只是 (max+min)/2,与人的明度感受无关;真正贴近视觉的是 Rec.709 加权 Y = 0.2126R + 0.7152G + 0.0722B,绿色权重是蓝色的近十倍。所以 L 同为 50% 时,黄绿色 #80D22D 的 Y 是 180.7886,而品红 #D22D80 只有 85.8470——在色环上转 120 度,亮度就翻了一倍多。这也解释了为什么三角色直接等面积平铺会显得吵。
相对亮度必须先线性化。WCAG 的相对亮度不能直接用 0~255 的数值加权,因为 sRGB 是 gamma 约 2.2 的非线性编码。先把通道归一化到 0~1,再按 c ≤ 0.04045 取 c/12.92,否则取 ((c+0.055)/1.055)^2.4 还原成线性光,最后加权。中灰 (128,128,128) 归一化是 0.502,线性化后只有 0.2158605001,差了一半多——这个落差就是 gamma 的体现。
反向取色只取 H。给一个色值反解 HSL 时,S 与 L 沿用色值自身的取值,不套用上方滑块。这样 #3498DB 反解出的 H=204.1、S=69.87%、L=53.14%,展开后第一个色必然回到 #3498DB 本身,可以当作自检。
色相是圆周量。H=0 与 H=360 是同一个色,所以取模后不需要再归一化;但浮点数取模可能给出 359.99999 这样的值,本页在显示时统一保留一位小数,避免出现 360.0 与 0.0 两个写法。
完整示例(数值仅作演示)
默认一组:H=210、S=65%、L=50%,三个色相是 210.0°、330.0°、90.0°,输出 #2D7FD2 #D22D80 #80D22D。对应的 RGB 依次是 (45,127,210)、(210,45,128)、(128,210,45),感知亮度 115.8643、85.8470、180.7886,极差 94.9416。
H=210, S=0.65, L=0.50 q = 0.50 + 0.65 − 0.50×0.65 = 0.8250 p = 2×0.50 − 0.8250 = 0.1750 R 通道 t = 210/360 + 1/3 = 0.9167 → 落在 [2/3,1) → 取 p = 0.1750 → 45 G 通道 t = 210/360 = 0.5833 → 落在 [1/2,2/3) → p+(q−p)(2/3−t)×6 = 0.5000 → 127 B 通道 t = 210/360 − 1/3 = 0.2500 → 落在 [1/6,1/2) → 取 q = 0.8250 → 210 ⇒ #2D7FD2
批量五行:#3498DB 反解 H=204.1 得 #3498DB #DB3498 #98DB34;#E74C3C 反解 H=5.6 得 #E74C3C #3CE74C #4C3CE7;#2ECC71 反解 H=145.4 得 #2ECC71 #712ECC #CC712E;#2D7FD2 反解 H=210.2 得 #2D7FD2 #D22D7F #7FD22D;#9B2DD2 反解 H=280.0 得 #9B2DD2 #D29B2D #2DD29B。每行的 S 与 L 都取自该色值自身。
极端值有两个:S=0 时三色全部退化成同一个灰,因为没有色度可转;L=0 或 L=100 时三色也全部退化成纯黑或纯白。这两组输入不算错误,但输出没有配色意义。
三角色相速查表
下表固定取 S=65%、L=50%,每 18 度取一个基准色相,共二十行。后三列由本页同一套公式算出:三色的感知亮度取最大值、最小值与两者之差。整行扫下来可以看出亮度极差随基色相起伏,最小的一组是 H=216 附近。
| 基色相 H | 三色十六进制 | 最亮 Y | 最暗 Y | 亮度差 |
|---|---|---|---|---|
| 0° | #D22D2D #2DD22D #2D2DD2 | 163.1694 | 56.5922 | 106.5772 |
| 18° | #D25E2D #2DD25E #5E2DD2 | 166.7595 | 67.1637 | 99.5959 |
| 36° | #D2902D #2DD290 #902DD2 | 170.3497 | 77.7352 | 92.6145 |
| 54° | #D2C22D #2DD2C2 #C22DD2 | 186.5534 | 88.3068 | 98.2467 |
| 72° | #B1D22D #2DB1D2 #D22DB1 | 191.3602 | 89.4372 | 101.9230 |
| 90° | #80D22D #2D7FD2 #D22D80 | 180.7886 | 85.8470 | 94.9416 |
| 108° | #4ED22D #2D4ED2 #D22D4E | 170.2171 | 80.3010 | 89.9161 |
| 126° | #2DD23D #3D2DD2 #D23D2D | 164.3661 | 60.1160 | 104.2501 |
| 144° | #2DD26F #6F2DD2 #D26F2D | 167.9563 | 70.6875 | 97.2687 |
| 162° | #2DD2A1 #A12DD2 #D2A12D | 171.5464 | 81.2591 | 90.2873 |
| 180° | #2DD2D2 #D22DD2 #D2D22D | 198.4078 | 91.8306 | 106.5772 |
| 198° | #2DA1D2 #D22DA1 #A1D22D | 187.8363 | 88.2405 | 99.5959 |
第二张表把三角色与几类相邻方案摆在一起,便于确认自己要的到底是哪一个。它们的差别全部落在第二个与第三个色相的偏移角上。
| 方案 | 第二个色相 | 第三个色相 | 视觉特征 |
|---|---|---|---|
| 三角色 | +120° | +240° | 对比强、三色平权 |
| 互补色 | +180° | — | 两色对撞,最强 |
| 分裂互补 | +150° | +210° | 比互补缓和 |
| 四方色 | +90° | +270° | 四色环绕,最难控 |
结果边界、舍入与适用说明
- 色相留空时提示「色相这一栏是空的,请填 0 到 360 之间的数」;填入 360 也会按取模归到 0,不会报错。
- 饱和度与明度必须是 0 到 100 的数,超出会分别提示「饱和度 120 超出 0 到 100 的范围」这类具体原因,不自动夹到边界。
- 批量行必须是六位十六进制:允许带井号,字母大小写不敏感;三位缩写、五位、含空格或井号以外的符号都会被拦下并指出行号。
- 亮度小数位只接受 0 到 4 的整数,仅作用于感知亮度与相对亮度的显示;十六进制色值始终输出六位。
- 感知亮度用 Rec.709 系数直接对 0~255 的 sRGB 数值加权,相对亮度则先线性化再加权,两者不可互换,页面并列给出。
- RGB 四舍五入取最近整数,因此从 hex 反解 HSL 再转回来可能与原值相差 1,这是 8 位量化的正常结果。
- S=0、L=0、L=100 这三组输入会输出三个完全相同的色,属正常退化而非故障。
- 页面不联网、不写本地存储;导出的 CSV 带字节序标记,Excel 打开不乱码。
常见问题
三角色具体是哪三个角?
色相 H、(H+120)%360、(H+240)%360。也就是把 360 度的色环三等分,相邻两色相差 120 度。取模保证结果落在 0 到 360 之间。
为什么三个色的 L 相同,看起来却一个比一个亮?
因为 HSL 的 L 只是 (max+min)/2,不含人眼的光谱敏感度。贴近视觉的是 Rec.709 加权亮度,绿色权重 0.7152、蓝色只有 0.0722。默认 H=210 这组三色的感知亮度分别是 115.8643、85.8470、180.7886,最亮的是黄绿色。
从已有色值出发怎么算?
把六位十六进制拆成 R、G、B 三个 0~255 的值,反解出 HSL 的色相 H,再按 +120、+240 展开。反解时 S 与 L 沿用该色自身的取值,所以第一个输出色一定等于输入色。
三角色和互补色、分裂互补有什么不同?
互补色是 H 与 H+180,只有两个色;分裂互补是 H+150 与 H+210,是对互补色的缓和;四方色是每 90 度取一个。三角色是每 120 度取一个,共三个色,对比强度介于互补与分裂互补之间。
三色怎么用才不刺眼?
不要等面积平铺。常见做法是选一色作主色占大面积,第二色作强调色占少量,第三色只用于点缀;或者把两个辅色的饱和度下调。本页给出的亮度极差可以作为参考:极差越大,越需要拉开面积比例。
输出的十六进制是几位的?
六位,不带井号前缀以外的短写形式。每个通道先四舍五入到 0~255 的整数,再转成两位大写十六进制,不足两位前面补零。
饱和度或明度调到 0 或 100 会怎样?
S=0 时三色全部退化成同一个灰;L=0 全部是纯黑,L=100 全部是纯白。这些输入不会被判为错误,但输出没有配色意义。
输入的数据会上传到服务器吗?
不会。HSL 与 RGB 的互转、亮度计算、查表与导出全部在本页的 JavaScript 里完成,没有发起任何网络请求,也不写入浏览器存储。