← 返回工具箱

颜色代码完全指南:HEX、RGB、HSL 各自该用在哪

开发者工具箱 · 使用教程

设计稿给的是 #c0392b,代码里要写 rgb(),调色时又听说该用 hsl()——这三种写法到底什么关系,什么时候该用哪个?这篇文章讲清楚。

一、三种表示法

它们描述的是同一个东西:屏幕上一个颜色由红、绿、蓝三束光按不同强度混合而成。区别只在“怎么写”和“写起来方不方便调”。

写法示例含义
HEX#c0392b红 c0、绿 39、蓝 2b(十六进制)
RGBrgb(192, 57, 43)红 192、绿 57、蓝 43(十进制)
HSLhsl(6, 61%, 46%)色相 6°、饱和度 61%、亮度 46%

前两个本质相同,只是进制不同:c0 十六进制 = 192 十进制。第三个数是换了一套坐标系统来描述同一个颜色。

二、HEX 与 RGB:同一套坐标,两种进制

RGB 的取值范围是 0-255,每个通道刚好占一个字节。HEX 就是把这三个数用十六进制写在一起:

RGB(192, 57, 43)
  192 → c0
   57 → 39
   43 → 2b
  拼起来 → #c0392b

常见的简写形式 #fff 等价于 #ffffff,只在每两位数字相同时可用(#ff → #ffff)。#abc 是 #aabbcc。

什么时候用 HEX

什么时候用 RGB

现代 CSS 里 #c0392b80 这种 8 位 HEX 也能表示透明度(末尾两位是 alpha),但 rgba() 可读性更好,团队协作时更不容易看错。

三、HSL:为“调色”而生的坐标系

HSL 把颜色拆成三个和人直觉更接近的维度:

分量范围含义
H 色相0-360色环上的角度:0° 红、120° 绿、240° 蓝
S 饱和度0%-100%0% 是灰,100% 是最鲜艳
L 亮度0%-100%0% 黑,100% 白,50% 是正常

它的价值在于:想调出同一色系的不同深浅,只改 L 就行。

hsl(6, 61%, 30%)   深红
hsl(6, 61%, 46%)   原色   ← 同一色系
hsl(6, 61%, 70%)   浅红

换成 HEX 你得挨个算,而且不好保证“是同一色系”。所以设计系统里常把主色存成 HSL,再程序化生成 hover 态、禁用态、浅色背景。

什么时候用 HSL

四、无障碍:对比度别忽略

颜色选得好不好看是审美问题,文字看不看得清是可用性问题。WCAG 给出了明确的数字要求:

级别正文文字大号文字
AA(最低要求)4.5 : 13 : 1
AAA(更严格)7 : 14.5 : 1

“大号文字”指 18pt 以上,或者 14pt 加粗。

几个常见的坑:

一个快速自检法:把页面截成灰度图,如果文字和背景糊在一起分不清,对比度基本不够。

五、怎么用本工具转换

  1. 打开开发者工具箱的颜色转换标签页
  2. 输入 HEX(如 #c0392b),点「转换」
  3. 同时得到 RGB 与 HSL 值,以及一个颜色预览方块

转换在浏览器本地完成,不上传任何数据。

广告位 - 适合横幅广告

六、常见问题

为什么同一个 HEX 在不同屏幕上看起来不一样?
因为屏幕的色域和校准不同。同一个色值在普通笔记本屏、专业显示器、手机上会有可感知的差异。这就要求“设计稿颜色”只能作为参考,最终以实际设备看效果为准。需要严格一致就得提色彩管理,那是另一个话题了。
CSS 里颜色名(如 red、tomato)能用吗?
能,但只有约 140 个预定义名称,远远不够用,而且不同名称之间没有规律,不利于维护。正式项目里建议统一用 HEX 或 HSL,保持可计算。
透明度该用 rgba 还是 opacity?
作用对象不同。opacity 会让整个元素(包括里面的文字和子元素)一起变透明;rgba() 只让这个颜色属性本身透明,文字依然清晰。要半透明背景但文字不透明,必须用 rgba()。
为什么 hsl(0,0%,50%) 是灰色?
因为饱和度是 0。饱和度归零后,颜色退化成灰阶,此时色相值是多少都无所谓——hsl(0,0%,50%)、hsl(180,0%,50%)、hsl(300,0%,50%) 是完全一样的颜色。
HEX 后面能写 4 位或 8 位吗?
4 位是 3 位简写加透明度(#rgba),8 位是完整写法加透明度(#rrggbbaa)。都受现代浏览器支持,但如果要兼容很老的浏览器,还是用 rgba()。
怎么把品牌色快速做出深色模式版本?
如果颜色是 HSL 存的,思路很直接:保持色相 H 不变,降低亮度 L,同时略微降低饱和度 S(太鲜艳的颜色在深背景上会刺眼)。这就是为什么推荐在设计系统里用 HSL。
广告位 - 适合横幅广告