CSS 中写颜色的方式
任何接受颜色的属性(color、background-color、border-color、阴影、SVG 的 fill)都接受同样的格式。前四个色块是用四种方式写的同一种蓝色,第五个是与之相近的颜色名:
| 格式 | 示例 | 最适合 |
|---|---|---|
| 颜色名 | tomato、rebeccapurple | 快速测试和原型 |
| 十六进制 | #2563eb、#25e | 从设计工具中复制颜色 |
rgb() | rgb(37 99 235) | 加入透明度、按 RGB 值调色 |
hsl() | hsl(221 83% 53%) | 调出同一种颜色的深浅变化 |
oklch() | oklch(55% 0.2 262) | 感知亮度均匀的调色板 |
| 关键字 | transparent、currentColor | 见下面的章节 |
十六进制颜色
十六进制颜色是 # 后面跟上红、绿、蓝三个分量,每个分量用两位十六进制数字表示,范围从 00 到 ff。另外三种形式是简写或扩展:
#rgb:每一位都会重复一次,所以#25e就是#2255ee。#rrggbbaa:最后两位是 alpha,所以#2563eb80的不透明度约为 50%。#rgba:带 alpha 的简写形式。
十六进制不区分大小写:#2563EB 和 #2563eb 是同一种颜色。
rgb() 和 rgba()
rgb() 接收红、绿、蓝三个值,范围从 0 到 255(或从 0% 到 100%)。斜杠后面可选的第四个值是 alpha,范围从 0(完全不可见)到 1,或从 0% 到 100%。
color: rgb(37 99 235); /* modern space syntax */
color: rgb(37 99 235 / 50%); /* half transparent */
color: rgba(37, 99, 235, 0.5); /* older comma syntax, same result */
rgba() 和 rgb() 现在是同一个函数:两者都接受两种语法,也都可以带可选的 alpha。旧代码在需要透明度时会用 rgba(),它仍然可以正常使用。
hsl():最容易调整的格式
hsl() 描述颜色的方式和人的思考方式一致:色轮上的色相、饱和度和亮度。保持色相不变、只改亮度,就能得到一整套色阶:
第一行保持色相 221 和饱和度 83%,只改变亮度。第二行用相同的饱和度和亮度绕色轮走了一圈。
透明度:alpha 与 opacity
alpha 通道让某一种颜色变得透明。opacity 让整个元素变得透明,包括文字和子元素:
transparent 是一个关键字,表示完全透明的黑色,即 rgb(0 0 0 / 0)。它是大多数元素的默认背景。
currentColor
currentColor 等于元素自身的 color。如果一个按钮的边框、图标和文字都用它,一条声明就能改变全部颜色:
.button {
color: #16a34a;
border: 2px solid currentColor;
}
.button svg { fill: currentColor; }
边框的颜色默认就是 currentColor,所以不写颜色的 border: 2px solid 会和文字颜色一致。
试试任意颜色
用任意格式输入一个颜色。浏览器会解析它并显示计算后的结果;无效的颜色不会改变色块。
试试 tomato、#0f0、#2563eb80、rgb(0 0 0 / 25%)、oklch(70% 0.15 150) 和 color-mix(in srgb, #2563eb, white 50%)。
较新的颜色函数
oklch(L C H):亮度、彩度和色相,所在的色彩空间经过专门设计,亮度相同的颜色看起来也一样亮。用它做出的调色板,中间色阶比 HSL 更少发灰发浑。color-mix(in srgb, A, B 30%):混合两种颜色。和white或black混合,就能从一个品牌色调出浅色和深色,而且它可以和 CSS 变量一起用:color-mix(in srgb, var(--brand), white 80%)。
当前版本的 Chrome、Firefox 和 Safari 都支持这两个函数。把品牌色放在 CSS 变量里,这样无论你选哪种格式,颜色都只定义在一个地方。
常见错误
- 十六进制颜色漏了
#。color: 2563eb是无效的,会被忽略。 - 用
opacity让背景透明。 它会让文字也一起变淡。请用带 alpha 的颜色。 - 在现代语法中混用分隔符。
rgb(37 99, 235)是无效的:要么全用空格,要么全用逗号。 - 以为颜色名和你的设计稿一致。
royalblue不是#2563eb。请复制准确的颜色码。 - 凭肉眼判断对比度。 用对比度检查工具检查文字颜色和背景的对比;正文文字的对比度至少要达到 4.5:1。
常见问题
CSS 支持哪些颜色格式?
颜色名(red)、十六进制(#ff0000)、rgb()、hsl()、hwb()、lab()、lch()、oklab()、oklch() 和 color(),另外还有关键字 transparent 和 currentColor。十六进制、rgb 和 hsl 几乎能满足所有日常需要。
rgb 和 rgba 有什么区别?
现在已经没有区别了。rgba() 是旧的别名:现代 CSS 允许 rgb() 接收 alpha 值(rgb(37 99 235 / 50%)),而且在所有当前浏览器中,这两个函数接受的参数完全相同。
CSS 中如何让颜色透明?
加上 alpha 通道:rgb(0 0 0 / 50%)、hsl(221 83% 53% / 0.5),或者 8 位十六进制,例如 #2563eb80。和 opacity 不同,它只让这一种颜色变淡,而不是整个元素。
CSS 中的 HSL 是什么?
色相、饱和度、亮度。色相是色轮上的角度(0 是红色,120 是绿色,240 是蓝色),饱和度表示颜色有多鲜艳,亮度从 0% 的黑色到 100% 的白色。用它调出更浅或更深的颜色很容易:只改最后一个数字就行。
currentColor 是什么意思?
它就是元素 color 属性的值。把它用在边框或 SVG 的 fill 上,它们就会自动跟随文字颜色。