AZ Tools

CSS color-mix() 预览 (插值空间对比)

颜色

现代 CSS 允许你用 `color-mix(in <space>, A <p>, B)` 混合两种颜色,选择的插值空间会极大改变结果。红色和蓝色在 `srgb` 中混合得到浑浊的紫灰;同样的混合在 `oklch` 中产生鲜艳的洋红;在 `hsl` 中则会扫过青色,因为色相沿色环短弧插值。该工具将同样的混合并排显示在 8 个常用空间 (`srgb`, `srgb-linear`, `hsl`, `hwb`, `lab`, `lch`, `oklab`, `oklch`) 中 — 使用浏览器原生 `color-mix()`,所见即所得。每张卡片显示当前比例的大色块、解析得到的 sRGB hex (通过将颜色画到 1×1 canvas 并读取像素计算)、以及显示从 A 到 B 完整路径的 11 步渐变条。拖动比例滑块,8 条路径同时动起来。点击任意卡片即可复制对应的 CSS 声明。

预设
srgb
srgb-linear
hsl
hwb
lab
lch
oklab
oklch
关于插值空间

color-mix() 在你指定的空间内对两种颜色做线性插值。sRGB 经过去饱和的灰色。srgb-linear 与物理光线相加 (照片合成) 一致。HSL/HWB/LCH/OKLCH 在色环上插值色相 — 默认走短弧。OKLab/OKLCH (Björn Ottosson, 2020) 感知均匀 — 数值上等距的步长看起来视觉间距也相等。每个色块下方的 hex 是浏览器解析混合后从 1×1 canvas 中读出的,所以与 getComputedStyle() 一致。

使用方法

  1. 用拾色器选定颜色 A 和颜色 B,或粘贴 hex。
  2. 拖动百分比滑块 — 这是混合中 A 的比例 (30% 表示 30% A + 70% B)。
  3. 对比 8 张卡片:色块是当前比例的结果,渐变条显示该空间下 A→B 的完整渐变。
  4. 点击任意卡片的复制图标,获取 `background: color-mix(in <space>, ...);` 声明。
  5. 试试预设 — 红↔蓝、黄↔蓝是 'srgb 为什么看起来很脏' 的经典案例。

常见问题

为什么每个空间的结果差这么多?
color-mix() 做的线性插值,是在你选的坐标系中走一条直线。在 sRGB 里这条直线穿过去饱和的灰色,因为 sRGB 立方体的主对角线就是灰色。在 OKLCH 里同样的直线保持感知明度不变只旋转色相,所以保持鲜艳。在 HSL 里直线沿色相环最短路径走,可能经过 A 和 B 之间根本没有的颜色。哪个都不算错,只是几何结构不同。
应该用哪个空间?
大多数 UI 工作中,`oklch` 或 `oklab` 在感知上最佳 — 渐变亮度均匀、混合后仍鲜艳、没有浑浊的中间点。`srgb-linear` 对物理光线叠加 (照片合成) 正确。`srgb` 与旧工具和 2023 年前的 CSS 行为一致。`hsl` 仅在 A 和 B 饱和度·明度相同时适合做基于色相的调色板。除非特意要哑光效果,否则鲜艳色对避免直接用 `srgb`。
显示的 hex 准确吗?
正是浏览器计算出的值。颜色表达式被设为 canvas 的 `fillStyle`,渲染 1×1 像素,然后 `getImageData()` 读出真实的 sRGB 字节。所以你看到的 hex 与 `getComputedStyle()` 对该混合的解析值一致 — 在 8 位 canvas 量化误差 (每通道 ±1) 范围内。
hue-shortest 与 hue-longest 呢?
CSS 为色相相关空间 (hsl, hwb, lch, oklch) 支持 `longer hue` / `shorter hue` / `increasing hue` / `decreasing hue` 修饰符。本工具默认使用 (shorter hue) 以保持卡片简洁。如果需要长弧色相插值,自己加上修饰符: `color-mix(in oklch longer hue, A 50%, B)` — 同样的颜色,色环相反方向。
浏览器支持?
color-mix() 在 Chrome/Edge 111+ (2023 年 3 月)、Safari 16.2+ (2022 年 12 月)、Firefox 113+ (2023 年 5 月) 推出。2023 年起的所有主流浏览器都支持这里列出的全部空间。如果出现不支持横幅,说明浏览器更旧 — CSS 仍能解析,但不会产生正确颜色。

相关工具