写在前面
-
提到色彩,即使是刚有辨知能力的小朋友,也能说上几句~
-
那我们前端工程师,无论工作还是生活,每天都在与各种色彩打交道,那便更有必要系统地了解关于色彩方面的知识
-
本文将从前端角度,聊聊色彩空间
-
根据 CSS Color Module Level 4 标准
<color> = <hex-color> | <named-color> | currentcolor | transparent <rgb()> | <rgba()> | <hsl()> | <hsla()> | <hwb()> | <lab()> | <lch()> | <gray()> | <color()> | <device-cmyk()> | <system-color>
named-color
transparent
currentcolor
system-color
减色法混色模型 CMYK 与 加色法混色模型 RGB
减色法混色模型 CMYK
- C - Cyan - 青色
- M - Magenta - 红色
- Y - Yellow - 黄色
- K - blacK - 黑色(防止与 RGB 的 B 冲突)
- 上过美术课,应该听过“红黄蓝”三原色的说法,但这和 CMYK 不太一样,实际上,颜料显示颜色的原理是它吸收了所有别的颜色的光,只反射一种颜色,所以颜料三原色其实是红、绿、蓝的补色,也就是:品红、黄、青。因为它们跟红、黄、蓝相近,所以有了这样的说法。
- 为什么会比三原色多了一色呢?
- 三种颜色调成黑色,贵
- 且不是纯粹的黑,三色等量相加之后只能形成一种深灰或深褐(我要五彩斑斓的黑
加色法混色模型 RGB
- 我们在 CSS 样式中看到的形式如 #RRGGBB 的颜色代码,就是 RGB 颜色的十六进制表示法,其中 RR、GG、BB 分别是两位十六进制数字,表示红、绿、蓝三色通道的色阶。色阶可以表示某个通道的强弱。
- 但 RGB 并不能表示人眼所见的所有颜色,它只能表示下面的这个区域
- RGB 对色彩的描述,对计算机友好,但不够人性化
- RGB 我们只能大致判断出它偏向于红色、绿色还是蓝色,或者在颜色立方体的大致位置。
- 以及对比两个 RGB 颜色的时候,我们只能通过对比它们在 RGB 立方体中的相对距离,来判断它们的颜色差异。
- 但我们对色彩的认识往往先是:颜色是什么,鲜艳不鲜艳,亮还是暗
- and It’s not easy to to alter an RGB color to produce a lighter variant of the same hue.
- 这在我们开发中也十分常见,有些时候设计师定下视觉基调和主色,我们需要根据数据情况由前端动态生成颜色值
HSL HSB&HSV
- CSS 和 Canvas2D 都可以直接支持 HSL 颜色,只有 WebGL 需要做 RGB2HSV 转换。
HSL
H - Hue - 色相 - 0-360°的圆心角
- H(hue)分量,代表的是人眼所能感知的颜色范围,这些颜色分布在一个平面的色相环上,取值范围是0°到360°的圆心角,每个角度可以代表一种颜色。
- 色相值的意义在于,我们可以在不改变光感的情况下,通过旋转色相环来改变颜色。
- 在实际应用中,我们需要记住色相环上的六大主色,用作基本参照:360°/0°红、60°黄、120°绿、180°青、240°蓝、300°洋红,它们在色相环上按照60°圆心角的间隔排列。
S - Saturation - 饱和度 - 0~1 或者 0%~100% 间的值
- 和黑白没有关系,饱和度不控制颜色中混入黑白的多寡
- 数值越大,颜色中的灰色越少,颜色越鲜艳,呈现一种从灰度到纯色的变化。
L - Lightness - 亮度 - 0~1 或者 0%~100% 间的值
- 控制纯色中的混入的黑白两种颜色
- 数值越小,色彩越暗,越接近于黑色;数值越大,色彩越亮,越接近于白色。
HSB & HSV
- HSB 又称 HSV
- HSV 色轮- WebGL 实现
- 像素坐标转换为极坐标,再除以 2π,就能得到 HSV 的 H 值
- 鼠标位置的 x、y 坐标来决定 S 和 V 的值
S - Saturation - 饱和度 - 0~1 或者 0%~100%间的值
- 控制纯色中混入白色的量,值越大,白色越少,颜色越纯;
B - Brightness - 亮度 - 0~1 或者 0%~100%间的值
- 控制纯色中混入黑色的量,值越大,黑色越少,明度越高
RGB 立方体转换成 HSL / HSV 过程
-
我们可以把这个过程简单理解成,将 RGB 颜色的立方体从直角坐标系投影到极坐标系的圆柱上
-
HSV(色相、饱和度、明度)在概念上可以被认为是颜色的倒圆锥体(黑点在下顶点,白色在上底面圆心)