← 返回博客首页

前端颜色换算指南:HEX、RGB、HSL 与可访问性对比度

一个前端配色的小困境

拿到需求『把主色调成更柔和一点』,在 RGB 里你会无从下手——改 R 会让色相漂移,改 G/B 又说不清会变得多亮。可如果把它换成 HSL,答案就变成一个数字:把饱和度 S 往下调 20%。这就是理解颜色模型的意义所在。

本篇文章把前端最常用的三套模型讲透,并落地到对比度与无障碍选色。

三种颜色模型怎么看

HEX = RGB 的 16 进制写法

#FF8800
 ├R=0xFF→255   ├G=0x88→136   └B=0x00→0

#RGB 还有 3 位简写:#f80 = #ff8800。它是 CSS 里最紧凑的写法,但『一眼看不出亮暗』。

RGB:三原色混合

rgb(255, 136, 0)
R=255  G=136  B=0

显示器底层用的就是它,数值直观但调色不直觉。

HSL:把感觉拆成三根轴

hsl(30, 100%, 50%)
 H=30°(橘)   S=100%   L=50%
  • H 色相 0–360°:红 0、黄 60、绿 120、青 180、蓝 240、品红 300;
  • S 饱和度 0–100%:灰到鲜艳;
  • L 明度 0–100%:黑到白。

换算关系速记

从 → 到 量纲
HEX → RGB 每 2 位 16 进制转十进制
RGB → HSL 归一化 → max/min 差定 S、平均定 L、极值位置定 H
HSL → RGB 按 H 区间还原

多数取色工具(color-picker)都能让你在 HEX/RGB/HSL 间来回切,正好用于验证换算。

一个含『无障碍』的选色流程

配色不是只看好不好看,还要保证对比度达标。完整流程:

  1. 选主色:用取色器/调色板定下品牌主色;
  2. 配中性色:为主色生成明暗变体(同一色相、不同 L/S);
  3. 算对比度:对『前景文字 vs 背景』逐对计算;
  4. 对照 WCAG:正文 ≥4.5(AA) / 常用 ≥3;更严的企业做到 AAA 7.0。

对比度公式

L = 0.2126·R̄ + 0.7152·Ġ + 0.0722·B̄     (R̅/G̅/B̅ 为线性化亮度)
对比度 = (L亮 + 0.05) / (L暗 + 0.05)

WCAG 阈值:

级别 普通文本 大字号/bold/UI 组件
AA ≥ 4.5 ≥ 3
AAA ≥ 7 ≥ 4.5

一个常见坑:同样的背景色,配不同明度的文字对比度差异巨大。拿同一主色的深/浅两种文字分别测,往往只有一种达标。

调色板生成器怎么用

很多调色板工具(color-palette-generator / color-picker)内部就是按下述逻辑出片的:

  1. 取一个基础色相 H0;
  2. 生成 60° 间隔的类比补色作为多组候选;
  3. 每组用「同一 H,不同 S/L」产出明暗梯度;
  4. 返回一组语义可用的 10–12 色,含主色、中性色、强调色。

这样既保证和谐(色相有内在联系),又保证有可用在文字上的高对比色。

自查清单

  • [ ] 能在 HEX ↔ RGB ↔ HSL 之间口算/用工具换出同一颜色;
  • [ ] 能说清 HSL 三根轴分别控制什么,并解释为什么调 L 比调 RGB 更可预测;
  • [ ] 会算对比度,并知道 AA/AAA 对正文与大字号的两档阈值;
  • [ ] 会用取色器确认色值、用调色板快速搭一组明暗变体。

把转换、取色、调色板与对比度串成一条流程,配色就不再是『碰运气』。

常见问题

HEX、RGB、HSL 之间到底是什么关系?

它们描述同一个颜色,只是坐标系不同。**HEX** 是 RGB 的 16 进制简写:`#FF8800` 拆成 R=0xFF、G=0x88、B=0x00。**RGB** 用 0–255 三原色。**HSL** 用**色相 H**(0–360°)、**饱和度 S**、**明度 L**(后两者 0–100%)。转换:HEX↔RGB 是纯进制换算;RGB→HSL 要归一化后算 max/min 差和亮度。核心点:RGB 看着像『颜色是什么』,HSL 更像『这个颜色感觉多亮、多纯、色调偏哪』。

为什么说 HSL 更适合设计师选色?

因为 HSL 把『色调、艳度、明暗』拆成了三个**独立可调**的轴:想变得更深更浅只需调 L,想降低饱和度只需调 S,换到相近色只需小幅动 H——它们在 RGB 里其实是纠缠的三个变量,肉眼很难预测『改一个数字会怎样』。生产常用:先定主色色相,再以同一 H 配不同 S/L 生成一组和谐的明暗变体,这正是很多调色板生成器『同色相多明度』做法的原理。

对比度到底怎么算?WCAG 的 AA/AAA 是多少?

对比度 = (较亮色相对亮度 + 0.05) / (较暗色相对亮度 + 0.05)。相对亮度基于线性化后的 RGB(sRGB 要 gamma 矫正,约 L = 0.2126R+0.7152G+0.0722B)。WCAG 分级(普通文本):**正文 AA ≥ 4.5、大字号/粗体 AA ≥ 3;AAA ≥ 7(大字号 AAA ≥ 4.5)**。判断一个配色能否用于正文,直接套这组阈值即可;把 `color-converter` 这类工具给出的对比度与阈值对比,就能快速定取舍。

← 返回博客首页