oklch()
oklch() 函数式表示法用于在 Oklab 颜色空间中表示指定颜色。oklch() 是 oklab() 的圆柱形式,使用相同的 L 轴,但带有极坐标形式的色度(C)和色相(h)坐标。
语法
/* Absolute values */
oklch(40.1% 0.123 21.57)
oklch(59.69% 0.156 49.77)
oklch(59.69% 0.156 49.77 / .5)
/* Relative values */
oklch(from green l c h / 0.5)
oklch(from #123456 calc(l + 0.1) c h)
oklch(from hsl(180 100% 50%) calc(l - 0.1) c h)
oklch(from var(--color) l c h / calc(alpha - 0.1))
值
下面描述了绝对颜色和相对颜色的允许值。
注意:通常在 CSS 中,当百分比值有等效的数值时,100% 等于数字 1。但对于 oklch() 的所有分量值来说,情况并非如此。在这里,对于 C 值,100% 等于 0.4。
绝对值语法
oklch(L C H[ / A])
参数如下:
L-
一个介于
0和1之间的<number>,一个介于0%和100%之间的<percentage>,或关键字none(在此情况下等同于0%)。在这里,数字0对应0%(黑色),数字1对应100%(白色)。该值指定了颜色的感知亮度,即“明亮度”。注意:
oklch()中的L是感知亮度,指的是我们眼睛视觉上感知的“明亮度”。这与hsl()中的L不同,后者表示的是与其他颜色相比较的亮度。 C-
一个
<number>、一个<percentage>,或关键字none(在此情况下等同于0%)。该值衡量颜色的色度(大致表示“颜色的量”)。其最小有效值为0,而最大值理论上是无限的(但实际上不超过0.5)。在这里,0%是0,100%是数字0.4。 H-
一个
<number>、一个<angle>或关键字none(在此情况下等同于0deg),表示颜色的<hue>(色相)角度。注意:在 sRGB(被
hsl()和hwb()使用)、CIELAB(被lch()使用)和 Oklab(被oklch()使用)颜色空间中,特定色相对应的角度是不同的。请参阅下面的oklch()中的色相示例以及<hue>参考页面以获取更多详细信息和示例。 A可选-
一个
<alpha-value>,表示颜色的 alpha 通道值,其中数字0对应0%(完全透明),1对应100%(完全不透明)。此外,关键字none可用于明确指定无 alpha 通道。如果未明确指定A通道值,则默认为 100%。如果包含该值,则其前面需要有一个斜杠(/)。
备注:有关 none 的效果,请参阅缺失的颜色分量。
相对值语法
oklch(from <color> L C H[ / A])
参数如下:
from <color>-
当定义相对颜色时,总是包含关键字
from,其后跟着一个表示源颜色的<color>值:这是相对颜色所基于的原始颜色。源颜色可以是任何有效的<color>语法,包括另一个相对颜色。 L-
一个介于
0和1之间的<number>,一个介于0%和100%之间的<percentage>,或关键字none(在此情况下等同于0%)。这表示输出颜色的亮度值。在这里,数字0对应0%(黑色),数字1对应100%(白色)。 C-
一个
<number>、一个<percentage>,或关键字none(在此情况下等同于0%)。该值表示输出颜色的色度值(大致表示“颜色的量”)。其最小有效值为0,而最大值理论上是无限的(但实际上不超过0.5)。在这里,0%是0,100%是数字0.4。 H-
一个
<number>、一个<angle>,或关键字none(在此情况下等同于0deg),表示输出颜色的<hue>角度。请参阅下面示例章节中的不同色相的样本。 A可选-
一个
<alpha-value>,表示输出颜色的 alpha 通道值,其中数字0对应0%(完全透明),1对应100%(完全不透明)。此外,关键字none可用于明确指定无 alpha 通道。如果未明确指定A通道值,则默认为源颜色的 alpha 通道值。如果包含该值,则其前面需要有一个斜杠(/)。
定义相对颜色输出通道分量
当在 oklch() 函数中使用相对颜色语法时,浏览器会将源颜色转换为等效的 OkLCh 颜色(如果尚未指定)。该颜色被定义为三个不同的颜色通道值——l(亮度)、c(色度)和 h(色相),外加一个 alpha 通道值(alpha)。这些通道值在函数内部可用,用于定义输出颜色的通道值。
l通道值解析为一个介于0和1(含)之间的<number>。c通道值解析为一个介于0和0.4(含)之间的<number>。h通道值解析为一个介于0和360(含)之间的<number>。alpha通道值解析为一个介于0和1(含)之间的<number>。
在定义相对颜色时,输出颜色的不同通道可以用几种不同的方式表示。下面,我们将通过一些示例来说明这些方式。
在下面的前两个示例中,我们使用了相对颜色语法。然而,第一个示例输出与源颜色相同的颜色,而第二个示例输出的颜色则完全不基于源颜色。它们并没有真正创建相对颜色!你不太可能在实际代码库中使用这些,而可能会直接使用绝对颜色值。我们包含这些示例是为了让你开始学习相对 oklch() 语法。
让我们从一个源颜色 hsl(0 100% 50%)(相当于 red)开始。下面的函数输出与源颜色相同的颜色——它使用源颜色的 l、c 和 h 通道值(0.627966、0.257704 和 29.2346)作为输出通道值。
oklch(from hsl(0 100% 50%) l c h)
此函数的输出颜色是 oklch(0.627966 0.257704 29.2346)。
下一个函数对输出颜色的通道值使用绝对值,输出了一个完全不同于源颜色的新颜色:
oklch(from hsl(0 100% 50%) 42.1% 0.25 328.363)
在上述情况中,输出颜色是 oklch(0.421 0.25 328.363)。
以下函数创建了一个基于源颜色的相对颜色:
oklch(from hsl(0 100% 50%) 0.8 0.4 h)
此示例:
- 将
hsl()源颜色转换为等效的oklch()颜色——oklch(0.627966 0.257704 29.2346)。 - 将输出颜色的
h通道值设置为源oklch()等效颜色的h通道值——29.2346。 - 将输出颜色的
l和c通道值设置为不基于源颜色的新值:分别为0.8和0.4。
最终的输出颜色是 oklch(0.8 0.4 29.2346)。
备注:如上所述,如果输出颜色使用的颜色模型与源颜色不同,源颜色会在后台被转换为与输出颜色相同的模型,以便能够以兼容的方式表示(即使用相同的通道)。
在本节我们目前看到的示例中,源颜色和输出颜色的 alpha 通道都没有被明确指定。当未指定输出颜色的 alpha 通道时,它默认为与源颜色 alpha 通道相同的值。当未指定源颜色的 alpha 通道时(且它不是相对颜色),它默认为 1。因此,上述示例中的源和输出 alpha 通道值均为 1。
让我们看一些指定源和输出 alpha 通道值的示例。第一个示例将输出 alpha 通道值指定为与源 alpha 通道值相同,而第二个示例则指定一个与源 alpha 通道值无关的不同输出 alpha 通道值。
oklch(from hsl(0 100% 50% / 0.8) l c h / alpha)
/* Computed output color: oklch(0.627966 0.257704 29.2346 / 0.8) */
oklch(from hsl(0 100% 50% / 0.8) l c h / 0.5)
/* Computed output color: oklch(0.627966 0.257704 29.2346 / 0.5) */
在下面的示例中,hsl() 源颜色再次被转换为 oklch() 的等效颜色——oklch(0.627966 0.257704 29.2346)。对 l、c、h 和 alpha 值应用 calc() 计算,最终得到的输出颜色为 oklch(0.827966 0.357704 9.23462 / 0.9)。
oklch(from hsl(0 100% 50%) calc(l + 0.2) calc(c + 0.1) calc(h - 20) / calc(alpha - 0.1))
备注:因为源颜色通道值被解析为 <number> 值,所以在使用它们进行计算时,你必须给它们加上数字,即使在通道通常接受 <percentage>、<angle> 或其他值类型的情况下也是如此。例如,将 <percentage> 添加到 <number> 是行不通的。
正式语法
<oklch()> =
oklch( [ from <color> ]? [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ <hue> | none ] [ / [ <alpha-value> | none ] ]? )
<hue> =
<number> |
<angle>
<alpha-value> =
<number> |
<percentage>
示例
调整颜色的亮度
此示例展示了改变 oklch() 函数式表示法中 L(亮度)值的效果。
HTML
<div data-color="blue-dark"></div>
<div data-color="blue"></div>
<div data-color="blue-light"></div>
<div data-color="red-dark"></div>
<div data-color="red"></div>
<div data-color="red-light"></div>
<div data-color="green-dark"></div>
<div data-color="green"></div>
<div data-color="green-light"></div>
CSS
[data-color="blue-dark"] {
background-color: oklch(10% 0.4 240);
}
[data-color="blue"] {
background-color: oklch(50% 0.4 240);
}
[data-color="blue-light"] {
background-color: oklch(90% 0.4 240);
}
[data-color="red-dark"] {
background-color: oklch(10% 0.4 20);
}
[data-color="red"] {
background-color: oklch(50% 0.4 20);
}
[data-color="red-light"] {
background-color: oklch(90% 0.4 20);
}
[data-color="green-dark"] {
background-color: oklch(10% 0.4 130);
}
[data-color="green"] {
background-color: oklch(50% 0.4 130);
}
[data-color="green-light"] {
background-color: oklch(90% 0.4 130);
}
结果
通过色度调整颜色强度
下面的示例展示了改变 oklch() 函数式表示法中 C(色度)值的效果,随着 C 值从完全饱和下降到接近灰色,颜色的强度也随之降低。
HTML
<div data-color="blue"></div>
<div data-color="blue-chroma1"></div>
<div data-color="blue-chroma2"></div>
<div data-color="blue-chroma3"></div>
<div data-color="red"></div>
<div data-color="red-chroma1"></div>
<div data-color="red-chroma2"></div>
<div data-color="red-chroma3"></div>
<div data-color="green"></div>
<div data-color="green-chroma1"></div>
<div data-color="green-chroma2"></div>
<div data-color="green-chroma3"></div>
CSS
以蓝色、红色和绿色为初始颜色,我们为它们声明了逐渐减小的色度值:从高值 0.4(相当于 100%)的完全饱和度开始,一直到 0.01(相当于 2%),这使得所有颜色都接近灰色。
[data-color="blue"] {
background-color: oklch(50% 0.4 240);
}
[data-color="blue-chroma1"] {
background-color: oklch(50% 0.2 240);
}
[data-color="blue-chroma2"] {
background-color: oklch(50% 0.1 240);
}
[data-color="blue-chroma3"] {
background-color: oklch(50% 0.01 240);
}
[data-color="red"] {
background-color: oklch(50% 100% 20deg);
}
[data-color="red-chroma1"] {
background-color: oklch(50% 50% 20deg);
}
[data-color="red-chroma2"] {
background-color: oklch(50% 25% 20deg);
}
[data-color="red-chroma3"] {
background-color: oklch(50% 2% 20deg);
}
[data-color="green"] {
background-color: oklch(50% 0.4 130);
}
[data-color="green-chroma1"] {
background-color: oklch(50% 0.2 130);
}
[data-color="green-chroma2"] {
background-color: oklch(50% 0.1 130);
}
[data-color="green-chroma3"] {
background-color: oklch(50% 0.01 130);
}
结果
如果我们使用 0 而不是 0.01 和 2%,并且亮度值相同,那么所有颜色都将是相同色调的灰色。在这个例子中,它们只是接近灰色。
OkLCh 中的色相
下面的示例展示了具有不同 H(色相)值的 oklch() 函数式表示法的色板。
HTML
<div data-color="0">0deg</div>
<div data-color="20">20deg</div>
<div data-color="40">40deg</div>
<div data-color="60">60deg</div>
等等。
CSS
[data-color="0"] {
background-color: oklch(50% 0.4 0deg);
}
[data-color="20"] {
background-color: oklch(50% 0.4 20deg);
}
[data-color="40"] {
background-color: oklch(50% 0.4 40deg);
}
[data-color="60"] {
background-color: oklch(50% 0.4 60deg);
}
等等。
结果
oklch() 中的色相角度与 hsl() 中的不同。请参阅 <hue> 了解更多信息。在 hsl() 中,sRGB 颜色的 0deg 代表红色。然而,在 CIELab 颜色空间中,0deg 对应品红色,而红色大约是 41deg。
调整颜色的 alpha 值
下面的示例展示了改变 oklch() 颜色函数中 A(alpha)值的效果。red 和 red-alpha 元素与 #background-div 元素重叠,以演示不透明度的效果。将 A 的值设为 0.4 会使颜色变为 40% 不透明。
HTML
<div id="background-div">
<div data-color="red"></div>
<div data-color="red-alpha"></div>
</div>
CSS
[data-color="red"] {
background-color: oklch(50% 0.5 20);
}
[data-color="red-alpha"] {
background-color: oklch(50% 0.5 20 / 0.4);
}
结果
在 oklch() 中使用相对颜色
此示例为三个 <div> 元素设置了不同的背景颜色。中间的元素使用了未经修改的 --base-color,而左右两边的元素则使用了该 --base-color 的提亮和变暗版本。
这些变体是使用相对颜色定义的——--base-color 自定义属性被传入一个 oklch() 函数,然后通过一个 calc() 函数修改输出颜色的亮度通道以达到预期效果。亮色变体的亮度通道增加了 0.15 (15%),而暗色变体的亮度通道减少了 0.15 (15%)。
CSS
:root {
--base-color: orange;
}
#one {
background-color: oklch(from var(--base-color) calc(l + 0.15) c h);
}
#two {
background-color: var(--base-color);
}
#three {
background-color: oklch(from var(--base-color) calc(l - 0.15) c h);
}
结果
输出如下:
规范
| 规范 |
|---|
| CSS 颜色模块第五版 # relative-Oklch |
| CSS 颜色模块第四版 # ok-lab |
浏览器兼容性
加载中…
另见
- 所有颜色表示法列表
- 使用相对颜色
- CSS 颜色模块
<hue>数据类型lch()和oklab()颜色函数- 关于 OkLCh 颜色空间的互动文章 (2024)
- CSS 中的 OKLCH:我们为什么从 RGB 和 HSL 迁移 (2024)
- 一种用于图像处理的感知颜色空间 (2020)