颜色转换完全指南:HEX、RGB、HSL 与现代 CSS 配色(2026)
颜色转换:前端工程师每天都在做的事
打开浏览器 DevTools 看任意一个网站的样式,颜色值通常是这样混搭的:
.button {
background: #3b82f6; /* HEX */
color: rgb(255 255 255); /* RGB */
border-color: hsl(217 91% 60%); /* HSL */
box-shadow: 0 4px 12px oklch(0.7 0.15 230 / 0.4); /* OKLCH */
}
每种颜色表示法都有适用场景:HEX 用于设计稿对接、RGB 用于程序计算、HSL 适合做主题色调整、OKLCH 是 2026 年现代设计系统的首选。本指南帮你彻底搞懂这些格式之间的关系,并掌握高效的转换方法。
主流颜色格式对比
HEX:设计师的母语
最古老也最普及的格式:#RRGGBB,每两位是一个十六进制数(00-FF),分别代表红绿蓝。
#3b82f6 /* 蓝色 */
#3B82F6 /* 同上,大小写不影响 */
#3b82f6cc /* 8 位 = RGB + Alpha 透明度 */
#3bf /* 简写,等价于 #33bbff */
优点:紧凑、可复制、Photoshop/Figma 直接用 缺点:无法直观看出颜色关系,调浅/调深需要重新计算
RGB / RGBA:浏览器的内部表示
rgb(59 130 246) /* 现代语法(推荐) */
rgb(59, 130, 246) /* 老语法,逗号分隔 */
rgba(59 130 246 / 0.8) /* 带透明度,用斜杠分隔 */
优点:直接对应像素值、可程序化生成、易做线性混色 缺点:人类很难凭数字判断颜色
HSL:调色板的瑞士军刀
hsl(217 91% 60%) /* 色相 / 饱和度 / 亮度 */
- H(Hue 色相):0-360 度,红橙黄绿青蓝紫绕一圈
- S(Saturation 饱和度):0%(灰)到 100%(最艳)
- L(Lightness 亮度):0%(黑)到 100%(白),50% 是最饱和的纯色
杀手锏:固定 H/S,只调 L 就能批量生成主题色阶(这就是 Tailwind blue-50 → blue-900 的原理)。
OKLCH:2026 年的新标准
CSS Color Module Level 4 引入的现代格式,感知均匀——参数变化和视觉变化成正比:
oklch(0.7 0.15 230) /* 亮度 / 色度 / 色相 */
- L:感知亮度,0(黑)到 1(白)
- C:色度(接近饱和度),0 到 0.4 左右
- H:色相,0-360 度
为什么值得切换? HSL 的「亮度」其实是数学定义,不符合人眼感知。HSL lightness: 50% 的黄色看起来亮、紫色看起来暗。OKLCH 真正做到「数值相同,视觉一样亮」,是设计系统的福音。
在线一键转换:3 步完成
不用记复杂公式,打开 MagicTools 颜色转换工具:
- 输入任意格式:粘贴 HEX、RGB、HSL、颜色名(red/blue/...)都可以
- 自动转换:所有格式同时显示,复制即可
- 可视化预览:右侧实时显示色块,肉眼校对
工具支持 8 种主流格式互转,包括 HEX、RGB、HSL、HSV、OKLCH、LAB、CMYK 和颜色名。
常用转换规则速查
HEX ↔ RGB
每两位 HEX 转十进制即可:
#3b82f6
3b = 59
82 = 130
f6 = 246
→ rgb(59, 130, 246)
JavaScript 一行实现:
const hexToRgb = hex => hex.match(/\w\w/g).map(x => parseInt(x, 16));
hexToRgb('3b82f6'); // [59, 130, 246]
const rgbToHex = (r, g, b) =>
'#' + [r, g, b].map(x => x.toString(16).padStart(2, '0')).join('');
rgbToHex(59, 130, 246); // '#3b82f6'
RGB ↔ HSL
公式较复杂,建议直接用工具或库(chroma.js、color、culori)。理解原理即可:
- 找到 R/G/B 中的最大值和最小值
- 平均值 → L(亮度)
- 最大-最小差值 → S(饱和度)
- 哪个通道是最大值决定 H(色相)
CSS 颜色名 → HEX
CSS 标准定义了 147 个具名颜色:
| 颜色名 | HEX | 用途 |
|---|---|---|
tomato |
#FF6347 | 警示/番茄红 |
slategray |
#708090 | 中性背景 |
forestgreen |
#228B22 | 自然主题 |
dodgerblue |
#1E90FF | 链接色 |
完整列表在 MDN Named Colors 可查。
实战场景
场景 1:从 Figma 设计稿落地代码
设计师给的色值通常是 HEX,但你的设计系统用 OKLCH:
Figma: #3b82f6
↓ 转换
oklch(0.624 0.198 259.81)
把 OKLCH 写进 CSS 变量,后续调色就能用感知友好的方式:
:root {
--primary: oklch(0.624 0.198 259.81);
--primary-light: oklch(0.75 0.15 259.81); /* 只调亮度 */
--primary-dark: oklch(0.45 0.2 259.81);
}
场景 2:动态调整透明度
需要一个颜色的 30% 透明版本:
/* HEX 8 位写法 */
background: #3b82f64d; /* 4d = 77/255 ≈ 30% */
/* RGB 写法(更易读) */
background: rgb(59 130 246 / 30%);
/* HSL/OKLCH 同理 */
background: oklch(0.624 0.198 259.81 / 0.3);
场景 3:生成主题色阶
Tailwind 那种 50/100/200/.../900 的色阶,本质是固定色相+饱和度,调亮度。用 HSL 一行公式生成:
const generateScale = (hue, sat) => {
const lightnesses = [97, 92, 85, 75, 60, 47, 38, 30, 22]; // 9 档
return lightnesses.map(l => `hsl(${hue} ${sat}% ${l}%)`);
};
generateScale(217, 91); // tailwind blue 同款
场景 4:暗色模式取色
暗色模式不能简单反转颜色。用 OKLCH 镜像亮度更自然:
/* 浅色模式 */
:root {
--bg: oklch(0.98 0.01 240);
--text: oklch(0.2 0.02 240);
}
/* 暗色模式:L 值取反 */
[data-theme="dark"] {
--bg: oklch(0.18 0.01 240);
--text: oklch(0.92 0.02 240);
}
颜色无障碍:必须满足的对比度
WCAG 2.1 规定:
| 内容类型 | AA 等级 | AAA 等级 |
|---|---|---|
| 正文(< 18pt) | 4.5:1 | 7:1 |
| 大字体(≥ 18pt) | 3:1 | 4.5:1 |
| 图形/UI 控件 | 3:1 | - |
实用工具:
- 浏览器 DevTools 内置对比度检查(鼠标悬停元素时自动显示)
- WebAIM Contrast Checker(在线计算)
- VS Code 的
Color Highlight插件
踩坑提示:紫色按钮配白字、灰底配淡灰字是最常见的低对比度错误。设计稿好看不代表能上线,必须用工具校验。
颜色管理的工程化建议
1. 全部用 CSS 变量,禁止硬编码
/* ❌ 反例 */
.button { background: #3b82f6; }
.link { color: #3b82f6; }
/* ✅ 正例 */
:root { --primary: #3b82f6; }
.button { background: var(--primary); }
.link { color: var(--primary); }
2. 命名按用途,不按外观
/* ❌ 不可维护 */
--blue-500: #3b82f6;
.cta-button { background: var(--blue-500); }
/* ✅ 可维护 */
--color-primary: #3b82f6;
--color-cta-bg: var(--color-primary);
.cta-button { background: var(--color-cta-bg); }
未来换主色只改一行,不用全局搜索替换。
3. 在 Figma 中同步 Variables
Figma 2025 的 Variables 功能可以和代码 token 双向同步。设计师改色 → 自动生成 PR,避免人工对色环节的损耗。
4. 集中管理在 design tokens 文件
{
"color": {
"primary": { "value": "#3b82f6" },
"primary-hover": { "value": "{color.primary}" }
}
}
用 Style Dictionary 等工具,一份 token 同时输出 CSS、SCSS、iOS、Android 多端。
常见问题 FAQ
Q: HEX 8 位(带透明度)兼容性如何? A: 现代浏览器(Chrome 62+、Firefox 49+、Safari 9.1+)全面支持。IE 11 不支持,但 2026 年 IE 11 已彻底退役。
Q: OKLCH 现在能放心用吗?
A: Chrome/Edge/Firefox/Safari 全部支持(Safari 15.4+、其他浏览器 2023 年后)。如果不需要兼容老旧设备,直接上。降级方案:用 PostCSS 的 oklab 插件自动转 RGB 回退。
Q: 为什么 HSL 50% 亮度的不同色相,看起来亮度不一样? A: 因为 HSL 的「亮度」是数学平均,不是人眼感知。黄色 hsl(60 100% 50%) 比蓝色 hsl(240 100% 50%) 看起来明显亮很多。这就是为什么需要 OKLCH。
Q: CMYK 和 RGB 怎么转换? A: CMYK 用于印刷,RGB 用于屏幕,两者色域不同,没有完美互转公式。屏幕设计稿如果要印刷,必须在 Photoshop 里做色彩管理(ICC profile),不能直接转换。
Q: 颜色名(red、blue)和 HEX 哪个性能更好? A: 完全相同。CSS 解析阶段都会转成 RGB 内部表示。可读性优先用颜色名,可控性优先用 HEX/HSL/OKLCH。
小结
颜色转换看似简单,背后是色彩科学、设计系统、无障碍工程的交集。2026 年的最佳实践:
- 设计稿对接:HEX
- 程序运算:RGB
- 主题色阶:HSL(旧)或 OKLCH(新)
- 设计系统:OKLCH,利用感知均匀性
- 永远用 CSS 变量集中管理
下次需要快速转换格式?打开 MagicTools 颜色转换工具 一键搞定,所有主流格式实时同步。