1. 简介
本节内容不具有规范性。
此模块添加了新函数 contrast-color()、color-mix() 和 light-dark(), 并使用相对颜色语法扩展了现有函数。
它还扩展了 color() 函数, 以便不仅可以使用预定义的颜色空间, 还可以使用由 ICC 配置文件定义的自定义颜色空间 (包括校准的 CMYK) 在 CSS 中。
它还添加了 device-cmyk, 一种未校准 cmyk 颜色的表示形式。
2. <color> 语法
CSS中的颜色由 <color> 类型表示:
<color> = <color-base> | currentColor | <system-color> | <contrast-color()> | <device-cmyk()> | <light-dark()> <color-base> = <hex-color> | <color-function> | <named-color> | <color-mix()> | transparent <color-function> = <rgb()> | <rgba()> | <hsl()> | <hsla()> | <hwb()> | <lab()> | <lch()> | <oklab()> | <oklch()> | <color()>
绝对颜色 是一个 <color> 其计算值具有绝对的色度解释。 这意味着该值不包括:
-
currentColor(取决于 color 属性的值)
-
<system-color>(取决于颜色模式)
-
<light-dark()>(取决于颜色模式)
-
<contrast-color()> (取决于颜色模式)
-
<device-cmyk()>(无色度基础)
这些值也不能在 <color-mix()> 或相对颜色语法中使用。
3. 混合颜色:color-mix() 函数
Web 开发人员、设计工具和设计系统开发人员经常使用颜色函数来辅助扩展其组件颜色关系的设计。 随着支持多平台和多种用户偏好(例如 UI 中深色模式功能的增强)的设计系统的使用日益增多, 这种无需手动设置颜色,而是通过单一来源计算配色方案的方式变得更加有用。
目前,Sass、HSL 值上的 calc() 或 PostCSS 被用于实现此目的。 然而,预处理器无法处理动态调整的颜色; 所有当前的解决方案都局限于 sRGB 色域以及 HSL 的感知局限性 (颜色在色轮中聚集在一起, 并且两种视觉上亮度不同的颜色, 例如黄色和蓝色,可能具有相同的 HSL 亮度)。
为了满足这一需求,color-mix() 函数接受两个 <color> 规范, 并返回在给定的 <color-space> 中, 按指定量混合它们的结果。
color-mix() = color-mix( <color-interpolation-method> , [ <color> && <percentage [0,100]>? ]#{2})
测试
3.1. 百分比归一化
百分比必须在 0% 到 100% 之间。特别禁止负百分比。百分比按如下方式归一化:
-
令 p1 为第一个百分比,p2 为第二个。
-
如果两个百分比都被省略,它们都默认为 50% (两个颜色的等量混合)。
-
否则,如果 p2 被省略,则其值为 100% - p1
-
否则,如果 p1 被省略,则其值为 100% - p2
-
否则,如果两者相加大于 100%,它们会相应地缩放,使它们的和等于 100%。
-
否则,如果两者相加小于 100%,则将总和保存为 alpha 乘数。 然后它们会相应地缩放,使它们的和等于 100%。
这意味着 p1 变为 p1 / (p1 + p2) 并且 p2 变为 p2 / (p1 + p2)。
color-mix ( in lch, purple50 % , plum50 % ) color-mix ( in lch, purple50 % , plum) color-mix ( in lch, purple, plum50 % ) color-mix ( in lch, purple, plum) color-mix ( in lch, plum, purple) color-mix ( in lch, purple80 % , plum80 % )
所有这些都会生成 purple 和 plum 的 50-50 混合, 在 lch 中: lch(51.51% 52.21 325.8) 即 rgb(68.51% 36.01% 68.29%)。
然而,这种形式 不是 一样的,因为 alpha 小于 1:
color-mix ( in lch, purple30 % , plum30 % )
这会生成 lch(51.51% 52.21 325.8 / 0.6) 即 rgb(68.51% 36.01% 68.29% / 0.6)。
3.2. 计算 color-mix 的结果
在归一化两个百分比后,结果通过以下算法产生:
-
如 CSS Color 4 第 12 节. 颜色插值 所述, 两个颜色转换为指定的插值 <color-space>, 考虑到任何 相似组件。
-
然后,颜色在指定的颜色空间中进行插值, 如 CSS 颜色 4 § 12. 颜色插值中所述。 如果指定的颜色空间是 cylindrical-polar-color 空间, 则 <hue-interpolation-method> 控制色相的插值,如 CSS 颜色 4 § 12.4 色相插值中所述。 如果未指定 <hue-interpolation-method>, 则如同指定了 shorter 一样。
-
如果在百分比归一化过程中产生了 alpha 乘数, 则插值结果的 alpha 分量将乘以 alpha 乘数。
测试
- color-mix-basic-001.html (live test) (source)
- color-mix-missing-components.html (live test) (source)
- color-mix-non-srgb-001.html (live test) (source)
- color-computed-color-mix-function.html (live test) (source)
- color-invalid-color-mix-function.html (live test) (source)
- color-valid-color-mix-function.html (live test) (source)
- color-mix-out-of-gamut.html (live test) (source)
- 2d.fillStyle.colormix.html (live test) (source)
- 2d.fillStyle.colormix.currentcolor.html (live test) (source)
- 2d.strokeStyle.colormix.html (live test) (source)
混合的结果是在从第二个颜色到第一个颜色的渐进线上指定百分比处的颜色。
注意:因此,0% 的百分比仅返回转换为指定颜色空间的另一个颜色, 而 100% 返回转换为指定颜色空间的相同颜色。
color-mix ( in lch, peru40 % , palegoldenrod)
混合是在 lch 颜色空间中进行的。 这是一个俯视图,沿着中性 L 轴观察:
计算如下:
-
peru 为 lch(62.253% 54.011 63.677)
-
palegoldenrod 为 lch(91.374% 31.406 98.834)
-
混合后的亮度为 62.253 * 40/100 + 91.374 * (100-40)/100 = 79.7256
-
混合后的色度为 54.011 * 40/100 + 31.406 * (100-40)/100 = 40.448
-
混合后的色相为 63.677 * 40/100 + 98.834 * (100-40)/100 = 84.771
-
混合后的结果为 lch(79.7256% 40.448 84.771)
注意:对色相和色度进行插值 使中间颜色的饱和度 与终点颜色一样饱和。
color-mix ( in lch, teal65 % , olive);
计算如下:
-
sRGB teal (#008080) 为 lch(47.9855% 31.6903 196.4524)
-
sRGB olive (#808000) 为 lch(52.1496% 56.8124 99.5746)
-
混合亮度为 47.9855 * 0.65 + 52.1496 * 0.35 = 49.4429
-
混合色度为 31.6903 * 0.65 + 56.8124 * 0.35 = 40.4830
-
混合色相为 196.4524 * 0.65 + 99.5746 * 0.35 = 162.5452
-
混合结果为 lch(49.4429% 40.4830 162.5452)
-
这是稍微偏蓝的绿色: rgb(7.7377% 52.5730% 37.3213%)
3.3. 混合颜色空间对 color-mix 的影响
选择的混合颜色空间会对最终结果产生很大影响。
color-mix ( in lch, white, black); color-mix ( in xyz, white, black); color-mix ( in srgb, white, black);
计算如下:
-
sRGB 白色 (#FFF) 为 lch(100% 0 0)
-
sRGB 黑色 (#000) 为 lch(0% 0 0)
-
LCH 中的混合为 lch(50% 0 0)
-
XYZ 中的混合为 lch(76% 0 0)
-
sRGB 中的混合为 lch(53.4% 0 0)
LCH 中的混合给出 L 值为 50%, 一个完美的中灰,完全符合预期 (在 Lab 中混合也会产生相同的结果, 因为 LCH 和 Lab 的亮度轴是相同的)。
XYZ 中的混合结果过亮; XYZ 是线性光,但不是感知一致的。 sRGB 中的混合结果也稍微过亮; sRGB 既不是感知一致的,也不是线性光。
color-mix ( in xyz, rgb ( 82.02 % 30.21 % 35.02 % ) 75.23 % , rgb ( 5.64 % 55.94 % 85.31 % ));
计算如下:
-
rgb(82.02% 30.21% 35.02%) 为 lch(52% 58.1 22.7),即 X=0.3214, Y=0.2014, Z=0.0879。
-
rgb(5.64% 55.94% 85.31%) 为 lch(56% 49.1 257.1),即 X=0.2070, Y=0.2391, Z=0.5249。
-
混合结果 X=(0.3214 * 0.7523) + (0.2070 * (1 - 0.7523)) = 0.29306。
-
混合结果 Y=(0.2014 * 0.7523) + (0.2391 * (1 - 0.7523)) = 0.21074。
-
混合结果 Z=(0.0879 * 0.7523) + (0.5249 * (1 - 0.7523)) = 0.19614。
-
混合结果为 lch(53.0304% 38.9346 352.8138),即 rgb(72.300% 38.639% 53.557%)
该示例是白色和蓝色的 50% 混合, 在三个不同的颜色空间中。
color-mix ( in lch, white, blue); color-mix ( in oklch, white, blue); color-mix ( in srgb, white, blue);
计算如下:
-
白色 为 rgb(100% 100% 100%), 即 lch(100% 0 none), 即 oklch(100% 0 none)
-
蓝色 为 rgb(0% 0% 100%), 即 lch(29.5683% 131.201 301.364), 即 oklch(45.201% 0.31321 264.052)
-
在 lch 中的混合为 lch(64.7841% 65.6008 301.364),略带紫色
-
在 oklch 中的混合为 oklch(72.601% 0.15661 264.052)
-
在 sRGB 中的混合为 rgb(50% 50% 100%),也稍带紫色
color-mix ( in hsl, color ( display-p30 1 0 ) 80 % , yellow);
计算如下:
-
color(display-p3 0 1 0) 为 color(srgb -0.5116 1.01827 -0.3107),超出了 sRGB 色域
-
转换为 hsl hsl(127.879 301.946 25.334)
-
黄色为 hsl(60 100% 50%)
-
色相为 127.879 × 0.8 + 60 × 0.2 = 114.3032
-
饱和度为 301.946 × 0.8 + 100 × 0.2 = 261.5568
-
亮度为 25.334 × 0.8 + 50 × 0.2 = 30.2672
-
混合结果为 hsl(114.3032 261.5568 30.2672),即 color(srgb -0.3387 1.0943 -0.48899)
3.4. 非完全不透明的 alpha 对 color-mix 的影响
到目前为止,所有 color-mix() 示例 都使用了完全不透明的颜色。 为了简化示例, 省略了预乘和反预乘步骤, 因为这些步骤只会乘以 1 和除以 1, 所以结果不会改变。
在一般情况下, 颜色可能具有非单位 alpha 分量, 因此预乘、插值、反预乘步骤 不得省略。
color-mix ( in srgb, rgb ( 100 % 0 % 0 % /0.7 ) 25 % , rgb ( 0 % 100 % 0 % /0.2 ));
计算如下:
-
rgb(100% 0% 0% / 0.7) 预乘后为 [0.7, 0, 0]
-
rgb(0% 100% 0% / 0.2) 预乘后为 [0, 0.2, 0]
-
预乘、插值结果为 [0.7 * 0.25 + 0 * (1 - 0.25), 0 * 0.25 + 0.2 * (1 - 0.25), 0 * 0.25 + 0 * (1 - 0.25)] 即 [0.175, 0.150, 0]
-
插值后的 alpha 为 0.7 * 0.25 + 0.2 * (1 - 0.25) = 0.325
-
解乘后的结果为 [0.175 / 0.325, 0.150 / 0.325, 0 / 0.325] 即 [0.53846, 0.46154, 0]
-
因此混合颜色为 color(srgb 0.53846 0.46154 0 / 0.325)
错误的计算如下:
-
插值结果为 [1 * 0.25 + 0 * (1 - 0.25), 0 * 0.25 + 1 * (1 - 0.25), 0 * 0.25 + 0 * (1 - 0.25)] 即 [0.25, 0.75, 0]
-
因此错误的混合颜色为 color(srgb 0.25 0.75 0 / 0.325)
这是一个巨大的差异;正确和错误结果之间的 ΔE2000 为 30.7!
当百分比归一化生成 alpha 乘数时,计算与之前相同,只是多了最后一步。
但在此示例中,百分比指定为 第一个颜色的 20% 和第二个颜色的 60%。 这加起来为 80%,因此 alpha 乘数为 0.8。
混合百分比然后被缩放
乘以 100/80:
20% * 100/80 = 25%
60% * 100/80 = 75%
最终得到与前一个示例相同的混合百分比。
color-mix ( in srgb, rgb ( 100 % 0 % 0 % /0.7 ) 20 % , rgb ( 0 % 100 % 0 % /0.2 ) 60 % );
计算如下:
-
rgb(100% 0% 0% / 0.7) 预乘后为 [0.7, 0, 0]
-
rgb(0% 100% 0% / 0.2) 预乘后为 [0, 0.2, 0]
-
预乘、插值结果为 [0.7 * 0.25 + 0 * (1 - 0.25), 0 * 0.25 + 0.2 * (1 - 0.25), 0 * 0.25 + 0 * (1 - 0.25)] 即 [0.175, 0.150, 0]
-
插值后的 alpha 为 0.7 * 0.25 + 0.2 * (1 - 0.25) = 0.325
-
解乘后的结果为 [0.175 / 0.325, 0.150 / 0.325, 0 / 0.325] 即 [0.53846, 0.46154, 0]
-
因此混合颜色为 color(srgb 0.53846 0.46154 0 / 0.325)
-
存在 0.8 的 alpha 乘数, 因此混合结果的 alpha 实际上为 0.325 * 0.8 = 0.260, 因此混合颜色实际为 color(srgb 0.53846 0.46154 0 / 0.260)
注意: 不要将插值后的 alpha 乘以 alpha 乘数然后再用于解乘。 如果混合百分比未缩放为 100%,这样做是正确的, 但实际上它们已缩放,因此这样做会使混合颜色调整两次。
4. 相对颜色
4.1. 相对颜色的处理模型
在本规范的先前级别中, 颜色函数只能以绝对方式指定颜色, 即直接指定所有颜色分量。
新的相对颜色语法 扩展了现代颜色语法,允许使用颜色函数修改现有颜色: 如果指定了原始颜色, 那么每个颜色分量 (以及 alpha 分量,如果指定) 可以要么直接指定, 要么从原始颜色中获取 (并可能使用数学函数进行修改)。
原始颜色和相对颜色不必使用相同的颜色函数。
所有操作都在相对颜色函数的颜色空间中进行;如果原始颜色的原始指定颜色空间使用了不同的颜色函数, 它会首先转换为所选的颜色函数, 以便它具有对分量有意义的值,并且分量关键字指的是相对颜色的颜色空间,而不是原始颜色的颜色空间。
如果省略相对颜色的 alpha 值, 它将默认为原始颜色的 alpha 值(而不是像在绝对语法中那样默认为 100%)。
当使用相对颜色语法时,颜色分量值, 无论是直接指定的还是由颜色空间转换产生的, 都不会被限制在参考范围内,而是按原样保留。 如果目标颜色空间能够表示它们,这将保留超出色域的值。
然而,当使用相对颜色语法时,alpha 分量值, 无论是直接指定的还是由颜色空间转换产生的,会被限制在参考范围内。
缺失分量的处理方式与CSS 颜色 4 § 12.2 缺失分量的插值相同: 检查原始颜色空间和相对函数颜色空间是否存在相似分量,然后将其作为缺失分量沿用。
虽然相对颜色语法的大多数用法 会在其相应的参数中使用分量关键字, 但您可以在任何位置使用它们。
在正常位置之外使用分量时要小心; 当百分比解析为数字时, 如果这些数字用在不同的地方, 则没有“神奇的缩放”来解释位置的改变。
4.2. 相对颜色语法
下面列出了每个函数为适应相对颜色而进行的语法更改的精确细节, 但它们都遵循一个共同的结构:
-
如果未指定原始颜色,则该函数不是相对颜色。
-
如果指定了原始颜色, 其余参数可以像往常一样直接指定, 或者指定为引用转换为相对颜色颜色空间的原始颜色的某个分量的分量关键字。数学函数也可以使用这些关键字 来动态修改原始颜色的分量。
-
相对颜色语法不会改变参数是必需的还是可选的。
-
但是,原始颜色可以使用现代或传统语法。
分量关键字返回一个<number>,或 none; 如果它们最初被指定为<percentage> 或 <angle>, 则该<percentage> 将解析为<number>,并且该<angle> 将解析为范围 [0, 360] 内的度数<number>(这是规范单位)。
测试
- relative-currentcolor-a98rgb-01.html (live test) (source)
- relative-currentcolor-lch-01.html (live test) (source)
- relative-currentcolor-rgb-01.html (live test) (source)
- relative-currentcolor-displayp3-01.html (live test) (source)
- relative-currentcolor-oklab-01.html (live test) (source)
- relative-currentcolor-rgb-02.html (live test) (source)
- relative-currentcolor-hsl-01.html (live test) (source)
- relative-currentcolor-oklch-01.html (live test) (source)
- relative-currentcolor-xyzd50-01.html (live test) (source)
- relative-currentcolor-hsl-02.html (live test) (source)
- relative-currentcolor-prophoto-01.html (live test) (source)
- relative-currentcolor-xyzd65-01.html (live test) (source)
- relative-currentcolor-hwb-01.html (live test) (source)
- relative-currentcolor-rec2020-01.html (live test) (source)
- relative-currentcolor-lab-01.html (live test) (source)
- relative-currentcolor-rec2020-02.html (live test) (source)
- relative-currentcolor-visited-getcomputedstyle.html (live test) (source)
- color-computed-relative-color.html (live test) (source)
- color-invalid-relative-color.html (live test) (source)
- color-valid-relative-color.html (live test) (source)
- relative-color-out-of-gamut.html (live test) (source)
html{ --bluegreen : oklab ( 54.3 % -22.5 % -5 % ); } .overlay{ background : oklab ( fromvar ( --bluegreen) calc ( 1.0 - l) calc ( a *0.8 ) b); }
在这个示例中,指定的百分比被解析为数值, 生成 oklab(0.543 -0.09 -0.02)。 结果颜色是 l = 1 - 0.543 = 0.457, a = -0.09 * 0.8 = -0.072, b 不变为 -0.02: oklab(0.457 -0.072 -0.02)。
html{ --base : oklch ( 52.6 % 0.115 44.6 deg ) } .summary{ background : oklch ( fromvar ( --base) l ccalc ( h +90 )); }
在这个示例中,结果颜色是 oklch(0.526 0.115 134.6)。
html{ --color : green; } .foo{ --darker-accent : lch ( fromvar ( --color) calc ( l /2 ) c h); }
在此示例中,通过将其亮度减半来使原始颜色变暗, 而不改变颜色的任何其他方面。
另请注意,原始颜色是一个颜色关键字 (因此是 sRGB), 但由于在 lch() 函数中使用,它会自动解释为 LCH 颜色。
html{ --bg-color : blue; } .overlay{ background : rgb ( fromvar ( --bg-color) r g b /80 % ); }
在此示例中,原始颜色的 r、g 和 b 分量保持不变, 通过使用从原始颜色中获取其值的关键字来指定它们, 但将不透明度设置为 80% 以使其略微透明, 而不管原始颜色的不透明度如何。
--vivid-yellow : color ( display-p31 1 0 ); --paler-yellow : color ( fromvar ( --vivid-yellow) srgb r gcalc ( b +0.5 ));
此处 --vivid-yellow 转换为 sRGB 后, 是 rgb(100% 100% -34.63%) 并且负蓝色分量未被裁剪。 RCS 计算的结果是 rgb(100% 100% 15.37%)
--tan : oklch ( 78 % 0.06 75 /0.7 ); --deeper-tan : oklch ( fromvar ( --tan) l c h /calc ( alpha *2 ));
--blue-into-gray : rgb ( fromvar ( --color) calc ( r *.3 + g *.59 + b *.11 ) calc ( r *.3 + g *.59 + b *.11 ) calc ( r *.3 + g *.59 + b *.11 ));
使用此方法,红色 将变为 rgb(76.5 76.5 76.5),石灰色 将变为 rgb(150.45 150.45 150.45), 而蓝色将变为 rgb(150.45 150.45 150.45)。 像深橄榄绿色这样更温和的颜色, 其 RGB 值为 rgb(85 107 47), 将变为 rgb(93.8 93.8 93.8)。
(粗略是因为首先, 虽然这看起来像亮度计算, 但红、绿和蓝值是在伽马编码空间中操作的, 而不是线性光空间; 其次, 权重因子是用于已过时的 NTSC 颜色空间的, 而不是 sRGB。)
(另请注意,这只是为了说明语法; 一种更简单、更准确的灰度处理颜色的方法是使用 oklch() 函数, 因为该颜色空间对人类感知更准确:oklch(from var(--color) l 0 h) 保留亮度, 但将色度(决定颜色“鲜艳”程度的因素)归零。)
例如,
color : color ( fromcolor ( srgb0 0 0 /60 % ) srgb alpha0.6 0.6 /0.9 );
alpha 分量解析为<number>, 得到 0.6;因此结果颜色为 color(srgb 0.6 0.6 0.6 / 0.9)。
然而,在第二个示例中,alpha 再次解析为 0.6, 由于 rgb() 语法中颜色分量范围为 0 到 255,因此会产生截然不同的颜色:
color : rgb ( fromrgb ( 0 0 0 /60 % ) alpha153 153 /0.9 );
结果为 rgb(0.6 153 153 / 0.9) 而不是 rgb(153 153 153 / 0.9)。
html{ --bg : hsl ( none3 % 50 % ); } .foo{ --darker-bg : oklch ( fromvar ( --bg) calc ( l *0.8 ) c h); } .bar{ background : linear-gradient ( in Oklab to right, var ( --darker-bg), #4C3); }
--bg 转换为 OKLCh 后的值为 oklch(0.592 0.009 17.42) 但相似的色相分量被沿用 得到 oklch(0.592 0.009 none)。 然后这些值在相对函数中使用,得到 较暗的颜色 oklch(0.474 0.009 none)。
渐变中的浅绿色是 oklch(0.743 0.222 141.6), 因此,在插值时,另一种颜色采用该色相, 变为 oklch(0.474 0.009 141.6)。
因此,渐变将具有恒定的绿色色调。
如果实现未能执行此沿用操作, 灰色的 --darker-bg 将具有 0 的色相, 从而在渐变开始时产生不希望的微红色调。

但是,如果对缺失值进行计算,none 将被视为 0。
4.3. 相对 sRGB 颜色
现代颜色语法的 rgb() 和 rgba() 函数的语法扩展如下:
<modern-rgb-syntax> = rgb( [ from <color> ]? [ <number> | <percentage> | none]{3} [ / [<alpha-value> | none] ]? ) <modern-rgba-syntax> = rgba( [ from <color> ]? [ <number> | <percentage> | none]{3} [ / [<alpha-value> | none] ]? )
在相对颜色语法 rgb() 或 rgba() 函数中, 允许的组件关键字有:
-
r、g 和 b 都是<number>, 对应于原始颜色在(如果需要)转换为 sRGB 后的红色、绿色和蓝色分量。 255.0 等同于 100%。
rgb ( from indianred255 g b)
这将获取 indianred 的 sRGB 值 (205 92 92) 并将红色分量替换为 255,得到 rgb(255 92 92)。
相对 sRGB 颜色语法仅适用于非旧版 RGB 句法形式。
rgb ( from darkblue16 32 b /0.5 )
这将获取 darkblue 的 sRGB 值 (0 0 139) 并替换红色、绿色和 alpha 分量,得到 rgb(16 32 139 / 0.5)
4.4. 相对 HSL 颜色
现代颜色语法的 hsl() 和 hsla() 函数的语法扩展如下:
<modern-hsl-syntax> = hsl([from <color>]? [<hue> | none] [<percentage> | <number> | none] [<percentage> | <number> | none] [ / [<alpha-value> | none] ]? ) <modern-hsla-syntax> = hsla([from <color>]? [<hue> | none] [<percentage> | <number> | none] [<percentage> | <number> | none] [ / [<alpha-value> | none] ]? )
在相对颜色语法 hsl() 或 hsla() 函数中, 允许的组件关键字有:
-
h 是一个<number>,对应于原始颜色在(如果需要)转换为 sRGB 后,归一化到 [0, 360] 范围内的 HSL 色相(以度为单位)。90 等同于 90deg。
-
s 和 l 是<number>,对应于原始颜色在(如果需要)转换为 sRGB 后的 HSL 饱和度和亮度。 100 等同于 100%。
--accent : lightseagreen; --complement : hsl ( fromvar ( --accent) calc ( h +180 ) s l);
lightseagreen 是 hsl(177deg 70% 41%),所以 --complement 是 hsl(357deg 70% 41%)
相对 HSL 颜色语法仅适用于非遗留的 HSL 语法形式。
4.5. 相对 HWB 颜色
hwb() 函数的语法被扩展如下:
hwb() = hwb([from <color>]? [<hue> | none] [<percentage> | <number> | none] [<percentage> | <number> | none] [ / [<alpha-value> | none] ]? )
-
h 是一个<number>,对应于原始颜色在(如果需要)转换为 sRGB 后,归一化到 [0, 360] 范围内的 HWB 色相(以度为单位)。90 等同于 90deg。
-
w 和 b 是<number>,对应于原始颜色在(如果需要)转换为 sRGB 后的 HWB 白度和黑度。 100 等同于 100%。
4.6. 相对 Lab 颜色
lab() 函数的语法被扩展如下:
lab() = lab([from <color>]? [<percentage> | <number> | none] [<percentage> | <number> | none] [<percentage> | <number> | none] [ / [<alpha-value> | none] ]? )
-
l 是一个<number>,对应于原始颜色在(如果需要)转换为 CIE Lab 后的 CIE 亮度。 100 等同于 100%。
-
a 和 b 是<number>, 对应于原始颜色在(如果需要)转换为 CIE Lab 后的 CIE Lab a 和 b 轴。 125 等同于 100%,而 -125 等同于 -100%。
-
lab(from var(--mycolor) l a b / 100%) 将 var(--mycolor) 的 alpha 设置为 1.0,而不管它原来是多少。
-
lab(from var(--mycolor) l a b / calc(alpha * 0.8)) 将 var(--mycolor) 的 alpha 减少原值的 20%。
请注意,所有调整都是无损的,因为不会发生色域剪裁,因为 lab() 涵盖所有可见颜色。 这对基于 sRGB 的函数中的 alpha 调整(例如 'rgb()'、'hsl()' 或 'hwb()')是不成立的, 这些函数还会在计算 HSL 或 HWB 之前将颜色转换为 sRGB, 并且还会调整 alpha 透明度。
--mycolor : orchid; // orchid 是lab ( 62.753 52.460 -34.103 ) --mygray:lab ( fromvar ( --mycolor) l0 0 ) // mygray 是lab ( 62.753 0 0 ) 即rgb ( 59.515 % 59.515 % 59.515 % )
4.7. 相对 Oklab 颜色
oklab() 函数的语法被扩展如下:
oklab() = oklab([from <color>]? [<percentage> | <number> | none] [<percentage> | <number> | none] [<percentage> | <number> | none] [ / [<alpha-value> | none] ]? )
在相对颜色语法 oklab() 函数中, 允许的组件关键字有:
-
l 是一个<number>,对应于原始颜色在(如果需要)转换为 Oklab 后的 Oklab 亮度。 1.0 等同于 100%。
-
a 和 b 是<number>, 对应于原始颜色在(如果需要)转换为 Oklab 后的 Oklab a 和 b 轴。 0.4 等同于 100%,而 -0.4 等同于 -100%。
4.8. 相对 LCH 颜色
lch() 函数的语法被扩展如下:
lch() = lch([from <color>]? [<percentage> | <number> | none] [<percentage> | <number> | none] [<hue> | none] [ / [<alpha-value> | none] ]? )
-
l 是一个<number>,对应于原始颜色在(如果需要)转换为 CIE LCH 后的 CIE 亮度。 100 等同于 100%。
-
c 是一个<number>,对应于原始颜色在(如果需要)转换为 CIE LCH 后的 LCH 色度。 150 等同于 100%。
-
h 是一个<number>,对应于原始颜色在(如果需要)转换为 CIE LCH 后,归一化到 [0, 360] 范围内的 LCH 色相(以度为单位)。90 等同于 90deg。
--accent : lightseagreen; --complement : lch ( fromvar ( --accent) l ccalc ( h +180 ));
lightseagreen 是 lch(65.4937 39.4484 190.1013),因此 --complement 是 lch(65.4937 39.4484 370.1013)
--mycolor : orchid; // orchid 是lch ( 62.753 62.571 326.973 ) --mygray:lch ( fromvar ( --mycolor) l0 h); // mygray 是lch ( 62.753 0 326.973 ) ,即rgb ( 59.515 % 59.515 % 59.515 % )
但现在(由于色相被保留)再次 重新饱和:
--mymuted : lch ( fromvar ( --mygray) l30 h); // mymuted 是lch ( 62.753 30 326.973 ) ,即rgb ( 72.710 % 53.293 % 71.224 % )
然而,不同于 HSL,操纵结果不能保证处于色域内。
--mycolor : lch ( 60 % 90 320 ); lch ( fromvar ( --mycolor) l ccalc ( h -120 ));
这会生成一个高色度的青绿色, lch(60% 90 200) 即 color(srgb -0.6 0.698 0.772), 因此超出了 sRGB 色域(负红值)。 实际上,它也超出了 display-p3 色域: color(display-p3 -0.46 0.68 0.758), 甚至超出了 rec2020 色域: color(rec2020 -0.14 0.623 0.729)。
在 sRGB 色域内的最接近颜色为 lch(60.71% 37.56 201.1) 即 rgb(0% 64.2% 66.3%)。色度差异(37.5 代替 90)非常大。
图示 CIE CH 平面,显示相对颜色操作。 a 和 b 轴有标记, 并在中间相交。 我们从中央亮度轴向下看。 sRGB 色域的最大色域显示为不规则的凸多边形。
在 HSL 中执行相同操作将返回一个色域内的结果。 但它在其他方面不尽如人意:
--mycolor : lch ( 60 % 90 320 ); hsl ( fromvar ( --mycolor) calc ( h -120 ) s l);
在 HSL 中,--mycolor 是 hsl(289.18 93.136% 65.531%) 因此减去 120 度得出 hsl(169.18 93.136% 65.531%)。 将该结果转换回 LCH 时, lch(89.0345% 49.3503 178.714) 我们看到,由于 HSL 中的色相旋转, 亮度从 60% 增加到 89%, 色度从 90 降至 49, 而色相实际上改变了 141 度,而不是 120 度。
4.9. 相对 OKLCh 颜色
oklch() 函数的语法扩展如下:
oklch() = oklch([from <color>]? [<percentage> | <number> | none] [<percentage> | <number> | none] [<hue> | none] [ / [<alpha-value> | none] ]? )
在相对颜色语法 oklch() 函数中, 允许的组件关键字有:
-
l 是一个<number>,对应于原始颜色在(如果需要)转换为 OKLCh 后的 Oklab 亮度。 1.0 等同于 100%。
-
c 是一个<number>,对应于原始颜色在(如果需要)转换为 OKLCh 后的 OKLCh 色度。 0.4 等同于 100%。
-
h 是一个<number>,对应于原始颜色在(如果需要)转换为 OKLCh 后,归一化到 [0, 360] 范围内的 OKLCh 色相(以度为单位)。90 等同于 90deg。
因为 OKLCh 既具有感知均匀性又保留色度, 并且其轴对应于易于理解的颜色属性, 所以 OKLCh 是进行颜色操作的理想选择。
--mycolor : lch ( 60 % 90 320 ); oklch ( fromvar ( --mycolor) l ccalc ( h -120 ));
--mycolor 是 oklch(0.69012 0.25077 319.893)。 从色相中减去 120 会得到一个色度非常高的蓝绿色, oklch(0.69012 0.25077 199.893) 这超出了 sRGB 色域, color(srgb -0.6018 0.7621 0.8448) 正如负红色分量所示。 通过降低 OKLCh 色度将其纳入色域,得到 oklch(0.69012 0.1173 199.893)。 OKLCh 色度已从 0.251 降至 0.117。
5. 定义预设和自定义颜色空间:color() 函数
color() 函数允许在特定的、给定的颜色空间中指定颜色(而不是大多数其他颜色函数运行所在的隐式 sRGB 颜色空间)。
在此层级,color() 函数扩展支持自定义颜色空间,除了来自CSS Color 4 § 10. 预定义颜色空间 的预定义空间外。
它还扩展支持相对颜色,而不仅仅是绝对颜色。
其语法如下:
color() = color( [from <color>]? <colorspace-params> [ / [ <alpha-value> | none ] ]? ) <colorspace-params> = [<custom-params> | <predefined-rgb-params> | <xyz-params>] <custom-params> = <dashed-ident> [ <number> | <percentage> | none ]+ <predefined-rgb-params> = <predefined-rgb> [ <number> | <percentage> | none ]{3} <predefined-rgb> = srgb | srgb-linear | display-p3 | a98-rgb | prophoto-rgb | rec2020 <xyz-params> = <xyz> [ <number> | <percentage> | none ]{3} <xyz> = xyz | xyz-d50 | xyz-d65
color 函数的参数指定了一个颜色,并明确列出颜色空间。
它可以表示一个 无效颜色,如下文所述,或一个 有效颜色。
任何非 无效颜色 的颜色都是 有效颜色。
颜色可以是 有效颜色,但仍然超出输出设备(屏幕、投影仪或打印机)可以显示的颜色范围。此时被称为 色域外。
色域外的颜色其分量值小于 0 或 0%,或大于 1 或 100%。这些值并不无效;在显示时,它们会在计算值阶段使用相对比色法映射为色域内值(0/0% 到 1/100%)。
每个 有效颜色要么在输出设备的色域内(屏幕或打印机),要么是 色域外。
5.1. 相对 Color-Function 颜色
在相对颜色语法 color() 函数(使用 <custom-params>)中, 允许的组件关键字的数量和名称为:
-
由相应 @color-profile 上的 components 描述符定义(如果存在); 否则,没有相对颜色操作是有效的。它们是<number>,对应于原始颜色在(如果需要)转换为颜色配置文件的颜色空间后的组件。值 1.0 对应于 100%。
在相对颜色语法 color() 函数(使用 <predefined-rgb-params>)中, 允许的组件关键字有:
-
r、g 和 b 都是<number>, 对应于原始颜色在(如果需要)转换为预定义 RGB 颜色空间后的红色、绿色和蓝色分量。 值 1.0 对应于 100%。
在相对颜色语法 color() 函数(使用 <xyz-params>)中, 允许的组件关键字有:
-
x、y、z 都是<number>, 对应于原始颜色在(如果需要)转换为适应相关白点的相对 CIE XYZ 颜色空间后的 X、Y 和 Z 分量。 值 1.0 对应于 100%。
在相对颜色语法 color() 函数(使用 <predefined-rgb-params> 或 <xyz-params>)中, 一个额外允许的组件关键字是:
参数具有以下形式:
-
一个 <ident> 或 <dashed-ident>,用于表示颜色空间。 如果这是一个 <ident>,它表示 CSS 颜色 4 § 10. 预定义颜色空间中的一个预定义颜色空间(例如 display-p3); 如果它是一个 <dashed-ident>,它表示一个自定义 颜色空间,由 @color-profile 规则定义。 各个预定义的颜色空间 可能会进一步限制是否可以使用<number> 或 <percentage>, 或两者都可以使用。
如果 <ident> 命名了一个不存在的颜色空间 (一个与任何预定义颜色空间都不匹配的名称), 或一个预定义但不受支持的颜色空间, 则此参数表示一个无效颜色。
如果 <dashed-ident> 命名了一个不存在的颜色空间 (一个与颜色配置文件的名称不匹配的名称, 或者匹配但相应的配置文件尚未加载, 或者不表示有效的配置文件), 则此参数表示一个无效颜色。
-
一个或多个<number> 或 <percentage>,提供颜色空间所需的参数值。
对于自定义颜色空间, 指定的组件值 小于 0 或 0%,或大于 1 或 100% 并非无效; 它们在计算值时被限制在有效范围内。 这是因为 ICC 配置文件通常不接受 超出范围的输入值。
对于自定义颜色空间,如果提供的<number> 或 <percentage>数量多于颜色空间所需的参数数量, 末尾多余的<number>将被忽略。 该颜色仍然是有效颜色。
对于自定义颜色空间,如果提供的<number> 或 <percentage>数量多于可选组件描述符中列出的组件数量, 末尾的附加值仍然有效, 但不能在相对颜色语法中使用。 该颜色仍然是有效颜色。
对于自定义颜色空间,如果提供的<number> 或 <percentage>数量少于颜色空间所需的参数数量, 缺失的参数默认为 0。 (这对于多组分打印机尤其方便, 因为附加的油墨是专色或清漆, 页面上的大多数颜色不会使用它们。) 该颜色仍然是有效颜色。
对于预定义颜色空间, 指定的组件值 小于 0 或 0%,或大于 1 或 100% 并非无效; 这些超出色域的颜色 在计算值时会使用相对色度意图进行色域映射到有效范围。
-
一个可选的、用斜杠分隔的 <alpha-value>。如果省略,则默认为 100%。
--base : color ( display-p30.7 0.5 0.1 ); --dark : color ( fromvar ( --base) xyz-d65calc ( x/2 ) calc ( y/2 ) calc ( z/2 ));
原始颜色是color(xyz-d65 0.281 0.253 0.044),因此相对颜色是color(xyz-d65 0.14 0.126 0.022)。
5.2. 自定义颜色空间
CSS允许通过引用颜色配置文件来指定颜色。 例如,这可以用于校准的CMYK打印机、 或RGB颜色空间, 或任何已进行过特征化的彩色或单色输出设备。
color : color ( --swopc0.0134 0.8078 0.7451 0.3019 ); color : color ( --indigo0.0941 0.6274 0.3372 0.1647 0 0.0706 0.1216 ); color : color ( prophoto-rgb0.9137 0.5882 0.4784 ); color : color ( display-p30.3804 0.9921 0.1412 );
未使用预定义颜色空间的颜色 CSS Color 4 § 10. 预定义颜色空间,通过使用 <dashed-ident>来区分,并且还需要在样式表中某处提供一个匹配的 @color-profile规则, 以将名称与配置文件数据相关联。
@color-profile --swopc{ src : url ( 'http://example.org/swop-coated.icc' );} @color-profile --indigo{ src : url ( 'http://example.org/indigo-seven.icc' );}
5.3. 指定颜色配置文件: @color-profile at-rule
@color-profile规则定义并命名了一个颜色配置文件, 该配置文件可在稍后用于color()函数中指定颜色。
定义如下:
@color-profile = @color-profile [<dashed-ident> | device-cmyk] { <declaration-list> }
<dashed-ident>提供了颜色配置文件的名称, 该名称将在CSS样式表中使用。 另一种情况是device-cmyk关键字, 这意味着如果此颜色配置文件有效, 将用于解析在device-cmyk中指定的颜色。
@color-profile规则接受本规范中定义的描述符。
名称: | src |
---|---|
用于: | @color-profile |
值: | <url> |
初始值: | n/a |
src描述符指定用于检索颜色配置文件信息的URL。
检索到的ICC配置文件在以下情况下有效:
-
它可以被解析为ICC配置文件
-
它是输入、显示、输出或颜色空间ICC配置文件。(禁止使用抽象、设备链接和命名颜色ICC配置文件)。
如果配置文件无效,所有引用该配置文件的CSS颜色都是无效颜色。
为了获取外部颜色配置文件, 给定@color-profile规则rule, 使用rule的URL 获取样式资源, 样式表为rule的父CSS样式表, 目标为"color-profile", CORS模式为"cors", processResponse的步骤如下,给定响应|/res| 和null、失败或字节流byteStream: 如果byteStream是字节流, 将颜色配置文件应用于解析后的|byteStream。
注意: ICC配置文件的互联网媒体类型 ("MIME类型") 是application/vnd.iccprofile。
名称: | rendering-intent |
---|---|
用于: | @color-profile |
值: | 相对色度 | 绝对色度 | 可感知 | 饱和度 |
初始值: | relative-colorimetric |
颜色配置文件包含 “渲染意图”, 定义了如何色域映射它们的颜色到比其定义的范围更小的色域。 通常配置文件只包含一个意图, 但当有多个时, rendering-intent描述符选择使用其中之一。
四种可能的渲染意图是[ICC]:
- 相对色度
- 媒体相对色度渲染意图要求保留源颜色相对于各自媒体白点的不变性。
落在目标介质色域外的源颜色将被映射到色域边界上的颜色,采用多种不同的方法。
媒体相对色度渲染意图通常与黑点补偿一起使用, 其中源介质的黑点被映射到目标介质的黑点。 此方法必须将源白点映射到目标白点。 如果使用了黑点补偿,则源黑点也必须映射到目标黑点。 颜色的相对关系应在源色域和目标色域内部保持不变, 而目标色域之外的颜色可能会发生变化。
- absolute-colorimetric
-
ICC-绝对比色法要求保留落在目标介质色域内的源颜色相对于采用的白色(完美的反射漫射体)不变。对于超出目标介质色域的源颜色,使用多种不同的方法将其映射到色域边界上的颜色。此方法可以最精确地匹配色域内的颜色,但如果目标介质的白点低于源介质的白点,则会导致高光剪切。因此,建议仅在需要精确颜色匹配且高光剪切不是问题的应用程序中使用此方法。
此方法在转换颜色时必须禁用白点匹配和黑点匹配。一般来说,除了测试目的外,不推荐使用此选项。
- perceptual
-
这种方法通常是图像的首选,尤其是在源和目标之间存在较大差异时(例如将屏幕显示的图像再现为反射打印件)。它采用专有方法对源图像的颜色进行重新优化,以适应目标介质。这种重新优化可能会导致源色域和目标色域内的颜色发生变化,尽管感知变换应该在复制过程中保持原作的基本艺术意图。它不会尝试纠正源图像中的错误。
注意:使用v2 ICC配置文件时,没有指定的感知参考介质,这可能会导致互操作性问题。当使用v2 ICC配置文件时,除非已经检查过特定的源和目标配置文件并确保它们的组合能产生预期效果,否则更安全的方法是使用带有黑点补偿的媒体相对比色渲染意图,而不是感知渲染意图。
该方法应保持像素之间的相对颜色值,因为它们被映射到目标设备的色域中。为了避免色相偏移和不连续性,并尽可能保留场景的整体外观,该方法可能会更改最初位于目标设备色域内的像素值。
- 饱和度
- 此选项是为保持原始图像的相对饱和度(色度)以及保持纯色而创建的。然而,类似感知意图,它也经历了互操作性问题,并且由于纯色保留不适合使用参考介质解决方案,因此使用v4配置文件也无法解决问题。除非已经检查了特定的源和目标配置文件,并确保它们的组合能产生预期效果,否则不推荐使用此渲染意图。 此选项应保持原始像素的相对饱和度(色度)值。超出色域的颜色应转换为具有相同饱和度但落在色域内的颜色。
名称: | components |
---|---|
适用对象: | @color-profile |
值: | <ident># |
初始值: | n/a |
颜色配置文件可以定义包含多个组件的颜色空间。 例如,一个青色、品红、黄色和黑色(CMYK)的配置文件有四个组件,分别命名为c, m, y 和 k。 而一个四组件加法屏幕配置文件可能使用四个组件,命名为r, g, y 和 b。
该描述符的值是一个用逗号分隔的<ident>标记的列表。 每个<ident>命名一个组件, 按照它们在颜色配置文件中使用的顺序排列,而标记的总数定义了组件的数量。
components: cyan, magenta, yellow, black
而这个描述符选择了更简洁的名称:
components: c,m,y,k
components: cyan, magenta, yellow, black, orange, green, violet
如果一个组件与 none(ASCII 不区分大小写)匹配, 则该描述符无效, 因为它会与缺失值的标记冲突。
如果为组件选择的名称与CSS Values 4 § 10.7.1 数值常量: e, pi中定义的CSS数值常量冲突, 该组件仍然有效, 但在calc()中使用时,该组件将被数值常量覆盖,导致意外结果。
@color-profile --unwise { src: url(https://example.com/unwise); components: mi, pi, ni; } --base: color(--unwise 35% 20% 8%); --accent: color(from var(--base) mi calc(pi * 2) calc(ni / 2));
在这里,--accent 的组件值为35%, 3.14159265358979 * 2 = 6.28318530717959, 4%。
5.4. CSS和打印: 使用校准的CMYK和其他印刷颜色空间
@color-profile at-rule不仅限于RGB颜色空间。 虽然屏幕通常直接以RGB显示颜色, 但打印机通常使用CMYK表示颜色。
校准的四色打印使用青色、洋红、黄色和黑色(CMYK), 或者使用更多墨水的高保真宽色域打印 如青色洋红黄色黑色橙色绿色紫色(CMYKOGV) 也可以在CSS中进行, 前提是你有一个与墨水、纸张、总墨覆盖率和设备 相对应的ICC配置文件。
@color-profile --fogra39{ src : url ( 'https://example.org/Coated_Fogra39L_VIGC_300.icc' ); } .header{ background-color : color ( --fogra390 % 70 % 20 % 0 % ); }
在这里,color()
函数首先声明了我们给配置文件起的名字,
然后给出青色、洋红色、黄色和黑色的百分比。
在这个配置文件中,这解析为颜色 lab(63.673303% 51.576902 5.811058) 即 rgb(93.124%, 44.098%, 57.491%)。
由于已知特定CMYK组合的实际颜色, 可以进行打印输出的屏幕可视化(软校色)。
此外,依赖于已知颜色的程序 (例如抗锯齿、合成、使用颜色创建渐变等) 可以正常进行。
色彩检测卡,用于确保印刷和摄影行业的色彩保真度。 每个色块都有平均测量的 Lab 值。 矩形显示的是转换为 sRGB 的 Lab 值。 几乎看不见的圆形显示的是 Lab 值, 这些值通过 FOGRA51 [FOGRA51] ICC 配置文件转换为 CMYK。 然后,CMYK 值通过相同的 ICC 配置文件反向转换, 以产生新的 Lab 值。然后将这些值转换为 sRGB 以进行显示。
第三行第一个色块的圆圈更明显, 因为该颜色稍微超出了所使用的FOGRA51 CMYK色域。
下表显示了每个色块在通过CMYK循环后 原始Lab值和Lab值之间的DeltaE 2000。 DeltaE 2000为1或更大时就能被肉眼察觉。
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | 0.06 | 0.07 | 0.03 | 0.04 | 0.06 | 0.17 |
2 | 0.03 | 0.75 | 0.05 | 0.06 | 0.03 | 0.02 |
3 | 1.9 | 0.04 | 0.06 | 0.05 | 0.02 | 0.05 |
4 | 0.03 | 0.08 | 0.03 | 0.03 | 0.04 | 0.80 |
@color-profile --swop5c{ src : url ( 'https://example.org/SWOP2006_Coated5v2.icc' ); } .header{ background-color : color ( --swop5c0 % 70 % 20 % 0 % ); }
在这个配置文件中,给定的CMYK百分比 (与上一个例子相同) 解析为颜色 lab(64.965217% 52.119710 5.406966) 即 rgb(94.903%, 45.248%, 59.104%)。
可以指定备用颜色, 例如使用媒体查询, 以防指定的CMYK颜色已知超出sRGB色域。
@media ( color-gamut: srgb) { .header{ background-color : rgb ( 8.154 % 60.9704 % 37.184 % ); } } @media print, ( color-gamut: p3){ .header{ background-color : color ( --fogra3990 % 0 % 90 % 0 % ); } }
该CMYK颜色对应于lab(56.596645% -58.995875 28.072154) 或lch(56.596645% 65.33421077211648 154.5533771086801)。 在sRGB中,这将是rgb(-60.568% 62.558% 32.390%),如大负红分量所示, 超出了色域。
减少色度直到结果在色域内 给出 lch(56.596645% 51 154.5533771086801) 这是 rgb(8.154% 60.9704% 37.184%), 这已被手动指定为备用颜色。
对于宽色域屏幕,颜色在display-p3色域内 (即display-p3(0.1658 0.6147 0.3533))。
颜色不限于四种墨水(CMYK)。例如,可以使用宽色域7色墨水集。
- 橙色:CIELAB 65 58 88
- 绿色:CIELAB 60 -75 0
- CIELAB 22 47 -56
测量条件为 M1, 这意味着已考虑纸张中的荧光增白剂, 并且分光光度计没有紫外线截止滤光片。
@color-profile --fogra55beta{ src : url ( 'https://example.org/2020_13.003_FOGRA55beta_CL_Profile.icc' ); } .dark_skin{ background-color : color ( --fogra55beta0.183596 0.464444 0.461729 0.612490 0.156903 0.000000 0.000000 ); } .light_skin{ background-color : color ( --fogra55beta0.070804 0.334971 0.321802 0.215606 0.103107 0.000000 0.000000 ); } .blue_sky{ background-color : color ( --fogra55beta0.572088 0.229346 0.081708 0.282044 0.000000 0.000000 0.168260 ); } .foliage{ background-color : color ( --fogra55beta0.314566 0.145687 0.661941 0.582879 0.000000 0.234362 0.000000 ); } .blue_flower{ background-color : color ( --fogra55beta0.375515 0.259934 0.034849 0.107161 0.000000 0.000000 0.308200 ); } .bluish_green{ background-color : color ( --fogra55beta0.397575 0.010047 0.223682 0.031140 0.000000 0.317066 0.000000 ); }
5.5. 将 CMYK 颜色转换为 Lab
从校准的 CMYK 颜色空间到 Lab 的转换 通常是通过在 ICC 配置文件中查找 Lab 值来完成的。
5.6. 将 Lab 颜色转换为 CMYK
对于打印, Lab 颜色需要转换为打印机的颜色空间。
这通常是通过在 ICC 配置文件中查找 CMYK 值来完成的。
6. 未校准的 CMYK 颜色: device-cmyk() 函数
有时,当某个打印机未进行校准时, 但通过实验或通过打印样本色卡已知某些墨水组合的输出结果时, 以设备相关的方式表示 CMYK 颜色会很有用。
注意: 由于实际结果颜色可能未知, CSS 处理器可能会尝试对其进行近似。 这种近似可能与实际的打印结果在视觉上相差很大。
device-cmyk() 函数允许作者以这种方式指定颜色:
device-cmyk() = <legacy-device-cmyk-syntax> | <modern-device-cmyk-syntax> <legacy-device-cmyk-syntax> = device-cmyk( <number>#{4} ) <modern-device-cmyk-syntax> = device-cmyk( <cmyk-component>{4} [ / [ <alpha-value> | none ] ]? ) <cmyk-component> = <number> | <percentage> | none
device-cmyk() 函数的参数依次指定青色、洋红色、黄色和黑色成分, 其值为0到1之间的数字, 或者在现代语法中,为0%到100%之间的百分比。 这两种用法是等价的,且线性映射。 小于0或0%的值,或大于1或100%的值, 并非无效; 相反,它们将在计算值时被限定为0/0%或1/100%。
在现代语法中,第五个参数指定颜色的 alpha 分量。 它的解释与 rgb() 函数的第四个参数完全相同。 如果省略,则默认为 100%。
由于 历史原因,device-cmyk() 还支持 旧版颜色语法。
通常,基于打印的应用程序实际上会将使用的颜色存储为 CMYK, 并以这种形式将其发送到打印机。 但是,这些颜色没有色度解释, 因此不能用于渐变、合成、混合等。
因此,设备 CMYK 颜色必须转换为等效颜色。 这并不简单,像从 HSL 或 HWB 到 RGB 的转换一样; 精确的转换取决于输出设备的精确特性。
- 如果用户、作者或用户代理样式表 对 device-cmyk 有 @color-profile 定义, 且可以检索到 src 描述符指定的资源, 且资源是有效的 CMYK ICC 配置文件, 且用户代理能够处理 ICC 配置文件, 则 device-cmyk() 函数的计算值 必须是 CMYK 颜色的 Lab 值。
- 否则, device-cmyk() 函数的计算值必须是 CMYK 颜色的 sRGB 值, 按照以下简单的转换算法转换。
color : device-cmyk ( 0 81 % 81 % 30 % ); color : rgb ( 178 34 34 ); color : firebrick;
color : device-cmyk ( 0 81 % 81 % 30 % ); color : lab ( 45.060 % 45.477 35.459 ) color:rgb ( 70.690 % 26.851 % 19.724 % );
简单转换必然是近似的, 因为它不了解墨水的色度、 点增益、 RGB 空间的色度等。
一个色卡,用于确保打印和摄影行业的色彩保真度。 每个色块的平均测量 Lab 值都可用。 矩形显示了 Lab 值,转换为 sRGB。 圆圈显示了 Lab 值,通过 ICC 配置文件转换为 CMYK。 然后,CMYK 值被简单地转换为 sRGB。
下表显示了每个色块的 DeltaE 2000, 即经过 CMYK 往返后原始 Lab 和 Lab 值之间的差异。 DeltaE 2000 大于或等于 1 则可以被肉眼察觉,而大于 5 则完全是不同的颜色。
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | 11.33 | 9.36 | 5.66 | 7.52 | 12.39 | 21.58 |
2 | 6.40 | 8.79 | 11.77 | 17.16 | 11.91 | 3.97 |
3 | 12.1 | 17.00 | 3.38 | 1.94 | 18.08 | 14.97 |
4 | 1.89 | 6.56 | 7.85 | 8.76 | 9.82 | 10.29 |
6.1. 在未校准的 CMYK 和基于 sRGB 的颜色之间进行简单转换
要 简单地从 CMYK 转换为 RGBA:
red
= 1 - min( 1 , cyan* ( 1 - black) + black) green
= 1 - min( 1 , magenta* ( 1 - black) + black) blue
= 1 - min( 1 , yellow* ( 1 - black) + black) - Alpha 与输入颜色相同。
要 简单地从 RGBA 转换为 CMYK:
black
= 1 - max( red, green, blue) cyan
= ( 1 - red- black) / ( 1 - black), 或当 black 为1 时,cyan 为0 magenta
= ( 1 - green- black) / ( 1 - black), 或当 black 为1 时,magenta 为0 yellow
= ( 1 - blue- black) / ( 1 - black), 或当 black 为1 时,yellow 为0 - alpha 与输入颜色相同。
7. 响应使用的颜色方案:light-dark() 函数
系统颜色能够响应当前使用的 color-scheme 值。 light-dark() 函数向作者公开了相同的功能。
light-dark() = light-dark( <color>, <color> )
如果 使用的颜色方案是 light 或未知, 则该函数计算为第一个颜色的计算值; 如果 使用的颜色方案是 dark,则计算为第二个颜色的计算值。
测试
8. 动态指定具有足够对比度的文本颜色:contrast-color() 函数
当动态创建颜色时,将其用作背景色时,指定一个能提供足够对比度的文本颜色通常是一个挑战。 contrast-color() 函数在指定颜色用作纯色背景上的文本颜色时,会自动提供一个保证颜色对比度的颜色。
注意:易读性是一个复杂的问题,足够的颜色对比度只是其中的一部分。 拥有一对具有足够对比度的颜色并不能保证文本一定易读, 因为这还取决于多种因素,例如字体、文本大小、 周围颜色等。
contrast-color() = contrast-color( <color> )
contrast-color() 解析为 white 或 black, 以当输入颜色用作纯色背景时,能为文本产生最大颜色对比度的那个为准。 如果 white 和 black 产生相同的对比度, 则解析为 white。
用于确定输出浅色还是深色的精确颜色对比度算法在此级别由用户代理 (UA) 定义。
注意:此规范的未来版本预计将引入更多对所使用的对比度算法、用例以及返回颜色的控制。
建议用户代理不要简单地使用 WCAG 2.1 第 1.4.3 节 对比度 (最低) 的对比度算法来决定浅色和深色,因为它存在几个已知问题。 但是,此函数返回的颜色仍应满足 WCAG 2.1 第 1.4.3 节 对比度 (最低) 对 AA 大号文本的要求,因为许多作者需要满足强制执行此要求的法律规定。
9. 颜色插值
9.1. 插值的颜色空间
<color-interpolation-method> 已扩展为允许使用 自定义颜色空间:
<color-space> = <rectangular-color-space> | <polar-color-space> | <custom-color-space> <rectangular-color-space> = srgb | srgb-linear | display-p3 | a98-rgb | prophoto-rgb | rec2020 | lab | oklab | xyz | xyz-d50 | xyz-d65 <polar-color-space> = hsl | hwb | lch | oklch <custom-color-space> = <dashed-ident> <hue-interpolation-method> = [ shorter | longer | increasing | decreasing ] hue <color-interpolation-method> = in [ <rectangular-color-space> | <polar-color-space> <hue-interpolation-method>? | <custom-color-space> ]
<dashed-ident> 必须已在有效的 @color-profile 规则中声明, 否则 <color-interpolation-method> 无效。
10. 解析 <color> 值
10.1. 解析 color-mix() 值
如果所有 <color> 参数解析为其各自颜色空间中的对应颜色, 则计算值为混合后的颜色, 在指定的混合颜色空间中, 按照 CSS Color 4 § 14. 解析 <color> 值 的方法解析。 否则(如果 currentColor 在函数中使用), 计算值为 color-mix() 函数, 并且每个 <color> 参数按照 CSS Color 4 § 14. 解析 <color> 值 的方法解析, 以此保持继承到子元素。
测试
10.2. 解析相对颜色语法值
如果所有 <color> 参数解析为其各自颜色空间中的对应颜色, 则计算值为绝对 <color> 值, 在指定的 RCS 颜色空间中, 按照 CSS Color 4 § 14. 解析 <color> 值 的方法解析。
测试
否则(如果 currentColor 在函数中使用), 计算值为相对颜色语法函数, 其源 <color> 参数根据 CSS Color 4 § 14. 解析 <color> 值 的方法解析, 以此保持继承到子元素。
测试
- relative-currentcolor-a98rgb-01.html (在线测试) (源代码)
- relative-currentcolor-lch-01.html (在线测试) (源代码)
- relative-currentcolor-rgb-01.html (在线测试) (源代码)
- relative-currentcolor-displayp3-01.html (在线测试) (源代码)
- relative-currentcolor-oklab-01.html (在线测试) (源代码)
- relative-currentcolor-rgb-02.html (在线测试) (源代码)
- relative-currentcolor-hsl-01.html (在线测试) (源代码)
- relative-currentcolor-oklch-01.html (在线测试) (源代码)
- relative-currentcolor-xyzd50-01.html (在线测试) (源代码)
- relative-currentcolor-hsl-02.html (在线测试) (源代码)
- relative-currentcolor-prophoto-01.html (在线测试) (源代码)
- relative-currentcolor-xyzd65-01.html (在线测试) (源代码)
- relative-currentcolor-hwb-01.html (在线测试) (源代码)
- relative-currentcolor-rec2020-01.html (在线测试) (源代码)
- relative-currentcolor-lab-01.html (在线测试) (源代码)
- relative-currentcolor-rec2020-02.html (在线测试) (源代码)
10.3. 解析 device-cmyk 值
计算值和使用值 是指定的设备特定 CMYK 颜色, (其分量为 <number>,而不是 <percentage>) 与指定的 alpha 分量配对 (作为 <number>,而不是 <percentage>; 如果未指定,则默认为不透明)。
实际值 可能根据操作而有所不同; 对于支持 CMYK 的设备,可以呈现为 CMYK 颜色; 对于与非 CMYK 颜色的混合或在非 CMYK 设备上渲染时, 必须按 § 6 未校准的 CMYK 颜色:device-cmyk() 函数 中的规定进行转换。
device-cmyk ( 0 % 70 % 20 % 0 % )
具有指定值和实际值
device-cmyk ( 0 0.7 0.2 0 )
如果实现支持 ICC 配置文件并安装了合适的配置文件, 则使用的值将是
lab ( 63.673 % 51.577 5.811 )
注意:与所有颜色一样,使用值不可通过脚本获取。
11. 序列化
本节扩展了 CSS Color 4 § 15. 序列化 <color> 值,添加了 color-mix()、 device-cmyk(), 和相对颜色函数的序列化结果。
在本节中,规范中使用的字符串及其对应字符如下。
字符串 | 字符 |
---|---|
" " | U+0020 空格 |
"," | U+002C 逗号 |
"-" | U+002D 连字符-减号 |
"." | U+002E 句号 |
"/" | U+002F 斜杠 |
字符串“.”应作为小数点分隔符使用, 无论地区如何,并且不应使用千位分隔符。
通常情况下, 如果结果的 alpha 值正好为 1, 它将在序列化时省略; 默认隐含值为 1(完全不透明)。
11.1. 序列化 color-mix()
color-mix() 函数声明值的序列化是字符串 "color-mix(in ", 后跟指定的<color-space>(全小写), 后跟 ", ", 后跟第一个指定的颜色, 后跟一个空格, 后跟第一个百分比的序列化(见下文), 后跟 ", ", 后跟第二个指定的颜色, 后跟第二个百分比的序列化(见下文), 后跟 ")"。
color-mix() 函数声明值的第一个百分比的序列化定义如下:
-
如果第一个百分比 p1 和第二个百分比 p2 都已指定:
-
如果 p1 等于 50% 且 p2 等于 50%,则不序列化任何内容。
-
否则,p1 按原样序列化。
-
-
否则,如果仅指定了第一个百分比 p1:
-
如果 p1 等于 50%,则不序列化任何内容。
-
否则,p1 按原样序列化。
-
-
否则,如果仅指定了第二个百分比 p2:
-
如果 p2 等于 50%,则不序列化任何内容。
-
如果 p2 不是 calc(),则序列化 100% - p2 的值。
-
否则,不序列化任何内容。
-
-
否则,如果两者均未指定:
-
不序列化任何内容。
-
color-mix() 函数声明值的第二个百分比的序列化定义如下:
-
如果第一个百分比 p1 和第二个百分比 p2 都已指定:
-
如果 p1 和 p2 都不是 calc(),并且 p1 + p2 等于 100%,则不序列化任何内容。
-
否则,p2 按原样序列化。
-
-
否则,如果仅指定了第一个百分比 p1:
-
不序列化任何内容。
-
-
否则,如果仅指定了第二个百分比 p2:
-
如果 p2 等于 50%,则不序列化任何内容。
-
如果 p2 不是 calc(),则不序列化任何内容。
-
否则,p2 按原样序列化。
-
-
否则,如果两者均未指定:
-
不序列化任何内容。
-
注意:calc() 值 被认为是未知的, 因此永远不会等于 50%, 也永远不会与其他值相加等于 100%。
color-mix(in oklab, teal, peru 40%)
将是字符串 "color-mix(in oklab, teal 60%, peru)"。
声明值的序列化
color-mix(in oklab, teal 50%, peru 50%)
将是字符串 "color-mix(in oklab, teal, peru)"。
声明值的序列化
color-mix(in oklab, teal 70%, peru 70%)
将是字符串 "color-mix(in oklab, teal 70%, peru 70%)"。 因为这些在百分比归一化后才发现归一化为 50%。
color-mix() 函数结果的序列化 取决于混合中是否使用了关键字 currentColor。 如果是,则结果序列化为声明值。 这允许在 color 属性具有不同值的子元素上使用正确的混合。 否则,它是一个 <color>, 如 CSS 颜色 4 § 15. 序列化 <color> 值 中所定义。 使用的形式取决于用 "in" 指定的颜色空间:
混合颜色空间 | 形式 |
---|---|
srgb | color(srgb r g b) |
srgb-linear | color(srgb-linear r g b) |
display-p3 | color(display-p3 r g b) |
a98-rgb | color(a98-rgb r g b) |
prophoto-rgb | color(prophoto-rgb r g b) |
rec2020 | color(rec2020 r g b) |
hsl | color(srgb r g b) |
hwb | color(srgb r g b) |
xyz-d65 | color(xyz-d65 x y z) |
xyz-d50 | color(xyz-d50 x y z) |
xyz | color(xyz-d65 x y z) ¹ |
lab | lab(l a b) |
lch | lch(l c h) |
oklab | oklab(l a b) |
oklch | oklch(l c h) |
- ¹
- 因为 xyz 只是 xyz-d65 的别名
测试
对回传的最小精度与 CSS Color 4 § 15. 序列化 <color> 值 中指定的精度相同。
color-mix(in lch, peru 40%, palegoldenrod)
序列化为字符串 "lch(79.7256 40.448 84.771)", 而颜色混合的结果
color-mix(in srgb, peru 40%, palegoldenrod)
序列化为字符串 "color(srgb 0.8816 0.7545 0.4988)"。
11.2. 序列化原始颜色
在另一个颜色函数内部用作原始颜色的声明值的颜色,作为声明值组件的序列化方式如下:
-
标识规范颜色函数的字符串, 对于 rgb() 和 rgba() 是 "rgb", 对于 hsl() 和 hsla() 是 "hsl", 全部小写, 后跟 "(", 后跟一个以空格分隔的、按指定方式排列的非 alpha 组件列表 (数字序列化为数字, 百分比序列化为百分比, 角度序列化为规范化的度数角, calc() 序列化为其简化形式), 不应用任何限制, 如果存在 alpha 组件,则后跟 " / " 和按指定方式排列的 alpha 组件 (使用与颜色组件相同的规则), 后跟 ")"。
注意:无论使用现代语法还是旧式语法,都使用相同的序列化方式。
-
标识颜色函数的字符串(全部小写), 后跟 "(", 后跟一个以空格分隔的、按指定方式排列的非 alpha 组件列表 (数字序列化为数字, 百分比序列化为百分比, 角度序列化为规范化的度数角, calc() 序列化为其简化形式),不应用任何限制, 如果存在 alpha 组件,则后跟 " / " 和按指定方式排列的 alpha 组件 (使用与颜色组件相同的规则), 后跟 ")"。
-
对于 color()
-
字符串 "color(", 后跟规范的颜色空间 (对于 "xyz" 是 "xyz-d65"),全部小写, 后跟一个空格, 后跟一个以空格分隔的、按指定方式排列的非 alpha 组件列表 (数字序列化为数字, 百分比序列化为百分比, 角度序列化为规范化的度数角, calc() 序列化为其简化形式), 不应用任何限制, 如果存在 alpha 组件,则后跟 " / " 和按指定方式排列的 alpha 组件 (使用与颜色组件相同的规则), 后跟 ")"。
11.3. 序列化相对颜色函数
相对颜色的声明值的序列化方式如下:
-
标识规范颜色函数的字符串, 对于 rgb() 和 rgba() 是 "rgb", 对于 hsl() 和 hsla() 是 "hsl", 全部小写, 后跟 "(from ", 后跟使用序列化嵌套原始颜色规则的原始颜色的序列化, 后跟一个空格, 后跟一个以空格分隔的、按指定方式排列的非 alpha 通道参数列表 (标识符序列化为标识符, 数字序列化为数字, 百分比序列化为百分比, 角度序列化为规范化的度数角, calc() 序列化为其简化形式), 如果存在 alpha 组件,则后跟 " / " 和按指定方式排列的 alpha 组件 (使用与颜色通道参数相同的规则), 后跟 ")"。
-
标识颜色函数的字符串(全部小写), 后跟 "(from ", 后跟使用序列化嵌套原始颜色规则的原始颜色的序列化, 后跟一个空格, 后跟一个以空格分隔的、按指定方式排列的非 alpha 通道参数列表 (标识符序列化为标识符, 数字序列化为数字, 百分比序列化为百分比, 角度序列化为规范化的度数角, calc() 序列化为其简化形式), 如果存在 alpha 组件,则后跟 " / " 和按指定方式排列的 alpha 组件 (使用与颜色通道参数相同的规则), 后跟 ")"。
-
对于 color()
-
字符串 "color(from ", 后跟使用序列化嵌套原始颜色规则的原始颜色的序列化, 后跟一个空格, 后跟规范的颜色空间(对于 "xyz" 是 "xyz-d65"), 全部小写, 后跟一个空格, 后跟一个以空格分隔的、按指定方式排列的非 alpha 通道参数列表 (标识符序列化为标识符, 数字序列化为数字, 百分比序列化为百分比, 角度序列化为规范化的度数角, calc() 序列化为其简化形式), 如果存在 alpha 组件,则后跟 " / " 和按指定方式排列的 alpha 组件 (使用与颜色通道参数相同的规则), 后跟 ")"。
rgb ( from redcalc ( r /2 ) gcalc ( 30 % ));
的序列化是字符串 "rgb(from red calc(0.5 * r) g calc(30%))", 而计算值的序列化 是字符串 "color(srgb 0.5 0 0.3)"。
hsl ( fromhsl ( none10 % 50 % ) h s l);
的序列化是字符串 "hsl(from hsl(none 10% 50%) h s l)", 而计算值的序列化 是字符串 "color(srgb 0.55 0.45 0.45)"。
hsl ( fromhsl ( 127.9 302 % 25.33 % ) h s l);
的序列化是字符串 "hsl(from hsl(127.9 302% 25.33%) h s l)", 而计算值的序列化 是字符串 "color(srgb -0.511666 1.018266 -0.310225)"。
< div id = "example" style = "background-color: rgb(from currentcolor r g calc(b / 2)); color: blue;" > </ div >
background-color 的声明值的序列化是字符串 "rgb(from currentcolor r g calc(b / 2))", 而计算值的序列化 是字符串 "color(srgb 0 0 0.5)"
相对颜色函数结果的序列化 取决于关键字 currentColor 是否是原始颜色。 如果是,则结果序列化为声明值。 这允许在 color 属性具有不同值的子元素上使用正确的值。 否则,它 是解析值, 它是一个 <color>, 如 CSS 颜色 4 § 15. 序列化 <color> 值 中所定义。
使用的形式 取决于相对颜色的颜色空间:
混合颜色空间 | 形式 |
---|---|
srgb | color(srgb r g b) |
srgb-linear | color(srgb-linear r g b) |
display-p3 | color(display-p3 r g b) |
a98-rgb | color(a98-rgb r g b) |
prophoto-rgb | color(prophoto-rgb r g b) |
rec2020 | color(rec2020 r g b) |
hsl | color(srgb r g b) |
hwb | color(srgb r g b) |
xyz-d65 | color(xyz-d65 x y z) |
xyz-d50 | color(xyz-d50 x y z) |
xyz | color(xyz-d65 x y z) |
lab | lab(l a b) |
lch | lch(l c h) |
oklab | oklab(l a b) |
oklch | oklch(l c h) |
测试
往返的最低精度 与 CSS 颜色 4 § 15.5 序列化 color() 函数的值 中指定的精度相同。
lch ( from perucalc ( l *0.8 ) calc ( c *0.7 ) calc ( h +180 ))
的结果是字符串 "lch(49.80224 37.80819 243.6803)"
11.4. 序列化自定义颜色空间
color() 组件值的保留精度, 因此序列化值中保留的有效数字位数, 在本规范中未定义, 但对于 CMYK 颜色空间,必须至少足以进行八位精度的值回传; 这将导致至少保留两位小数, 除非已省略了末尾的零。
以下颜色的序列化值是
@color-profile --swop5c{ src : url ( 'https://example.org/SWOP2006_Coated5v2.icc' ); } .header{ background-color : color ( --swop5c0 % 70.0 % 20.00 % .0 % ); }
字符串 "color(--swop5c 0 0.7 0.2 0)"
11.5. 序列化 device-cmyk 值
device-cmyk() 值的序列化形式 来源于计算值,并使用 device-cmyk() 形式, 函数名为小写字母。
组件值以十进制序列化, 作为 <number>。 单个 ASCII 空格字符 " " 必须用作组件值之间的分隔符。
任何组件值中的尾随小数零必须被省略; 如果小数部分全部为零, 小数点也必须被省略。
device-cmyk() 组件值的保留精度, 因此序列化值中的有效数字位数, 在本规范中未定义, 但至少应足以进行八位精度的值回传; 这将导致至少两位小数, 除非尾随零已被省略。 值必须向上舍入,而不是截断。
单位 alpha 值不显式序列化。 非单位 alpha 值必须显式序列化, 且字符串 " / " (一个 ASCII 空格,后跟斜杠,再跟另一个空格) 必须用于分隔黑色 ("k") 颜色组件值 与 alpha 值。
12. API 接口
12.1.
CSSColorProfileRule
接口
CSSColorProfileRule 接口表示 @color-profile 规则。
[Exposed =Window ]interface :
CSSColorProfileRule CSSRule {readonly attribute CSSOMString name ;readonly attribute CSSOMString src ;readonly attribute CSSOMString renderingIntent ;readonly attribute CSSOMString components ; };
name
, 类型为 CSSOMString,只读- name 属性获取时必须返回
一个包含关联规则中定义的 颜色
配置文件 的 name 序列化的
CSSOMString
对象。 src
, 类型为 CSSOMString,只读renderingIntent
, 类型为 CSSOMString,只读components
, 类型为 CSSOMString,只读- 其余的属性在获取时必须返回包含
与关联规则关联的描述符的序列化
CSSOMString
对象。 如果未在关联规则中指定描述符, 则该属性必须返回一个空字符串。
13. 默认样式规则
以下样式表是说明性的,而非规范性的。此样式表可由实现作为其默认 HTML 系列文档样式的一部分。
/* 传统桌面用户代理的超链接颜色 */ :link{ color : LinkText; } :visited{ color : VisitedText; } :active{ color : ActiveText; } /* device-cmyk 的合理、保守的默认值 */ @color-profile device-cmyk{ src : url ( 'https://drafts.csswg.org/css-color-4/ICCprofiles/Coated_Fogra39L_VIGC_300.icc' ); }
14. 安全性考量
本规范为 CSS 增加了按需下载 ICC 配置文件的功能。 这些文件不包含可执行代码,因此不会构成增加的安全风险。
15. 隐私考量
本规范未报告任何新的隐私考量。
16. 无障碍注意事项
本规范添加了一种方法,以确保背景为用户指定颜色(包括动态颜色)的文本具有足够的对比度。
17. 变更记录
17.1. 自 2024 年 2 月 29 日工作草案以来的变更
- 阐明了组件关键字可以返回 none 以及数字
- 添加了嵌套颜色函数序列化的示例
- 根据工作组决议,定义了带有 calc 的 color-mix() 的边缘情况
- 根据工作组决议,删除了 color-mix() 的“如果总和为零则无效”的措辞
- 统一使用“颜色分量”而不是“颜色通道”(两者都曾使用)
- 根据工作组决议,简化了 contrast-color()
- 统一链接到术语“预乘”
- 不区分大小写地验证颜色配置文件组件
- 将 contrast-color() 添加到颜色类型定义中
- 添加了无障碍注意事项部分
- 添加了对 FOGRA39、51 和 55 的引用
- 删除了关于 <hue-interpolation-method> 对于矩形颜色空间是错误条件的提法,因为语法不允许这样做
- 阐明了相对颜色组件关键字与哪个颜色空间相关
- 将相对颜色的概念方面与语法细节分开
- 确保 deltaE 表中文字的足够对比度
- 阐明了相对颜色分量不被限制,而相对 alpha 则被限制
17.2. 自 2022 年 6 月 28 日工作草案以来的变更
- 根据声明值而不是指定值描述了 CSSOM 序列化
- 添加了 contrast-color() 函数
- 对于 color-mix(),明确链接到 CSS 颜色 4 中关于插值的部分
- 删除了一个遗留的关于色域映射到 HSL 的提法
- 用散文形式定义了绝对颜色,而不是作为语法的一部分
- 针对每种情况,明确重复了 RCS 中百分比到数字转换的参考范围
- 更好地定义了原始颜色为 currentColor 的相对颜色的序列化。sRGB、hsl() 和 hwb() 使用 color(srgb ...) 进行序列化以实现往返。
- 更新了摘要以提及 light-dark() 函数
- 从 CSS 颜色 4 移植了更长的矩形颜色空间列表
- 更正了自定义参数的语法(空格分隔,而不是逗号分隔)
- 更正了 device-cmyk() 的语法,该语法缺少 none,以及来自 CSS GCPM 的先前(旧版)语法
- color-mix() 在颜色类型的语法中缺失
- 阐明了指定 RCS 值的序列化
- 添加了 light-dark() 函数
- 更正了 color-mix 百分比归一化算法以包含显式的 50% 边缘情况
- 更新了 HSL 示例,该示例在 sRGB 到 HSL 转换步骤之前仍使用色域映射
- 修复了一些示例中的语法高亮显示
- 阐明了 RCS 原始颜色可以包含可选的 alpha
- 修复了无幂分量的错误使用
- 对百分比到数字的转换使用了参考范围
- 根据 CSSWG 决议,将 hsl() 和 hwb() 组件值设为数字。 还将所有色相角度组件值设为数字(以度为单位)。 RCS 简介中已经说明了这一点,但更改尚未完全传播。
- 添加了 CIE XYZ D65 颜色空间中的 RCS 示例
- 删除了 CSS 颜色 4 中一个不必要且未更改的部分副本,该副本令人困惑
- 将章节标题更正为“指定预定义和自定义颜色空间:color() 函数”
- 定义了 HWB 现在允许数字,以前它只允许百分比
- 阐明了如果在不寻常的位置使用 RCS 组件,则没有“魔术缩放”;如果需要,请使用 calc()。添加了示例。
- 阐明了正在使用 CIE 亮度和 Oklab 亮度中的哪一个
- 阐明了如果使用 currentColor,则 color-mix() 函数结果的序列化。添加了此示例。
- 修复了一些 color-mix 示例中的拼写错误
- 修复了一个示例,该示例对无幂分量使用了 0 而不是 none
- 定义了 color-mix 指定值的序列化,并阐明了它使用指定的而不是归一化的百分比进行序列化
- 删除了未更改的 alpha 值定义,改为链接到颜色 4
- 对现代和旧版 rgb、rgba、hsl 和 hsla 使用了单独的语法产生式
- 阐明了原始颜色不受限制,可以使用现代或旧版语法
- 添加了一个新的颜色产生式,阐明了 RCS 可以嵌套
- 阐明了百分比和数字可以自由混合用于 RGB、HSL;不再局限于 RCS
- 阐明了 RCS 仅适用于现代颜色语法
- 定义了所需的颜色空间转换,阐明了可以跳过不必要的转换
- 添加了正确和错误的渐变渲染图像
- 阐明了自定义颜色空间中未命名的组件仍然有效
- 改进了一些示例以使其更清晰
- 定义了缺少组件的 RCS
- 向颜色插值方法添加了 dashed-ident,现在可以在自定义颜色空间中进行插值
- 阐明了 RCS 中的色相分量解析为一个数字(以度为单位)
- 指定了原始颜色为 currentColor 的已解析 RCS
- 通道关键字只能有一种类型
- 更正了旧版语法上 RCS 的无效示例,以实际使用旧版语法
- 在示例中使用了统一的序列化
- 注意到存在 device-cmyk() 的已定义序列化
- 添加了 CSSColorProfileRule 接口
- Oklab 和 OKLCh 的大小写保持一致
- 颜色样本的无障碍性改进
- 图表的无障碍性改进
- 修复了一些颜色样本的不必要裁剪
- 改进了一些图形的替代文本
- 添加了一些缺失的颜色样本
- 为 MacBeth 图像和 deltaE 表添加了行和列标签
- 色相旋转图上更好的标签
- 图表上颜色的更好描述,改进无障碍性
- 确保所有图表和图形都有 ID 和自链接
17.3. 自 2022 年 4 月 28 日工作草案以来的变更
- 修复了 rgb() 定义中的一个拼写错误
- 编辑改进(大写、拼写、清晰度)
- 导出了供其他规范使用的定义
- 在 color() 的语法中为 alpha 添加了缺失的 none
- 将 color-contrast() 函数移至第 6 级
17.4. 自 2021 年 12 月 15 日工作草案以来的变更
- color() 中过多/过少参数的宽容处理仅限于自定义颜色空间
- 更改了 RCS 以允许在任何地方使用数字或百分比
- 清楚地描述了组件名称与 PI 等命名常量之间潜在的冲突
- 阐明了相对颜色语法不使用旧版(逗号分隔)语法
- 更正了 rgb() 函数的语法,none 未被列为 alpha 的选项
- 更改了使用 hsl 或 hwb 的 color-mix() 的序列化,以最大化精度
- 添加了一个超出色域的 color-mix 示例
- 使用术语“无法表达颜色”来描述无法表示扩展的、超出色域颜色的 HSL 和 HWB 模型。
- 修复了一些拼写错误
17.5. 自 2021 年 6 月 1 日工作草案以来的变更
- 在矩形空间中使用 <hue-interpolation-method> 是一个错误
- 将旧的 <hue-adjuster> 更改为新的 <hue-interpolation-method>
- 根据 CSSWG 决议,将 @color-profile 和 device-cmyk 移至第 5 级
- 排除了 none 作为组件名称
- 添加了 OKLCh 相对颜色语法示例
- 定义了插值颜色空间
- 根据 fetch 定义了加载颜色配置文件
- 阐明了对比度是相对于 D65 适应的 CIE XYZ 计算的
- 向 color-mix() 的序列化添加了 oklab() 和 oklch()
- 添加了 oklab() 和 oklch() 相对颜色语法
- 添加了 lch 与 oklch 混合示例
- 优先使用 oklab 和 oklch 进行混合
- 遵循 CSS 颜色 4,将 xyz 更改为 D65 相对值
- 添加了 oklab 和 oklch 颜色空间
- 定义了如何解析 color-contrast()
- 阐明了序列化形式的最小精度
- 阐明了指的是 CIE LCH
- 添加了一些更多示例
- 删除了 color-adjust(),保留了相对颜色语法
- 定义了 color-mix、color-contrast 和相对颜色语法结果的序列化
17.6. 自 2020 年 6 月 10 日首次公开发布工作草案 (FPWD)以来的变更
- 为 color() 函数添加了相对颜色语法
- 阐明了颜色调整器不是可选的
- 阐明了 color-mix 中的百分比是强制性的
- 将色相调整器移回其所属的 color-mix
- 添加了具有不同混合颜色空间的示例
- 添加了 color-mix() 中百分比归一化的示例
- 明确排除了 color-mix() 中的负百分比
- color-mix() 中百分比总和小于 100% 会产生小于 100% 的 alpha 透明度
- 统一使用术语 color space 而不是 colorspace, 定义了 <color-space> 标记
- 更正了 color-contrast 语法
- 向 color-contrast() 添加了可选的目标对比度
- 更正了调整器语法
- 注意到需要处理百分比总和为零的极端情况
- 阐明了 color-mix() 中的运算顺序
- 更新了示例以匹配当前语法
- 定义了百分比如何归一化
- 阐明了 color-mix() 中 0% 和 100% 的含义
- 调整器的定义从 color-mix() 移至 color-adjust()
- 允许 color-mix() 的参数以任何顺序排列
- color-mix() 的强制颜色空间
- 允许 color-mix() 中的百分比出现在颜色之前
- 为 color-mix() 添加了显式算法
- 从 color-mix() 中删除了调整器并简化了语法
- 添加了 "in" 关键字以指定用于混合的颜色空间
- 要求 color-contrast() 列表至少包含两项
- 改进了相对颜色语法的解释
- 链接到 CSS 4 中颜色序列化的定义
- 为颜色空间添加了单独的部分
- 更新了 color-adjust 示例
- 添加了解释性图表
- 处理未解析的百分比
- 将参数归一化为 color-mix
- 允许调整器使用百分比
- 链接修复
- 更新了 color-mix 语法,允许调整器,添加了 alpha 调整器
- 更正了一些示例
- 更新了安全和隐私部分
- 向 color-contrast 添加了 vs 关键字
- 向语法添加了 xyz 调整器
- 添加了色相调整器关键字
- 为混合添加了 XYZ 颜色空间
- 定义了颜色调整器和颜色空间
- 允许混合百分比默认为 50%
- 添加了工作示例和图表
- 更正了轻微的拼写、语法和格式问题
- 添加了关于解析 color-contrast() 值的部分
17.7. 与 CSS 颜色 4 的区别
与 CSS 颜色 4 相比,一个主要变化是 CSS 颜色不再局限于 预定义的 RGB 空间,例如 sRGB 或 display-p3。
为了支持这一点,添加了几个全新的功能:
- color() 函数通过 @color-profile @规则进行扩展,用于配置文件相关的设备颜色, 包括校准的 CMYK。
- device-cmyk() 函数,用于在输出设备特定的 CMYK 颜色空间中指定未校准的颜色。
此外,新的 color-mix() 函数允许在指定的颜色空间中混合两种颜色, 以产生一种新的颜色。