跳到内容
Guide Apr 7, 2026 · 9 min read

RGB 还不够:HSL、CMYK 与 OKLCH 颜色表示法

在上一篇文章计算机如何表示颜色:RGB、HEX 与二进制中,我们了解到颜色不过是三个数字——红、绿、蓝,各自范围 0~255。屏幕用这些数字运转得很好。但当人类开始操作颜色时,RGB 很快就变得棘手起来。

RGB 方便,但不直观

“稍微亮一点的红色。“用 RGB 怎么做?需要同时把三个通道都微调一点。“只降低饱和度”——光看 RGB 根本不知道该改哪里。“把这个颜色原样印到纸上”——RGB 对此束手无策。

SCENARIO 01
"稍微亮一点。"

用 RGB 需要同时提高 R、G、B 三个值。稍有偏差,色调就会跑偏。

+30, +30, +30 ?
SCENARIO 02
"只降低饱和度。"

光看 RGB 值,根本不知道该减哪个通道。

R−40, G+10 … ?
SCENARIO 03
"同色调印到纸上。"

屏幕上的 RGB 无法直接用墨水还原。

→ 需要 CMYK

其他颜色表示法正是为了解决这些问题而出现的。

HSL — 符合人类思维的方式

HSL 将颜色拆分为色相、饱和度、亮度三个维度。hsl(14, 100%, 60%)#FF5733 是同一种颜色,但每个参数代表什么一目了然。

H
Hue

色相。就是"颜色的名字",如红、绿、蓝。

0° → 360°
S
Saturation

饱和度。0% = 灰色,100% = 鲜艳的颜色。

0% → 100%
L
Lightness

亮度。0% = 黑色,100% = 白色。

0% → 100%

如果说 RGB 是计算机的语言,那么 HSL 就是设计师的语言。它让你从想改变什么的角度来处理颜色。

Hue — 色相是一个 360° 的圆

色相像时钟一样循环一圈:从 0° 到 360°。0° 和 360° 都是同一种红色。

30°
60°
120°绿
180°
240°
300°品红

Saturation — 饱和度决定颜色的鲜艳程度

即使是同一色相,降低饱和度也会逐渐趋向灰色。

0% — 灰色 50% — 粉彩 100% — 鲜艳的红

Lightness — 亮度从黑到白

L 为 0% 就是纯黑,100% 就是纯白。50% 是该颜色的”本来”亮度。

0% — 黑色 50% — 原始红 100% — 白色

HSL 真正的用武之地——创建调色板

保持色相(Hue)不变,只调整 L,就能得到一组自然协调的颜色。同样的事情用 RGB 需要逐一手动计算 9 格,而 HSL 只需将 L 从 12% 到 92% 按步调整即可。

PALETTE A — HUE 14° (TERRACOTTA)
L 12%
L 22%
L 32%
L 42%
L 52%
L 62%
L 72%
L 82%
L 92%
PALETTE B — HUE 220° (BLUE)
L 12%
L 22%
L 32%
L 42%
L 52%
L 62%
L 72%
L 82%
L 92%

以上两组调色板都可以用一行代码生成。

:root {
  --terra-100: hsl(14 60% 92%);
  --terra-200: hsl(14 60% 82%);
  --terra-300: hsl(14 60% 72%);
  /* ... 只需将 L 每次调整 10 即可 */
}

这正是 HSL 在构建设计系统时最能发挥优势的地方。

CMYK — 墨水的语言

要在纸张而非屏幕上呈现颜色,需要一套完全不同的系统。CMYK 是印刷厂使用的四种墨水比例。

Cyan
青色 — 蓝绿
Magenta
洋红 — 品红
Yellow
黄色
Key (black)
Key — 黑色

为什么黑色用 “K” 而不是 “B”?因为 B 容易与 Blue 混淆。“K” 来自印刷术语 “Key plate”——即用于对齐其他墨水的基准印版。

光叠加越多越亮,墨水叠加越多越暗

RGB 与 CMYK 最大的区别在于混合方式

RGB
= 光 (屏幕)
叠加越来越亮
全部叠加白色
全部去除黑色
叠加越多越亮 — 加色混合 (additive)
CMYK
= 墨水 (纸张)
叠加越来越暗
全部叠加黑色 (理论)
全部去除白色 (纸色)
叠加越多越暗 — 减色混合 (subtractive)

红色墨水之所以看起来是红色,是因为它吸收了其他光,只反射红光。墨水的作用是减少光线,因此叠加越多颜色越暗。理论上 CMY 三色全部混合应该得到黑色,但实际上只会得到浑浊的棕色——这就是为什么需要单独备一种真正的黑色墨水(K)。

CMYK 用在哪里

做屏幕设计几乎不会接触 CMYK,它只在需要印刷到纸张时才出现。

  • 向印刷厂交付文件时 — 名片、海报、书籍、包装。印刷厂收到 RGB 文件后会将其转换为 CMYK。
  • 在 Photoshop / Illustrator 中做印刷用图 — 一开始就将色彩模式设为 CMYK。
  • 品牌规范 — 同时标注屏幕用 HEX 值和印刷用 CMYK 值,确保同一品牌色在两种媒介上视觉接近。

屏幕色与印刷色不同的原因 — 色域(Gamut)

屏幕能表现的色彩范围(RGB gamut)与墨水能表现的范围(CMYK gamut)并不相同。屏幕上鲜艳的荧光粉印出来就是不一样的颜色——因为墨水根本无法还原那种颜色。

因此印刷设计师在开工前只会选用 CMYK 色域内的颜色。把 RGB 设计稿直接送印的话,颜色大打折扣是常有的事。

CMYK 值的写法

记录每种墨水喷涂的百分比:0% 表示不喷,100% 表示全喷。

C 0% M 100% Y 100% K 0%
绿
C 100% M 0% Y 100% K 0%
C 100% M 80% Y 0% K 0%
黑(仅 K)
C 0% M 0% Y 0% K 100%
浓黑 (rich black)
C 60% M 50% Y 50% K 100%

只用 K 100% 的话,印出来往往是偏灰的浑浊黑色。因此印刷厂会同时叠加 CMY,制造更深邃的黑色。

OKLCH — 人类的坐标系

这是 2020 年代正式兴起的颜色模型,核心理念只有一条——“对人眼而言自然准确。”

三个坐标与 HSL 看起来名称相似:

  • L — Lightness(亮度,0~1)
  • C — Chroma(色度,0~约 0.4)
  • H — Hue(色相,0~360°)

但 HSL 有一个隐藏问题:即使 L = 50% 相同,不同颜色实际感知到的亮度差异悬殊。来直接对比一下。

HSL — L = 50% 固定

黄色刺眼,蓝色却几乎暗如黑色。L 值完全相同,但人眼感知却截然不同。

OKLCH — L = 0.65 固定

颜色各异,但亮度看起来相近。因为 L 值被设计为与"人眼感知的亮度"保持一致。

一句话总结——RGB 和 HSL 是机器的坐标系,OKLCH 是人类的坐标系。

L · C · H 各自的作用

看看固定其他值、只改变一个坐标时颜色如何变化。

VARY L
只改变亮度
VARY C
只改变色度
VARY H
只改变色相

适用场景

  • 亮度均匀的调色板 — 需要将 8 种分类色统一为相同亮度时
  • 深色/浅色模式自动切换 — 只需反转 L 值,就能自然生成深色主题
  • 无障碍设计 — 可精确预测文字与背景之间的亮度对比
  • 渐变 — 中间不会出现灰带,过渡更自然

CSS Color Level 4 已正式纳入,现代浏览器可直接使用。

.btn { background: oklch(67% 0.18 30); }       /* 橙色 */
.btn:hover { background: oklch(60% 0.18 30); } /* 只降低 L 7 → 精确变暗同等幅度 */

何时用哪种格式

格式
使用场景
HEX / RGB
大多数数字化工作、CSS、代码
HSL
创建设计系统调色板、调整色调
HSB / HSV
在 Figma·Photoshop 颜色选择器内
OKLCH
注重色调均匀的现代 Web 设计
CMYK
向印刷厂交付文件时

绝大多数数字化工作用 RGB/HEX 就足够了。HSL 在创建调色板时值得记住,OKLCH 则在深色/浅色模式设计中大有帮助。

在 fns 中处理颜色

知道颜色本质上是数字之后,下一步就是把常用颜色随手可取。fns 将颜色的提取、存储与调用流程整合在一个按键背后。

随时随地从屏幕取色的 Eyedropper — +Shift+K

Eyedropper 能精确捕获屏幕上任意像素的颜色,相当于把原本只能在 Figma/Photoshop 内使用的取色器扩展到了全系统。

按下 +Shift+K,fns 的 Eyedropper 在屏幕任意位置弹出。设计稿中的某个像素、图片的特定区域、其他应用的背景色——把鼠标移过去点击,就能精确捕取那里的颜色。

  • 每次点击后自动保存到剪贴板,无需额外的”复制”操作。
  • 可以在 Eyedropper 小部件中选择以 RGB / HEX / HSL / CMYK / OKLCH 哪种格式写入剪贴板。
  • 同时显示所取颜色的视觉预览及近似系统色。

Eyedropper → 自动存入剪贴板 → 从剪贴板选取器调用——整个流程一气呵成。无需像 Mac 自带数字颜色计一样单独打开,也不用每次都按复制快捷键。

剪贴板自动识别颜色

fns 的剪贴板历史能自动识别复制的文本是否为颜色代码,无论是哪种格式都能识别。

#FF5733 标准 HEX
#F53 3 位缩写形式 — 识别为相同颜色
rgb(255, 87, 51) 含 Alpha 的 rgba(...) 也能识别
hsl(14, 100%, 60%) 含 Alpha 的 hsla(...) 也能识别
oklch(0.67 0.18 30) 最新 CSS 表示法

从历史记录中重新调用已复制的颜色时,单看文字很难记起是哪种颜色。fns 在每条记录旁显示小色块,让颜色一目了然。

单独查看颜色

一键在剪贴板历史中只筛选颜色代码。设计作业时想快速找到最近用过的颜色,不必在文字、URL 和代码之间翻找。

  • 在同一个选取器里输入 color: 等过滤关键词 → 只显示颜色条目
  • 按颜色名称搜索——输入 “blue”、“red” 就只显示对应色系
  • 相近颜色会在视觉上归组排列

将颜色转换为其他格式

可以转换格式后再调用同一种颜色。从 Figma 复制了 #FF5733,想在 CSS 里以 rgb(...) 形式粘贴时,在 fns 剪贴板选取器中选中该条目,按一次快捷键即可自动转换。

复制格式
#FF5733
转换后
rgb(255, 87, 51)
复制格式
rgb(255, 87, 51)
转换后
hsl(14, 100%, 60%)
复制格式
hsl(14, 100%, 60%)
转换后
oklch(0.67 0.18 30)

在 Figma(HSB)与 CSS(HSL/HEX/OKLCH)之间切换时,不必每次都打开转换工具。

文本展开与整合

将常用品牌色注册为文本快捷词。

;brand
#FF5733
;ink
#1A1714
;cream
#F1ECE0
;accent
#E8C547
;ok
#29A85A

无论是 CSS 颜色输入框、Figma、Slack 消息还是代码编辑器,同一个快捷词都能直接使用。不必再每次翻查品牌规范手册去复制颜色值。

每次打开转换工具、手动改格式的时间,用 fns 来节省一下吧。

好奇这些数字到底从何而来——RGB 三通道的基础、二进制与 HEX 表示法的原理?从计算机如何表示颜色:RGB、HEX 与二进制开始读起吧。