Skip to content

理解色彩空间(如何表示颜色)与可访问性(如何让颜色可用),是把色彩理论落到实处的关键。本文梳理常用色彩空间、WCAG 对比度标准,并推荐 GitHub 上的优质配色工具。2026-09 更新:补充感知空间 OKLCH 与现代工具生态。

常用色彩空间

色彩空间用途说明
RGB屏幕显示红绿蓝三通道(0-255),相加混色,用于 CSS/hex
HEXWebRGB 的 16 进制表示(如 #FF5733
HSL人眼直观色相(H)+饱和度(S)+亮度(L),调色模型的传统主流
CMYK印刷青品黄黑,相减混色
LAB感知均匀接近人眼感知,用于高精度色彩管理
OKLCH / OKLAB现代感知空间感知均匀性优于 LAB/HSL,色彩插值、渐变、生成的首选

为什么现代推荐 OKLCH 而不是 HSL:HSL 的 lightness(亮度)轴不符合人眼真实感知——同样步长的 HSL 亮度变化,肉眼看起来不均("HSL lightness is a lie")。OKLCH(由 Bjorn Ottosson 提出)基于感知均匀性设计,是 CSS Color 4 及主流色彩工具(Tailwind v4、Radix、Evan You 等)的新标准。做色彩插值、渐变、生成色阶时,应优先在 OKLCH 中运算,避免 HSL 的"假均匀"导致渐变发灰、色阶不均。HSL 仍可用于快速理解色相关系,但不应作为生成与插值的运算空间。

OKLCH 常见坑:超色域(Gamut Mapping)

OKLCH 最常见的使用错误是选了目标色域装不下的彩度:如 oklch(70% 0.3 150) 的彩度 0.3 超出了 sRGB(甚至 P3)能显示的范围,会被静默截断——结果通常变灰、色相偏移。

  • CSS 会自动色域映射:浏览器对 oklch() / color() 自动处理,写 CSS 很少出问题
  • JS 转换不会oklch → hex 这类转换是直接截断通道,不保留色相
  • 正确做法:降彩度(chroma)而不是降明度/改色相——向色域边界收彩度能保住颜色身份;用 Culori 的 clampChroma(color, 'oklch')toGamut() 而非朴素的 RGB 截断
  • 按目标测试inGamut('rgb')inGamut('p3') 结果不同——P3 合法不代表 sRGB 合法

(2026-09 由 color-expert 技能共识补充)

可访问性:WCAG 对比度

颜色不仅要好看,还要让所有人都能读。Web 内容无障碍指南(WCAG 2.1)规定文字与背景的对比度:

场景最低对比度
正文 / 小字号文本4.5 : 1
大文本(≥18pt 或 14pt 粗体)3 : 1
UI 组件、图标、图形边界3 : 1

要点

  • 不要只用颜色传达信息(如"红色=错误"),需配合图标/文字/形状
  • 浅色背景用深色文字、深色背景用白字,保证对比度达标
  • 对比度不能靠运气:实测约 281 万亿个随机 hex 颜色对中,仅约 11.98% 通过 WCAG AA(4.5:1)、约 0.08% 通过 APCA 90。AI 生成色板后必须显式校验,不能"看起来还行"就交付
  • 下一代标准 APCA(感知对比算法,WCAG 3 基础)比 WCAG 2.x 的简单比值更贴近人眼,社区工具已可用

配色工具生态(GitHub)

直接教 AI 用色的项目(接入 AI 工作流首选)

工具能力仓库
color-expert skillAgent 技能:色彩命名/理论/空间/可访问性,144 篇参考(约 28.6 万字)meodai/skill.color-expert(npx skills add meodai/skill.color-expert
design-for-aiClaude Code 插件:教 AI 版式/色彩/构图,内置 OKLCH 色板生成器ryanthedev/design-for-ai
AI-color-system品牌情感词 → 完整 UI 色彩系统(亮/暗双模式 + WCAG AA 校验)yuqizhang1228-blip/AI-color-system

色彩科学引擎(转换/运算)

工具能力仓库
color.jsCSS Color 规范编辑者维护的转换/运算库color-js/color.js
culori轻量色彩运算库(clampChroma 处理超色域、OKLCH 全套操作)culori/culori
oklch-pickerOKLCH 感知空间取色器evilmartians/oklch-picker
spectral.jsKubelka-Munk 颜料物理混合rvanwijnen/spectral.js
colorcet感知均匀 colormap(科学绘图)holoviz/colorcet
color-space色彩空间集合colorjs/color-space

调色板生成器(真算法生成,非预设色卡)

工具能力仓库
tints.dev11 色阶生成器 + API(Tailwind 系)SimeonGriggs/tints.dev
poline笛卡尔空间 HSL 插值生成meodai/poline
palx自动 UI 调色板jxnblk/palx
harmony和谐色板evilmartians/harmony
dittoTones复制 Tailwind/Radix 设计系统的感知 DNAmeodai/dittoTones
smart-color-palette-generator按和谐规则(Analogous/Triadic 等)生成Hhhpraise/smart-color-palette-generator

对比度与无障碍校验

工具能力仓库
radix-ui/colors可访问色彩系统radix-ui/colors
SAPC-APCA感知对比算法(WCAG 3 基础)Myndex/SAPC-APCA
gka/palettes感知正确 + 色盲安全gka/palettes
apca-w3APCA 规范落地版Myndex/apca-w3

设计系统落地:语义 Token 层

色彩进入产品/设计系统时,不要直接在各处写死 hex 值,按三层结构组织(2026-09 由 color-expert 技能共识补充):

  1. Reference Token(参考色板):定义具体颜色值,如 ref.red = #f00
  2. Semantic Token(语义角色):把意义映射到颜色,如 semantic.warning = ref.red——主题换色只改这一层
  3. Component Usage(组件消费):组件只引用语义 token,不碰原始色值

编码决策而非冻结数值:文字色 = bestContrastWith(surface, palette)(色板重生成时自动重算)、强调色 = mostVivid(palette, {minContrast: 4.5})、hover = colorMix(accent, ink, 0.12)(按底色明度自适应明暗)。这样色板重生成后,整个系统仍然可读、不塌陷。

落地工具:CSS 用 var() + color-mix() + 相对颜色语法;设计 token 可用 Design Book(npm install design-book,约束式 token 图)。

一句话总结

色彩落地就三件事:运算一律放 OKLCH(HSL 的 lightness 是假的)、对比度过 WCAG 4.5:1、设计系统走 Reference→Semantic→Component 三层 token。

关联概念