使用方法
- 在文本框里每行写一个项目名,行序即取色顺序。这个随机取色挑选列表默认预置 16 个模块名,可整段替换成你的图表系列、团队成员或活动分区。
- 确认右侧三个数字:色相起点 θ = 0、饱和度 S = 72、明度 L = 55。这就是示例里那 16 个色号的来源,改任何一个都会立刻重排全部颜色。
- 看结果区第一行的摘要:它会报出色相步长(360÷项数)、当前参数和最小相邻色相间隔。步长小于 6 度时,摘要会直接提醒你相邻两块肉眼已经分不出来。
- 某一项的颜色你满意,就点它右边的「锁定」;锁定的项在后续重掷里色相冻结不动。不想要了再点一次变成「解锁」。
- 想让某一项换个颜色,点它右边的「重掷」:它会同另一个未锁定项交换色相。因为色相只取色相环上那 n 个等分角度,所谓换色是换位而不是重新随机一个角度,整组仍然是等间隔的。
- 点「换一套配色(重掷)」把色相起点 θ 换成 0~359 的随机整数,所有未锁定项整体旋转;点「全部解锁」清掉所有锁定;点「导出 CSV」存成带 BOM 的表格文件。
- 结果表默认显示 12 行,点「加载更多」展开全部;点「复制对照表」把整张表按 TSV 复制到剪贴板,直接粘进 Excel 会自己分列。
这个随机取色挑选列表能解决什么问题
一是给图表系列分色。折线图、柱状图、分组条形图最怕两条线颜色接近,靠手感挑色很容易撞色。这里把色相按 360÷n 等分,16 条线每两条相差 22.5 度,是同一饱和度与明度下能做到的最远间隔。
二是给固定名单批量着色。看板上的项目标签、地图上的分区、甘特图上的任务条,只要有一份名单,粘贴进来就能一次拿到一整套色号,不用逐个去配色网站点。
三是把颜色固定下来复用。设计稿评审到一半,某个模块的颜色被认可了,点一下锁定,之后整组怎么重掷它都不变;导出 CSV 后色号进版本库,前端直接读,避免「这版和上版颜色不一样」这种返工。
本页不做这些事:不判断配色是否和谐、不校验前景与背景的对比度、不模拟色盲视觉、不从图片提取颜色。要过无障碍对比度请用页面底部的「颜色对比度检测」,要按明度生成由浅到深的同色系请用「浅色颜色生成器」。
取色原理:HSL 等间隔采样、色相步长与锁定语义
采样公式只有一句话:第 i 项的色相 Hi = (θ + i × 360 ÷ n) mod 360,i 从 0 数到 n−1。θ 是色相起点,默认 0,此时公式退化成 Hi = i × 360 ÷ n,也就是把整个色相环切成 n 份、从红色(0 度)开始顺时针取点。16 项时步长是 22.5 度,第 16 项落在 337.5 度,它与第 1 项之间隔着 360−337.5 = 22.5 度,色相环是闭合的,最后一项到第一项的间隔同样是 22.5 度,这一点经常被漏掉。
为什么在 HSL 里等分而不是直接随机 RGB。HSL 由 CSS Color Module Level 3(W3C 推荐标准)定义:H 是 0~360 度的色相角,S 与 L 是 0~100% 的饱和度与明度。若在 R、G、B 三个通道各自独立取 0~255 的随机整数,绝大多数结果落在灰暗区——三通道都接近 128 时就是灰色,色相无从谈起;即使滤掉灰色,剩下的颜色在色相环上也忽密忽疏。先定色相、再统一 S 与 L,才能把「相邻两项差别尽可能大」变成一条可验证的等式。
色相等分不等于感知均匀。HSL 只是 sRGB 的几何变换,不是感知均匀空间。用默认的 S=72%、L=55% 实测:每一步同样是 22.5 度,相邻两块在 RGB 上的欧氏距离却在 45.62 到 62.00 之间波动,最大是最小的 1.359 倍——最小出现在 112.5 度到 135 度这一段(#4edf3a 对 #3adf63),最大出现在 0 度到 22.5 度这一段(#df3a3a 对 #df783a)。原因是当某个通道被推到 0 或 255 附近后就不再变化,后续色相的位移只能靠剩下的通道承担。要做到真正的感知均匀需要换成 CIELAB 或 OKLCH 并处理色域映射,代价是浏览器兼容与代码复杂度都明显上升;对 16 项以内的分组配色,HSL 等分已经够用,但你要知道它在黄绿区偏挤、在蓝紫区偏疏。
8 位量化是硬上限。屏幕最终显示的是 8 位 sRGB,每个通道只有 256 级,所以色相细分到一定程度就换不出新颜色了。实测在 S=72%、L=55% 的圆上以 0.25 度为步长绕一圈,只有 990 个互不相同的 HEX;S=30%、L=85%(浅色)只剩 138 个;S=50%、L=20%(深色)是 306 个。项数再多,颜色也只是在这几百个值里反复。
锁定改变的是间隔,不是公式。被锁定的项保留冻结那一刻的绝对色相,不跟着 θ 旋转,于是整组不再严格等间隔。摘要里的「最小相邻色相间隔」就是把所有色相排序后求环形间隔的最小值,低于 15 度会给出提示;想恢复严格等间隔,先「全部解锁」再重掷。
随机数来自加密接口。θ 由 crypto.getRandomValues(new Uint32Array(1)) 取 32 位无符号整数后映射到 0~359,并用拒绝采样:接受上限 Math.floor(4294967296 ÷ 360) × 360 = 4294967160,落在 4294967160~4294967295 这 136 个取值上就丢弃重抽,接受率 99.9999968%,换来严格均匀的分布。单项重掷选「跟谁换」也用同一函数。
从 HSL 到 HEX 的换算与舍入。先由 H、S、L 求出 C = (1 − |2L − 1|) × S、X = C × (1 − |(H ÷ 60) mod 2 − 1|)、m = L − C ÷ 2,按 H 所在的 60 度扇区决定 R、G、B 与 C、X 的对应关系,再加上 m 并逐通道四舍五入到 0~255 的整数,最后写成 #RRGGBB。舍入发生在最后一步,中间量保持浮点,所以不会出现「先取整再相加」累积误差。
完整示例(默认 16 项,θ=0 度)
示例条件与页面打开时的默认值完全一致:16 个项目、色相起点 θ = 0、饱和度 S = 72%、明度 L = 55%。代入公式,色相步长 = 360 ÷ 16 = 22.5 度,16 个色相依次是 0、22.5、45、…、337.5 度;16 个色相之和为 2700 度(等于 22.5 × 15 × 16 ÷ 2)。默认参数下的完整结果:
| 序号 | 项目 | 色相 H | HEX | RGB |
|---|---|---|---|---|
| 1 | 首页改版 | 0.0 度 | #df3a3a | rgb(223, 58, 58) |
| 2 | 移动端适配 | 22.5 度 | #df783a | rgb(223, 120, 58) |
| 3 | 搜索优化 | 45.0 度 | #dfb63a | rgb(223, 182, 58) |
| 4 | 会员体系 | 67.5 度 | #cadf3a | rgb(202, 223, 58) |
| 5 | 支付接入 | 90.0 度 | #8cdf3a | rgb(140, 223, 58) |
| 6 | 数据看板 | 112.5 度 | #4edf3a | rgb(78, 223, 58) |
| 7 | 消息推送 | 135.0 度 | #3adf63 | rgb(58, 223, 99) |
| 8 | 客服工单 | 157.5 度 | #3adfa1 | rgb(58, 223, 161) |
| 9 | 内容审核 | 180.0 度 | #3adfdf | rgb(58, 223, 223) |
| 10 | 权限管理 | 202.5 度 | #3aa1df | rgb(58, 161, 223) |
| 11 | 日志归档 | 225.0 度 | #3a63df | rgb(58, 99, 223) |
| 12 | 缓存重构 | 247.5 度 | #4e3adf | rgb(78, 58, 223) |
| 13 | 接口网关 | 270.0 度 | #8c3adf | rgb(140, 58, 223) |
| 14 | 灰度发布 | 292.5 度 | #ca3adf | rgb(202, 58, 223) |
| 15 | 监控告警 | 315.0 度 | #df3ab6 | rgb(223, 58, 182) |
| 16 | 备份恢复 | 337.5 度 | #df3a78 | rgb(223, 58, 120) |
这 16 个 HEX 值互不相同,最小相邻色相间隔是 22.5 度——因为每一项都恰好占一个等分角度,不存在两个项目共用同一个色相的情况。作为对照,如果 θ 取 30 度,16 个色相整体右移 30 度,色号会全部换掉,但两两之间的色相差仍然是 22.5 度,最小间隔不变。
再把参数改成 S=100%、L=50%(基准色),色相 0、60、120、180、240、300 度分别落在 #ff0000、#ffff00、#00ff00、#00ffff、#0000ff、#ff00ff,可以拿它验证换算是不是对的。
项数、色相步长与可分辨度对照表
下表按公式 360÷n 算出各档步长。「相邻 HEX 举例」取自默认参数 θ=0、S=72%、L=55% 下的前两项,用来看步长变小时色号还能不能看出差别。
| 项目数 n | 色相步长 360÷n | 相邻 HEX 举例(θ=0,S=72%,L=55%) | RGB 欧氏距离 | 适用建议 |
|---|---|---|---|---|
| 3 | 120.0 度 | #df3a3a / #dfb63a | — | 三分类标签,间隔极大 |
| 5 | 72.0 度 | #df3a3a / #8cdf3a | — | 五档评级、五个分区 |
| 6 | 60.0 度 | #df3a3a / #dfb63a | — | 六边形雷达图六轴 |
| 8 | 45.0 度 | #df3a3a / #dfb63a | — | 折线图 8 条线,仍很宽松 |
| 12 | 30.0 度 | #df3a3a / #dfb63a | — | 月份、12 个团队的常用上限 |
| 16(默认) | 22.5 度 | #df3a3a / #df783a | 62.00 | 平衡点,色号清晰且数量够用 |
| 20 | 18.0 度 | #df3a3a / #df633a | — | 开始要配合图例使用 |
| 30 | 12.0 度 | #df3a3a / #df4e3a | — | 建议只在色块足够大时使用 |
| 40 | 9.0 度 | #df3a3a / #df443a | — | 相邻两块已需要仔细比对 |
| 48 | 7.5 度 | #df3a3a / #df413a | — | 接近可分辨下限 |
| 60 | 6.0 度 | #df3a3a / #df3f3a | ≈16.5 | 临界值,摘要开始给出提醒 |
| 64(上限) | 5.625 度 | #df3a3a / #df3e3a | ≈15.5 | 本工具允许的最大项数 |
把「RGB 欧氏距离」一列和色号一列对着看:24 项以后,相邻两个色号已经只差一个通道上的个位数,缩略图尺寸下基本分辨不出。1 度色相在默认参数下平均只换算成 2.75 的 RGB 欧氏距离(最小 2.0,最大 3.0),也就是说色相步长每减少 1 度,屏幕上颜色只挪动不到 3 个色阶。
输入范围、边界与舍入说明
- 项目数 2~64。这个随机取色挑选列表在少于 2 项时没有「间隔」可言;超过 64 项时步长降到 5.625 度以下,相邻色号肉眼已难区分,工具会直接拒绝并提示改成多组生成。空行会被自动忽略,前后空格也会去掉,所以列表中间留空行不会多出一个项目。
- 色相起点 θ 限 0~359 的整数。θ 与 360 等价(
(θ + i×360÷n) mod 360取模后完全一样),所以 360 被归到 0;小数会被拒绝,因为整数起点已经能覆盖 1 度粒度的全部排列。 - 饱和度 S 限 0~100,明度 L 限 10~90。S=0 时色相完全失效:实测 S=0%、L=55% 下,H=0、H=90、H=200 全部得到
#8c8c8c,16 项会输出 16 个一样的灰色。L 限 10~90 是同一个道理——L=0% 时任何色相都是#000000,L=100% 时都是#ffffff,色相环被压成一个点。 - 步长下限与提示阈值。各档步长分别为 64 项 5.625 度、60 项 6 度、48 项 7.5 度、16 项 22.5 度。步长小于 6 度时摘要会给出提醒;有锁定项时改用「最小相邻色相间隔」,低于 15 度才提示。
- 舍入只发生在最后一步。HSL 到 RGB 的中间量保持浮点,逐通道
Math.round到 0~255 再拼 HEX,不会出现「先取整再相加」的累积误差。反过来说 HEX 是量化值,项数再多也不会继续「生出」新颜色。 - 锁定项会让间隔不再相等。锁定的项冻结绝对色相,不随 θ 旋转,其余项仍按等间隔铺开,于是可能出现某两个项目只差几度。摘要里的「最小相邻色相间隔」就是这个值,低于 15 度时先「全部解锁」再重掷。
- 单项重掷是换位,不是重新随机取角。色相只取 θ + i×360÷n 这 n 个值,换色只能与另一个未锁定项交换归属;未锁定项少于 2 个时会提示先解锁。
- 项目名重复不报错。两行同名会得到两个不同颜色,导出也是两行——工具按行取色,不做去重。
常见问题
为什么相邻两项的色相差是 360÷n,而不是随手取一个随机角度?
因为「随机」和「均匀」是两件事。独立均匀地随机取 n 个 0~360 的角度,n=16 时任意两项最小间隔的期望只有 360÷n² ≈ 1.4 度,实际跑一次常常出现两块几乎同色。等分法则把最小间隔锁死在 360÷n = 22.5 度,这才是分组配色真正需要的性质。本工具的随机性只用在「色相起点 θ」上,它负责整体旋转,不改变间隔。
点了「锁定」以后,为什么摘要里的最小间隔会变小?
锁定项冻结的是它当时那一刻的绝对色相,不参与后续的 θ 旋转;其余项照旧按新 θ 等分。两套角度叠在一起就可能挨得很近。这不是 bug,而是「既要固定已知颜色、又要保持等分」在数学上无法同时成立。工具把「最小相邻色相间隔」明确报出来,低于 15 度就提示你先解锁再重排。
「重掷」到底换的是什么?为什么不直接给我一个随机颜色?
本工具的色相只能落在 θ + i×360÷n 这 n 个角度上。直接给一个随机颜色会立刻破坏等间隔,让某两块挤在一起。所以单项重掷的语义是把该项的色相与随机另一个未锁定项交换——你看到的效果是「这一项换了个颜色」,而整组色号集合一个都没变。想整体换掉,用「换一套配色」改 θ。
16 项时那 16 个色号会不会有重复?
不会,实测 16 个 HEX 全部互异。但要区分「色相不重复」与「HEX 不重复」:色相按 22.5 度递增永远不会撞,可一旦把 S 压得很低,不同色相可能被 8 位量化到同一个 HEX,项目数接近上限 64 时尤其明显。
为什么明度只让填 10~90,不让我填 0 或 100?
L=0% 时 HSL 退化为纯黑,L=100% 时退化为纯白,两种情况色相都失去作用:实测 L=0% 下 H=0 与 H=200 都输出 #000000,L=100% 下都是 #ffffff。放开这两个端点只会让用户拿到一屏一样的颜色,所以把可调区间限制在 10~90,任何色相在这一段里都能保留可辨识的差别。
这套颜色能直接过无障碍对比度检查吗?
不能,本工具只把色相排均匀,不计算任何对比度。同一个色相在白底与深底上的对比度差别很大,正文可读性要求 AA 级 4.5:1、大字号 AA 级 3:1、AAA 级 7:1。要当文字或图标色用,请把 HEX 拿去「颜色对比度检测」逐个验。
什么场景下应该改用 CIELAB 或 OKLCH?
当你需要「不管什么色相,相邻两块看起来都差不多远」的时候。默认参数下同样是 22.5 度,RGB 欧氏距离在 45.62 到 62.00 之间摆动,最大是最小的 1.359 倍,肉眼在黄绿区会觉得两块挨得更近。做连续色阶或热力图分级时值得换到感知均匀空间;做离散分组配色则 HSL 等分更好维护。
导出 CSV 打开是乱码,或者复制对照表粘进 Excel 没分列,怎么办?
CSV 导出带 UTF-8 BOM,Excel 一般能正确识别中文项目名;若仍乱码,用「数据 → 从文本/CSV 导入」并手动选 UTF-8。复制对照表走的是 TSV(制表符分隔)而不是逗号,粘进表格软件会自动分列;若全挤在一列,检查粘贴时是否选了「只保留文本」。
相关工具
- HSL转RGB转换器:把本页给出的 HSL 写法逐条转成 RGB,核对换算是否一致。
- HSL转十六进制转换器:只关心 HEX 输出时的快速通道,适合把参数手改成别的色相再取色号。
- 十六进制颜色表:按码值查颜色,用来确认某个 HEX 到底偏红还是偏紫。
- 调色工具:在同一屏里拖动 HSL 三个滑块,用来给本页的 S 与 L 找一组合适的固定值。
- 邻近色颜色方案生成器:按小角度差生成邻近色,与等间隔取色正好是两种相反的思路。
- 互补色颜色查询:查某个颜色的互补色,配色时需要「对比强烈」而不是「均匀分布」时用它。
- 颜色对比度检测:把本页色号当文字色之前,先算一遍与背景的对比度是否达到 4.5:1。
- 随机工具:查看全部随机工具。