RGB 和 HSL 有什么区别?什么时候该用哪个

同一个颜色为什么有两种写法:RGB 给机器看,HSL 给人调;附互转思路和 CSS 选型建议

改一个按钮的悬停色,写的是 rgb(52, 152, 219),设计师说"再亮一点、再蓝一点"。盯着三个数字看半天,也不确定该动哪一个。换成 hsl(207, 90%, 61%) 就简单了:把 61% 调到 71%,"再亮一点"就完成了。RGB 和 HSL 描述的是同一个颜色,只是角度不同。

本文内容

一、RGB:面向机器的加色模型

RGB 就是 Red、Green、Blue。它把颜色拆成红、绿、蓝三盏灯的亮度,每盏从 0 调到 255。显示器、手机屏、投影仪,发光的都是这三盏灯,所以 RGB 是机器实际执行的颜色语言。

它叫"加色模型"也是这个原因:三盏灯全灭是黑,全开是白。跟调颜料正好反过来,颜料越混越暗,屏幕越叠越亮。

R红色通道

从 0(没有红光)到 255(红光拉满)。

G绿色通道

人眼对绿最敏感,大多数看起来"自然"的颜色都靠它参与调和。

B蓝色通道

偏冷偏暖主要看它,少一点偏暖,多一点偏冷。

/* 一个清爽的天蓝 */
background: rgb(52, 152, 219);
RGB 调色的麻烦:想让颜色"更亮",三个数都得跟着动。改 52、152、219 里的哪一个?新手通常只能试,试出来还不一定对——因为亮度和色相在 RGB 里是绑在一起的。

二、HSL:面向人类的直观坐标

HSL 换了个角度,用三个肉眼能直接感知的维度来描述颜色:H 色相(是什么颜色)、S 饱和度(艳不艳)、L 明度(亮不亮)。它不关心屏幕怎么发光,只管你看到的是什么。

三个维度分别管什么

  • H 色相:0 到 360 度,围成一个色相环。0 是红,120 是绿,240 是蓝。
  • S 饱和度:0% 是灰,100% 是最艳。
  • L 明度:0% 是黑,100% 是白,50% 附近是正色。

L 到 50% 时颜色最"正",往上加白变浅,往下加黑变深。hsl(207, 90%, 61%) 里的 61% 就是中等偏亮的蓝,调到 71% 更亮,调到 41% 更深——只动一个数。

/* 同一个天蓝,用 HSL 写 */
background: hsl(207, 90%, 61%);
一个容易踩的点:HSL 的 L 不是简单地"加白",而是一条从黑经纯色到白的轴。所以 50% 才是纯色,0% 是黑,100% 是白。第一次用容易把颜色调灰,记住 50% 附近是纯色就行。

三、同一颜色两种表示的互转

两者能互转,因为本质是同一个颜色空间的不同坐标。公式不复杂,但手算容易出错,实际用的时候直接上工具更省事。以 RGB→HSL 为例,核心就三步:

RGB 转 HSL 的思路

  1. 先把 0–255 归一化到 0–1:r = R / 255,g、b 同理。
  2. 取最大值和最小值,算差值 Δ,再得 L = (最大 + 最小) / 2。
  3. H 由哪个通道最大决定,S 和 L 一起算出来。

反过来 HSL→RGB 同样是确定性的。日常基本不用手算——

用颜色转换工具粘一个值就能拿到另一个,HEX 也顺带出来,比记公式靠谱。
颜色RGBHSL
天蓝rgb(52,152,219)hsl(207,90%,61%)
正红rgb(255,0,0)hsl(0,100%,50%)
草绿rgb(46,204,113)hsl(145,63%,49%)
金黄rgb(241,196,15)hsl(48,89%,50%)
紫rgb(155,89,182)hsl(285,40%,53%)

四、写 CSS 时该选哪种

没有哪个更好,只有哪个更顺手。

场景推荐写法原因
从设计稿抄固定色值RGB / HEX设计工具导出的就是这套
主题色、品牌色HSL整体调亮、调艳方便
悬停、按下状态HSL只动 L 就能做出层次
配合 CSS 变量做明暗主题HSL用 calc() 调 L 很自然

一个常用做法:把主色拆成 HSL 变量存起来,悬停态用 calc(var(--l) + 8%),深浅就自动出来了,不用再单独找色值。

:root {
  --brand-h: 207;
  --brand-s: 90%;
  --brand-l: 61%;
}
.btn {
  background: hsl(var(--brand-h), var(--brand-s), var(--brand-l));
}
.btn:hover {
  background: hsl(var(--brand-h), var(--brand-s), calc(var(--brand-l) + 8%));
}

五、调色时为什么 HSL 更好用

调色说到底是"在颜色空间里挪动位置"。RGB 的空间对人类不友好:想往"更蓝"走,得同时降 R、降 G、升 B,三个轴绑在一起。HSL 把色相、艳度、亮度拆成三个独立旋钮,调哪个只动哪个。

  • 换色系:只转 H,S 和 L 不动,整组颜色一起换 hue,做主题换肤很快。
  • 统一质感:固定 H 和 L,只动 S,从灰到艳的一组渐变就出来了。
  • 做层次:固定 H 和 S,只动 L,按钮的常态、悬停、按下三档自然有节奏。
想直观看这三个旋钮怎么联动,可以打开色相环工具,拖一下 H、S、L,色块实时跟着变。

简单说:RGB 是机器语言,HSL 是人话。写死一个颜色用 RGB 没问题,但只要涉及"调",HSL 基本都更省力。

下次再碰到"再亮一点、再蓝一点",就不用对着三个数字发愁了。换成 HSL,亮度交给 L、色相交给 H,改一个数就能看到变化。RGB 和 HSL 不是二选一,而是同一套颜色的两种标注方式,知道什么场合用哪种就够了。