Skip to content

HEX 转 OKLCH 转换器

把 HEX 转成 OKLCH,直接喂给 Tailwind v4 设计 token。实时输出感知均匀的三元组,带 Display P3 色域提醒。免费,纯浏览器运行。

无追踪 浏览器中运行 免费
所有颜色转换都在您的浏览器本地完成。任何数据都不会发送到任何服务器。
色域: sRGB Display P3 Rec2020
对比度对照:
AA AA-Lg AAA AAA-Lg · APCA Lc
色盲模拟(8 种类型)
红色盲(protanopia)
绿色盲(deuteranopia)
蓝色盲(tritanopia)
全色盲(achromatopsia)
红色弱(protanomaly)
绿色弱(deuteranomaly)
蓝色弱(tritanomaly)
部分色弱(achromatomaly)
Tints / Shades / Tones / Harmonies

浅色

深色

灰调

和谐色

复制为代码
常见颜色参考
已就 CSS Color 4 §11.2 + §15.1 一致性、Ottosson 2020 OKLAB 矩阵正确性、Tailwind v4 调色板等价性、Display P3 / Rec.2020 色域检测准确性,以及 HEX 与 OKLCH 在 0–1 感知亮度、0–0.4 色度与 0–360° 色相区间内的往返稳定性完成评审。 — Go Tools 工程团队 · 2026年5月27日

什么是 HEX 转 OKLCH 转换器?

HEX 转 OKLCH 转换器是一个小型工具,把 HEX 颜色代码(`#3b82f6`)转成在 OKLCH 空间中编码同一颜色的感知均匀的 感知亮度 / 色度 / 色相 三元组(`oklch(0.629 0.193 263.4)`)。HEX 代码是设计师与开发者在 Figma、Sketch、Photoshop、品牌指南 PDF 与 CSS 样式表之间复制粘贴的简短 16 进制字符串 —— 三个 8 位通道打包进 6 字符 `#RRGGBB` 形式,锚定在 IEC 61966-2-1(1996)定义的 sRGB 色彩空间。OKLCH 是 OKLAB 的极坐标形式,OKLAB 是 Björn Ottosson 在 2020 年提出的感知均匀色彩空间,通过 CSS Color 4 中的 `oklch()` 语法加入 CSS(自 2022 年起为 W3C 候选推荐)。三个通道是:感知亮度 Lightness(0–1,也可写成 0–100%)、色度 Chroma(0 到 sRGB 最饱和颜色的约 0.4,广色域颜色可超过此值)、色相 Hue(0–360°,与 HSL 使用同一角度轴)。浏览器支持在 2022 年 3 月(Safari 15.4)与 2023 年 5 月(Firefox 113)之间陆续落地到所有常青浏览器,中间是 Chrome 111(2023 年 3 月) —— caniuse 综合覆盖率超过 94%。示例:Tailwind blue-500 即 `oklch(0.629 0.193 263.4)`。

**感知均匀 —— 为什么重要。** 在 OKLCH(以及它的直角坐标兄弟 OKLAB)中,L 通道上相等的数值距离对应相等的感知亮度距离 —— 在每一种色相、每一种色度层级、空间的每一个区域上都成立。在 HSL 中,相等的 L 值在不同色相上看起来亮度不均,因为 HSL 继承了 sRGB 的 gamma 怪癖:`hsl(120 100% 50%)` 上的绿色在视觉上明显比 `hsl(240 100% 50%)` 上的蓝色更亮,即便两者都报 L=50%。结构性原因在于 HSL 是在 gamma 编码的 sRGB 中以几何方式派生 L(通道最大值与最小值取平均),而 OKLCH 的 L 是从一个感知锚定的模型派生,先做线性化再走 LMS 锥响应阶段。实际影响是:在 OKLCH 中跨色相把 L 固定不变,得到的就是视觉等价的亮度 —— `oklch(0.7 0.2 130)` 的绿与 `oklch(0.7 0.2 250)` 的蓝在屏幕上看起来一样亮。这就是 Tailwind v4 在 2025 年把默认调色板迁到基于 OKLCH 色阶生成的原因 —— 每一档(50、100、200、…、900、950)都达到同样的感知亮度差,品牌色在不同色相间感觉一致,无需逐色手工微调。

**Tailwind v4 与设计 token 革命。** Tailwind v4(2025 年 1 月发布)把基于 HSL 的颜色生成替换为基于 OKLCH 的系统。shadcn/ui 紧随其后,把它的 CSS 变量主题改为 OKLCH;Radix Colors v3 也跟进。为什么是现在:设计系统需要在整个调色板上看起来均匀间隔的色阶,并且需要这一性质随着调色板的扩展自动成立。在 HSL 下,设计师不得不手工修正每一档颜色 —— 把蓝色色阶深端的 L 多上调 5% 以匹配绿色色阶的深端,品牌演进时再重新调一遍。在 OKLCH 下,一个简单公式(L 等步长扫,C 与 H 固定)就能自动产出一致的色阶。真实案例:在 Tailwind v3 中,`red-500` 与 `blue-500` 在 HSL L% 相同的情况下感知权重明显不同;在 v4 中,`red-500` 与 `blue-500` 看起来均衡,因为两者坐在同一个 OKLCH L 上。这对无障碍(对共享背景一致的对比度,意味着组件状态在整个调色板上感觉统一)、品牌一致性(视觉层级跨调色板成立 —— 在同一个 L 上的 `primary` 按钮与 `accent` 按钮感觉是同一个层级)与开发者体验(一个心智模型,而不是埋在设计 token 规范里的几十个手工微调例外)都很重要。

**广色域的含义。** OKLCH 无上界 —— 可以表示 sRGB 之外的颜色,包括 Display P3 与 Rec.2020 能再现的一切。这让它成为现代广色域显示设备的自然选择。多数 Apple 设备自 2017 年起(iPhone 7 及以后、2016 年及以后的 MacBook Pro、每一台 iPad Pro)原生渲染 Display P3,许多现代 Android 设备与笔电屏幕也是。代价是:并非每一个 OKLCH 三元组都能映射到合法的 sRGB 颜色。工具显示三个色域徽章 —— sRGB、Display P3、Rec.2020 —— 您可以立刻看到当前 OKLCH 在某一目标上能否正确显示。当颜色仅 sRGB 时,**Snap to sRGB** 按钮使用二分色度收缩(按 CSS Color 4 §13 的非规范性色域映射算法)在保留 L 与 H 的同时把颜色收缩进色域 —— 给您一个 HEX 兜底,可经由 `@supports not (color: oklch(0 0 0))` 与原始 OKLCH 值一并交付,广色域客户端拿到广色域版本。

**HEX → OKLCH 转换数学。** 流水线定义良好,基于两个主要来源:W3C CSS Color 4 提供 sRGB 与 XYZ 阶段,Ottosson 2020 提供 OKLAB 阶段。第一步:把 `#RRGGBB` 解析成三个 8 位整数 sRGB 通道,每通道用 `parseInt(hex.slice(1, 3), 16)` 等。第二步:每通道除以 255 归一化到 0–1。第三步:通过 CSS Color 4 §11.2 分段函数 gamma 解码到线性 sRGB(`v <= 0.04045 ? v/12.92 : ((v+0.055)/1.055)^2.4`)。第四步:乘以 §15.1 3×3 矩阵得到 CIE XYZ D65 坐标。第五步:乘以 Ottosson 的 LMS 矩阵(取自他 2020 年的参考实现)并对每通道取立方根。第六步:乘以 Ottosson 的 OKLAB 矩阵得到 L / a / b。第七步:笛卡尔到极坐标 —— `C = sqrt(a² + b²); H = atan2(b, a) * 180 / π`,把 H 包到 0–360°。整套流水线在微秒级运行 —— 每一次按键都即时重渲染 OKLCH 输出,无防抖。

本工具的 HEX → OKLCH 工作流是 5 个辐条家族中的一个方向,它们共享同一个底层统一颜色转换器。专用的 统一颜色转换器是中枢 —— 它同时显示全部 9 种格式且都可编辑,当您的工作流需要的不只是 HEX 与 OKLCH 时,这才是合适的工具。各个单向辐条针对特定的 Google 搜索意图:HEX 转 RGB 转换器对应面向 canvas 与硬件的方向;RGB 转 HEX 转换器处理反方向;HEX 转 HSL 转换器对应许多 Tailwind v3 代码库仍在使用的传统设计师圆柱空间;HEX 转 CMYK 转换器用于印刷准备近似。这 5 个辐条与中枢内部共享同一份 OKLCH 事实源与同一套 Ottosson 2020 矩阵,因此结果在整个家族中可保证完全一致。每一次转换都在浏览器中本地运行 —— 您的 HEX 代码绝不会上传、绝不会被记录,键入时零网络请求。可在 DevTools 中亲自验证。 想深入了解 OKLCH 为何在 2024–2026 年成为设计系统标准,请阅读配套指南:OKLCH 色彩空间详解 —— Tailwind v4 为什么采用它

// sRGB hex → OKLCH per W3C CSS Color 4 + Ottosson 2020
// References: https://www.w3.org/TR/css-color-4/#color-conversion-code
//             https://bottosson.github.io/posts/oklab/
// Worked example: #3b82f6 (Tailwind blue-500) → oklch(0.629 0.193 263.4)
function hexToOklch(hex) {
  const h = hex.trim().replace(/^#/, '');
  const srgb = [0, 2, 4].map(i => parseInt(h.slice(i, i + 2), 16) / 255);
  // sRGB → linear-sRGB (CSS Color 4 §11.2 piecewise gamma)
  const lin = srgb.map(v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4));
  const [lr, lg, lb] = lin;
  // linear-sRGB → XYZ D65 (CSS Color 4 §15.1 matrix)
  const x = 0.4124564 * lr + 0.3575761 * lg + 0.1804375 * lb;
  const y = 0.2126729 * lr + 0.7151522 * lg + 0.0721750 * lb;
  const z = 0.0193339 * lr + 0.1191920 * lg + 0.9503041 * lb;
  // XYZ D65 → LMS (Ottosson 2020), cube-root, → OKLAB
  const l_ = Math.cbrt(0.8189330101 * x + 0.3618667424 * y - 0.1288597137 * z);
  const m_ = Math.cbrt(0.0329845436 * x + 0.9293118715 * y + 0.0361456387 * z);
  const s_ = Math.cbrt(0.0482003018 * x + 0.2643662691 * y + 0.6338517070 * z);
  const L = 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_;
  const a = 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_;
  const b = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_;
  // OKLAB → OKLCH (Cartesian to polar)
  const C = Math.sqrt(a * a + b * b);
  const H = (Math.atan2(b, a) * 180 / Math.PI + 360) % 360;
  return `oklch(${L.toFixed(3)} ${C.toFixed(3)} ${H.toFixed(1)})`;
}
console.log(hexToOklch('#3b82f6')); // → oklch(0.629 0.193 263.4)

核心特性

在所有色相上感知均匀的输出

OKLCH 的 L 通道锚定在 OKLAB 感知模型(Ottosson 2020)上,因此每一步 L 在所有色相上看起来都是同样的亮度变化 —— `oklch(0.7 0.2 130)` 的绿与 `oklch(0.7 0.2 250)` 的蓝在屏幕上读起来一样亮。这一结构性属性让 Tailwind v4 能自动生成视觉均匀的色阶,无需逐色手工微调;等价的 HSL 色阶则做不到,因为 HSL 继承了 sRGB 的 gamma 怪癖。

Tailwind v4 就绪 —— 直接放进 @theme 块

OKLCH 输出使用 CSS Color 4 的空格分隔形式(`oklch(0.629 0.193 263.4)`) —— 正是 Tailwind v4 在 `@theme` 块中期待的语法,写作 `--color-primary: oklch(0.629 0.193 263.4);`。L 精度与 Tailwind 公布的调色板精度一致(L 与 C 取三位小数,H 取一位小数),因此粘进配置文件的工作流会产出与 Tailwind 默认完全一致的 token。配合「复制为代码」区段的 Tailwind v4 片段,可获得完整的 token 行。

Display P3 + Rec.2020 色域徽章

三个实时徽章(sRGB、Display P3、Rec.2020)标示当前 OKLCH 三元组是否落在每个空间的可再现范围内。这很有用,因为 OKLCH 无上界 —— 很多高色度颜色超出 sRGB 但能落进 P3,而多数 Apple 设备自 2017 年起就能原生渲染 P3。超出色域时徽章会变红,您可以决定为现代显示设备保留广色域值,还是收进 sRGB 以追求普遍兼容。通道范围检查会在每次按键时运行。

Snap to sRGB 兼容遗留显示

Snap to sRGB 按钮跑一次二分色度收缩(CSS Color 4 §13 非规范性算法):固定 L 与 H,把 C 往下二分搜索,直到结果的 sRGB 转换落进色域。搜索在 ~30 次迭代后以亚像素精度终止。保留 L 与 H 意味着收紧后的颜色读起来仍是同一个色相家族、同样的感知亮度 —— 它只丢饱和度,这是视觉冲击最小的妥协。Snapped HEX 与原始 OKLCH 通过 `@supports not (color: oklch(0 0 0))` 配对实现分层兜底。

逐键实时转换

没有「转换」按钮。在 HEX 字段里键入一个字符,OKLCH 字段会在同一帧动画里刷新。内部规范表示就是 OKLCH 三元组本身,因此直接编辑 OKLCH 同样快速 —— 光标停留在您放的位置,只有其他格式字段重渲染。转换数学(sRGB → 线性 → XYZ → LMS → OKLAB → 极坐标)在微秒级运行;无防抖、无延迟、无可见回流。

基于 W3C + Ottosson 2020 流水线的可运行示例

代码示例区段附带一段可运行的 JavaScript 实现,完整覆盖 HEX → OKLCH 流水线,使用了 W3C CSS Color 4(§11.2 分段 gamma、§15.1 线性 sRGB → XYZ D65 矩阵)与 Björn Ottosson 2020 OKLAB 参考实现中公布的完整矩阵与 gamma 函数。粘进 Node REPL,验证 `#3b82f6` 得到 `oklch(0.629 0.193 263.4)`。每一个矩阵值都直接复制自其主要来源 —— 不做重新推导,不做四舍五入。

在统一中枢中与 HSL / RGB / HEX 双向同步

尽管这个辐条专门针对 HEX → OKLCH,同一页面也展示其他 8 个格式字段 —— 给硬件的 RGB,给遗留 CSS 的 HSL,给调色板数学的 OKLAB,给取色器 UI 的 HSV/HWB,给印刷的 CMYK,以及最接近的 CSS 命名颜色。内部以 OKLCH 作为事实源意味着每个字段在往返中都比特稳定:HEX → OKLCH → HSL → HEX 能恢复出原始 HEX。点击任一字段直接编辑,看着其他字段同步更新。

内联浏览器支持摘要

工具在相关之处提供规范的浏览器支持数据点:Chrome 与 Edge 111(2023 年 3 月)、Safari 15.4(2022 年 3 月,最早)、Firefox 113(2023 年 5 月),caniuse 综合覆盖率超过 94%。对于较老客户端,把 token 包在 `@supports (color: oklch(0 0 0))` 中,并在另一分支提供 HEX 兜底。Snap to sRGB 的输出正是那个兜底,由当前 OKLCH 三元组自动生成 —— 无需手工调色度。

100% 在浏览器中 —— 不上传、不跟踪

所有 HEX 解析、OKLCH 转换、色域检测、对比度评分与调色板生成都在您的浏览器中本地运行。您的 HEX 代码绝不会被传输、绝不会在任何服务器被记录、绝不会被分析。键入时零网络请求 —— 可在 DevTools 中亲自验证。可放心用于尚未公布的品牌调色板、未发布产品的内部设计 token、NDA 下的草稿稿件,以及任何其他保密颜色工作 —— 这些场景下数据都不能泄露。

HEX 转 OKLCH 转换器替代品对比

OKLCH.com

browser tool

由 Andrey Sitnik(postcss-oklab-function polyfill 与 Autoprefixer 作者)打磨的、专注 OKLCH 的精品工具。在纯粹 OKLCH 探索上达到 best-in-class,带广色域感知取色器、P3 感知可视化与调色板生成。不把 HEX/RGB/HSL/CMYK 转换作为主输出 —— 专攻 OKLCH。深入做 OKLCH 设计工作时找 OKLCH.com;同时需要跨空间转换以及色域 / 对比度 / 色盲特性时,找本工具。

Tailwind v4 文档调色板

documentation reference

Tailwind v4 文档在 HEX 等价值旁公布完整默认调色板的 OKLCH 形式。最适合查某个确切 Tailwind 档位(`blue-500` → `oklch(0.629 0.193 263.4)`)或把自定义颜色匹配到某个 Tailwind 档位的视觉权重。非交互 —— 不对任意 HEX 做转换。本工具覆盖同样的 OKLCH 精度,适用于任意 HEX,而不仅是 200+ 个 Tailwind 默认。

ColorJS.io Playground

browser tool

ColorJS.io 是 Lea Verou 与 Chris Lilley 的权威 CSS 颜色库;playground 暴露完整转换图(HEX、RGB、HSL、HWB、LCH、OKLCH、OKLAB、P3、Rec2020、ProPhoto、A98)。数学深度正确,适合规范级颜色工作。UI 面向开发者(不是面向设计师),缺少对比度 / 色盲 / 调色板特性。可与本工具搭配:用 ColorJS.io 做您无法另行验证的数学,用本工具做主动工作流。

shadcn/ui 主题生成器

browser tool

Vercel 的 shadcn 主题生成器为 shadcn/ui 项目产出即贴即用的 OKLCH CSS 变量主题。最适合端到端主题生成,交付物是 shadcn 配置文件时尤其合适。不为任意 HEX 暴露中间 OKLCH 值 —— 专注完整主题工作流。要构建 shadcn 主题时用 shadcn 生成器;需要任何单个颜色的 OKLCH 时用本工具。

ColorHexa

browser tool

围绕每个颜色构建的长期 SEO 页面,带深度元数据。近期与 HEX/RGB/HSL/CMYK 并列加入了 OKLCH 支持。UI 已显陈旧(2010 年代初风格),无广色域检测,无 APCA 对比度。从 Google 发现某个具体 HEX 时较强;主动转换工作流较弱,因为统一字段 UX 与色域 / 对比度特性更重要。本工具在每一条主动工作流轴上都胜出。

浏览器 DevTools 取色器

built-in browser feature

Chrome、Firefox 与 Safari 的 DevTools 都自带取色器,当您在 CSS 面板里点击颜色色卡时会内联在 HEX、RGB、HSL、HWB 与 OKLCH 之间切换。免费、免安装、随时可用。缺少色域徽章、对比度评分、色盲模拟,以及面向非 Web 平台(SwiftUI、Compose)的代码导出。已经在调试 CSS 时用 DevTools;需要跨平台输出或更深核验时用本工具。

Culori CLI

command-line library

Culori 是最完整的 OKLCH 感知 JavaScript 颜色库;其 CLI 把 HEX → OKLCH 处理为一行(`culori convert '#3b82f6' --to oklch`)。出色适用于 CI 脚本与批量 token 迁移。没有可视化取色器或色域徽章。Culori CLI 用于自动化;本工具用于交互式单色工作以及即时的可视化反馈。

HEX 转 OKLCH 示例

把 Tailwind 3 的 HSL 调色板迁移到 v4 OKLCH token

#3b82f6

OKLCH 输出:`oklch(0.629 0.193 263.4)`。规范的 Tailwind v4 迁移工作流:在 `@theme` 块中一次性定义品牌色,写作 `--color-primary: oklch(0.629 0.193 263.4)`,然后通过把 L 往上扫(`oklch(0.7 0.193 263.4)`、`oklch(0.8 0.15 263.4)`)生成浅色色阶,把 L 往下扫(`oklch(0.5 0.193 263.4)`、`oklch(0.4 0.18 263.4)`)生成深色色阶。色相锁定在 263.4°,色度大致锚在 0.19,感知亮度是唯一在扫的轴 —— 一维色阶在整个跨度上读起来视觉均匀,这是等价的 HSL 色阶无法保证的。

用感知均匀的深色色阶迁移设计 token

#FF5733

OKLCH 输出:大约是 `oklch(0.66 0.18 28)`。要从这个品牌橙构建一个 5 步深色色阶,把 C = 0.18、H = 28 固定不动,把 L 扫过 0.3、0.45、0.6、0.75、0.9,生成 `oklch(0.3 0.18 28)` 到 `oklch(0.9 0.18 28)`。相邻每一对在感知亮度上感觉是同样的跳变,因为 OKLCH 的 L 锚定在 OKLAB 感知模型(Ottosson 2020)上,而不是 HSL 那种与 gamma 纠缠的几何 L。色度在极端处可能悄悄向 sRGB 边缘裁剪;工具的色域徽章会准确标出哪一步需要留意。

广色域 OKLCH → sRGB 兜底用于 Tailwind v3 站点

#FF1744

OKLCH 输出:大约是 `oklch(0.62 0.27 26)`。这样一个高色度的红色超出了 sRGB 色块 —— **sRGB** 色域徽章会亮红,**Display P3** 徽章确认它能落进 P3,Rec.2020 同样能覆盖。在标准 24 位显示器上它会渲染成一个去饱和的近似;在 Display P3 屏幕上(自 2017 年起多数 Apple 设备)它会渲染得饱和。点击 **Snap to sRGB** 跑一次二分色度收缩算法(CSS Color 4 §13 非规范性) —— L 与 H 保持锁定,C 持续收缩直到颜色落进色域,产出一个 HEX 兜底,适合还在用 8 位 HEX token 的 Tailwind v3 代码库。

shadcn/ui 主题迁移

#0f172a

OKLCH 输出:大约是 `oklch(0.21 0.04 264.7)`。shadcn/ui 在 Tailwind v4 落地后不久就把它的 CSS 变量主题迁到 OKLCH,而 `#0f172a`(Tailwind slate-900)是规范的深色模式背景。本工具复现了 shadcn 为同一 HEX 公布的 OKLCH 值,因此您可以核验社区主题移植是否与上游定义一致。配合对比度行确认深色模式前景(白或近白)对这个背景仍然过 WCAG AA —— `oklch(0.21 ...)` 对照 `oklch(1 0 0)` 报出一个舒适的 16:1。

从品牌 HEX 构造 Tailwind v4 的暗/亮配对

#3b82f6

OKLCH 输出:`oklch(0.629 0.193 263.4)`。要为主题派生一对配套的暗/亮色,只在 L 通道上枢转,C 与 H 固定不动:浅色模式主色变成 `oklch(0.7 0.15 263)`(稍亮、稍降色度,避免白底视觉疲劳),深色模式主色变成 `oklch(0.5 0.18 263)`(稍暗、稍升色度,在深色背景上保留显著性)。两个变体读起来都是同一个品牌身份,因为色相锁定;感知 L 的位移在两种模式下平衡可读性,无需手工逐通道调 RGB。

常见 HEX → OKLCH 转换(Tailwind v4)

10 个常用 Tailwind v4 默认调色板中间档及其 HEX 与 OKLCH 等价值的参考表。数值匹配 Tailwind v4 公布的调色板精度(L 与 C 三位小数,H 为整数或一位小数)。

Tailwind slate-500

#64748b oklch(0.55 0.04 257)

Tailwind CSS 默认的 slate-500 —— 中性偏冷的灰,用于正文文本、次要表面与去强调的 UI 元素。低色度(0.04)让它在视觉上保持中性。

#64748b oklch(0.55 0.04 257)

slate 是面向深色模式友好主题的规范中性色阶 —— 每一档 slate 都坐在极低色度上,因此读起来是灰,而不是带蓝调。

需要带 RGB、HSL、CMYK、色域提醒与代码导出的完整取色器吗?请试用统一颜色转换器 —— 每个格式都可同时编辑。

Tailwind gray-500

#6b7280 oklch(0.55 0.03 258)

Tailwind CSS 默认的 gray-500 —— slate 的真正中性对偶。色度比 slate 稍低(0.03 对 0.04),外观更无色调。

#6b7280 oklch(0.55 0.03 258)

gray 与 slate 坐在几乎相同的 L 上(0.55) —— 感知亮度匹配,只是那一点色度差异把两者区分开。

需要带 RGB、HSL、CMYK、色域提醒与代码导出的完整取色器吗?请试用统一颜色转换器 —— 每个格式都可同时编辑。

Tailwind red-500

#ef4444 oklch(0.64 0.21 25)

Tailwind CSS 默认的 red-500 —— 规范的破坏性操作 / 错误红色。高色度(0.21)让它在中性背景上保持显著。

#ef4444 oklch(0.64 0.21 25)

red-500 坐在 L=0.64,与 blue-500 的 L=0.63 匹配 —— v4 色阶在跨色相上感知均衡,与 v3 基于 HSL 的调色板不同。

需要带 RGB、HSL、CMYK、色域提醒与代码导出的完整取色器吗?请试用统一颜色转换器 —— 每个格式都可同时编辑。

Tailwind orange-500

#f97316 oklch(0.71 0.19 42)

Tailwind CSS 默认的 orange-500 —— 暖色强调与 CTA 色相。在色相环上位于红与琥珀之间(42°)。

#f97316 oklch(0.71 0.19 42)

orange-500 的 L(0.71)高于 red-500 的 L(0.64)是有意为之 —— 黄与橙在更低的感知 L 上就显得明亮。

需要带 RGB、HSL、CMYK、色域提醒与代码导出的完整取色器吗?请试用统一颜色转换器 —— 每个格式都可同时编辑。

Tailwind amber-500

#f59e0b oklch(0.76 0.16 70)

Tailwind CSS 默认的 amber-500 —— 警告 / 注意色相,在色环上位于橙与黄之间。

#f59e0b oklch(0.76 0.16 70)

amber-500 在所有 500 档 Tailwind 颜色中达到最高的 L(0.76) —— 黄色天然需要更高的 L 才能显示为「中间色调」。

需要带 RGB、HSL、CMYK、色域提醒与代码导出的完整取色器吗?请试用统一颜色转换器 —— 每个格式都可同时编辑。

Tailwind green-500

#22c55e oklch(0.72 0.19 149)

Tailwind CSS 默认的 green-500 —— 成功 / 确认色相。坐在色相环 149°,在青绿区域。

#22c55e oklch(0.72 0.19 149)

green-500 在 L=0.72,比 red-500 的 L=0.64 稍亮 —— 这与感知现实相符(绿色看起来本就更亮),并给调色板带来均衡的视觉权重。

需要带 RGB、HSL、CMYK、色域提醒与代码导出的完整取色器吗?请试用统一颜色转换器 —— 每个格式都可同时编辑。

Tailwind teal-500

#14b8a6 oklch(0.7 0.13 184)

Tailwind CSS 默认的 teal-500 —— 介于绿与青之间的冷色强调色相。色度比 green-500 低,因为高色度的青绿色很容易越出 sRGB。

#14b8a6 oklch(0.7 0.13 184)

teal-500 的 H=184° 略过纯青(180°) —— OKLCH 中纯青在 sRGB 中难以表达而不发生色度裁剪;teal 是务实的折中。

需要带 RGB、HSL、CMYK、色域提醒与代码导出的完整取色器吗?请试用统一颜色转换器 —— 每个格式都可同时编辑。

Tailwind blue-500

#3b82f6 oklch(0.63 0.19 263)

Tailwind CSS 默认的 blue-500 —— 2020 年代规范的「Web 蓝」、v4 调色板与 shadcn/ui 默认主题的品牌锚色。

#3b82f6 oklch(0.63 0.19 263)

blue-500 是最常被用作 Tailwind v4 OKLCH 迁移起点的参考色 —— 把 #3b82f6 粘进这里,可对照公布值核验转换。

需要带 RGB、HSL、CMYK、色域提醒与代码导出的完整取色器吗?请试用统一颜色转换器 —— 每个格式都可同时编辑。

Tailwind indigo-500

#6366f1 oklch(0.59 0.21 277)

Tailwind CSS 默认的 indigo-500 —— 蓝色的冷色强调伙伴,坐在 277°(偏紫)。高色度(0.21)赋予其显著性。

#6366f1 oklch(0.59 0.21 277)

indigo-500 坐在比 blue-500 更低的 L(0.59 对 0.63) —— 更深的色相吸收更多表观亮度,v4 色阶在感知层面把这一点纳入考量。

需要带 RGB、HSL、CMYK、色域提醒与代码导出的完整取色器吗?请试用统一颜色转换器 —— 每个格式都可同时编辑。

Tailwind violet-500

#8b5cf6 oklch(0.6 0.24 295)

Tailwind CSS 默认的 violet-500 —— 紫色强调色相,坐在 295°。在所有 Tailwind 500 档颜色中色度最高(0.24),常用于 AI / 创意产品品牌。

#8b5cf6 oklch(0.6 0.24 295)

violet-500 的高 C=0.24 把它压到接近 sRGB 色域上限 —— 再往上推就会越入仅 P3 的广色域区域。

需要带 RGB、HSL、CMYK、色域提醒与代码导出的完整取色器吗?请试用统一颜色转换器 —— 每个格式都可同时编辑。

如何使用 HEX 转 OKLCH 转换器

  1. 1

    把 HEX 代码粘贴到 HEX 字段

    把任意 HEX 值丢进 HEX 输入框 —— 带或不带前导 `#`、3 位简写(`#F73`)、6 位完整形式(`#3b82f6`)、4 位 alpha 简写(`#F738`),或者 8 位 alpha 完整形式(`#FF573380`)。解析器会把全部 5 种输入形态在派生 OKLCH 之前归一到同一内部颜色。大小写无关(`#3b82f6` 与 `#3B82F6` 解析结果完全相同)。非法字符或位数错误会产生一个安静的行内错误;合法 HEX 则会实时刷新其他每一个格式字段,包括 OKLCH。

  2. 2

    从 OKLCH 字段读取 OKLCH 三元组

    OKLCH 字段以 CSS Color 4 现代形式呈现该值:不透明颜色为 `oklch(0.629 0.193 263.4)`,带 alpha 时为 `oklch(0.629 0.193 263.4 / 0.5)`。L 取三位小数(与 Tailwind v4 公布的精度一致),C 取三位小数,H 取一位小数(度)。工具内部以 OKLCH 作为事实源,意味着底层浮点精度在其他每个字段上都被保留 —— 往返回到 HEX 比特稳定,这与那些以 HSL 作枢轴的老式转换器不同,后者每次往返会漂移一到两度。

  3. 3

    点击「复制」抓取 OKLCH 字符串

    每个格式卡片右侧都有一个复制按钮。一键即可把值送到剪贴板 —— 按钮标签短暂闪现「Copied!」以便您知道。复制出来的字符串是规范的 CSS Color 4 语法(`oklch(0.629 0.193 263.4)`),可直接放进 Tailwind v4 的 `@theme` 块或 shadcn/ui 的 CSS 变量定义。要输出特定平台的代码(CSS 自定义属性、Tailwind v4 token、SwiftUI、Compose、Flutter),请使用取色器下方的「复制为代码」区段 —— 那些片段会按每个平台原生期望的格式输出。

  4. 4

    查看 Display P3 / Rec.2020 色域徽章

    三个色域徽章(sRGB、Display P3、Rec.2020)显示当前颜色是否落在每个空间的可再现范围内。如果 sRGB 徽章亮红而 P3 是绿,这就是一个广色域 OKLCH,会在 Apple 硬件(iPhone、iPad、2017 年及之后的 MacBook)上渲染得饱和,但在传统 24 位显示器上会去饱和。**Snap to sRGB** 按钮使用二分色度收缩(CSS Color 4 §13 非规范性算法),在保留 L 与 H 的同时把颜色收缩进 sRGB,产出一个可经由 `@supports not (color: oklch(0 0 0))` 兜底交付的 HEX。

  5. 5

    同屏可见:RGB、HSL、OKLAB、HSV、HWB、CMYK、命名颜色

    您粘贴的同一个 HEX 也会点亮其他 8 个格式字段 —— 给 canvas 调用和硬件的 RGB,给遗留 CSS 变量的 HSL,给调色板数学与色盲矩阵的 OKLAB,给设计师取色器工作流的 HSV 与 HWB,给印刷估算的 CMYK,以及给文档文案的最接近 CSS 命名颜色。您绝不会被锁死在仅 HEX → OKLCH。取色器(SL 方块 + 色相滑块 + alpha 滑块)同时驱动全部 9 种;在 Chromium 系浏览器上,EyeDropper 按钮可以从屏幕任意像素取样,包括浏览器之外。

HEX / OKLCH 常见错误

把 OKLCH 色度当作 HSL 饱和度读

OKLCH 色度无上界(对落进 sRGB 的颜色是 0 到约 0.4,广色域颜色更高) —— 它**不是** HSL 中 S 那种 0–100% 的饱和度百分比。把 C=0.3 理解为「30% 饱和」是误读尺度:0.3 是高色度的,对某些色相已接近 sRGB 上限,对另一些色相已远超。最大 C 因 L 与 H 而异 —— 在 L=0.7 的绿能支持远比 L=0.3 的蓝更高的 C。把 C 当作到灰色的绝对距离,而不是相对百分比。

✗ 错误
设置 OKLCH C = 0.3,期望「30% 饱和度」:
oklch(0.7 0.3 250) → 对蓝色可能超出 sRGB 色域
广色域颜色在传统显示上渲染去饱和。
✓ 正确
把 C 当作绝对色度,核对色域徽章:
oklch(0.7 0.15 250) → 在这一 L+H 配对上舒服地落进 sRGB
用徽章找出落进目标色域的最大 C。

把 OKLCH 的 L 与 HSL 的 L 当成同一回事

两个空间都把感知亮度报为 0–1(或 0–100%)的轴,但它们测量的东西不同。HSL 的 L 是几何的 —— 在 gamma 编码的 sRGB 中由 RGB 最大值/最小值取平均得到。OKLCH 的 L 是感知的 —— 锚定在 OKLAB 模型上。把一份基于 HSL 的调色板原样以 `oklch(L%, C, H)` 移植,并期望亮度匹配,会得到不均匀的结果,因为两个空间的 L 关系是非线性的。对中间色调而言,OKLCH L = 0.6 大致对应 HSL L = 50%,但曲线在两端会漂移。

✗ 错误
把 HSL 的 L 百分比直接复制到 OKLCH:
hsl(220 50% 30%) 移植为 oklch(0.30 0.10 220)
两个颜色在亮度上看起来明显不同。
✓ 正确
从原始 HEX 重新派生 OKLCH,不要从 HSL 移植:
HEX 源 → OKLCH 转换 → oklch(0.34 0.08 254)
感知 L 保持正确;调色板感觉均匀。

忘了广色域 OKLCH 在 sRGB 上显示不出来

OKLCH 无上界 —— 您可以写 `oklch(0.7 0.4 30)`,语法合法,但色度超出 sRGB 每通道 256 字节空间能编码的范围。在 sRGB 显示器上,这个颜色会被裁剪到最近的、落进色域的近似(通常是一个去饱和版本)。在 Display P3 显示器上,它会正确渲染。不核对色域徽章就交付广色域 OKLCH,会产出一个在不同显示设备上看起来不同的颜色 —— 一个微妙但真实的跨平台一致性 bug。

✗ 错误
不核对 sRGB 色域就交付 oklch(0.7 0.4 30):
P3 显示渲染饱和红;sRGB 显示渲染去饱和
品牌色在用户硬件之间看起来不一致。
✓ 正确
核对 sRGB 色域徽章,必要时 Snap to sRGB,通过 @supports 分层:
@supports (color: oklch(0 0 0)) { --primary: oklch(0.7 0.4 30); }
@supports not (color: oklch(0 0 0)) { --primary: #ef6b50; }
P3 硬件拿到广色域值;sRGB 硬件拿到 snap 后的兜底。

缺少 oklch() 的浏览器支持

原生 `oklch()` 解析在 Chrome 与 Edge 111(2023 年 3 月)、Safari 15.4(2022 年 3 月)、Firefox 113(2023 年 5 月)中落地。caniuse 综合覆盖率超过 94%,但剩下的 6% 包括 IE 11、iOS 15.3 或更早的旧版 Safari、旧版 Android Chrome,以及内嵌 webview。对面向广泛受众的生产站点,直接交付 `oklch()` 而不带兜底,会渲染为 CSS 的 `inherit` 值或完全失败。请始终用 `@supports` 做特性检测。

✗ 错误
只用 OKLCH 定义品牌色:
:root { --primary: oklch(0.629 0.193 263.4); }
IE 11 与旧版 iOS Safari 完全不渲染颜色。
✓ 正确
通过 @supports 分层实现优雅降级:
:root { --primary: #3b82f6; }
@supports (color: oklch(0 0 0)) { :root { --primary: oklch(0.629 0.193 263.4); } }
现代浏览器拿到 OKLCH;遗留浏览器拿到 HEX 兜底。

把 OKLCH 与 LCH(CIE-LAB 极坐标)搞混

CSS Color 4 同时提供 `oklch()` 与 `lch()`。两者形态一致(L / C / H),但使用的底层空间不同:`lch()` 是 CIE-LAB(1976)的极坐标形式,`oklch()` 是 OKLAB(Ottosson 2020)的极坐标形式。两者**不可互换** —— `lch(60% 50 240)` 与 `oklch(0.6 0.15 240)` 描述的是不同的颜色。CIE-LAB 的感知均匀性在饱和蓝附近会失效,这正是 Ottosson 重新派生 OKLAB 的原因。新设计系统工作中,优先 `oklch()` 而不是 `lch()`。

✗ 错误
用 lch() 代替 oklch() 期望同样的结果:
lch(60% 50 240) ≠ oklch(0.6 0.15 240) —— 完全不同的颜色
跨空间复制粘贴时,值就这样悄悄错了。
✓ 正确
选一个空间,留在里面:
oklch(0.629 0.193 263.4) 用于现代设计系统
或 lch(60% 50 240) —— 但不要在不重新转换的情况下直接换函数名

谁在使用 HEX 转 OKLCH

前端开发者迁移到 Tailwind v4 OKLCH token
Tailwind v4 在 2025 年 1 月为其默认调色板统一采用 OKLCH。迁移一个使用基于 HEX 品牌色的 v3 代码库,意味着把每个 HEX 转成 OKLCH 并把结果放进新的 `@theme` 块。把每个 HEX 粘到这里,复制 `oklch()` 值,定义 `--color-primary: oklch(0.629 0.193 263.4)` 及其同伴。实时色域徽章会标出任何超出 sRGB 的颜色,您可以决定为 Display P3 用户保留广色域值,还是收进 sRGB。
shadcn/ui 主题作者构建自定义调色板
shadcn/ui 的 CSS 变量主题对每个 token(`--background`、`--foreground`、`--primary` 等)都使用 OKLCH。自定义主题从一个基础品牌 HEX 派生,先转成 OKLCH,然后扫描 L 得到亮/暗变体。粘贴品牌 HEX,读出 OKLCH 三元组,在保持 C 与 H 固定的同时扫描 L 把主题其余部分构出来。与规范的 shadcn 工作流完全匹配。
设计系统作者生成感知均匀的色阶
通过在 OKLCH 上以等增量扫描 L 通道、保持 C 与 H 固定,生成 50/100/200/…/900 色阶。相邻档之间的视觉间隔在所有色相上一致 —— 品牌色调色板真正需要的就是这个。Tailwind v4 的默认调色板正是用这种构造,shadcn/ui 也照搬。粘贴每一个品牌 HEX,读出 OKLCH,通过算法或取色器下方的「浅色 / 深色 / 灰调」面板生成色阶。
无障碍工程师在 OKLCH 空间核验对比度
WCAG 2.1 与 APCA 对比度都以解析后的 sRGB 颜色计分,而不是 OKLCH 三元组 —— 但知道一个品牌色的 OKLCH L 让对比度调整更可预测:L 上调 0.1 即可对白通过 AA,L 下调 0.1 即可对黑通过 AA。同屏的 OKLCH + WCAG + APCA 视图让这种关系一目了然。粘贴品牌 HEX,观察对比度徽章,在 OKLCH 中调整 L(比 HSL 更可预测),直到这一配对在两个指标上都通过。
为现代显示设备构建广色域颜色 token 的 Web 开发者
多数 Apple 设备自 2017 年起(以及许多现代 Android 设备)原生渲染 Display P3。把品牌强调色定义在 OKLCH 上,让您可以表达 HEX 编码不了的、仅 P3 才有的高饱和度红与绿。粘贴现有 HEX 读出其 OKLCH,然后把 C 通道推到 sRGB 上限之上,获得额外的 P3 饱和度。色域徽章确认新值能落进 P3(在仅 sRGB 屏幕上通过浏览器色度压缩优雅降级)。
讲授「感知亮度 vs 几何亮度」的教育者
同屏的 OKLCH + HSL 视图让「感知亮度与几何亮度」的区别一目了然。粘一个饱和绿与一个饱和蓝,两者在 HSL 上同处 L=50%;它们的 OKLCH L 值会明显不同,因为 OKLCH 测量的是真实的感知亮度。拖动 HSL 色相滑块,观察 OKLCH 的 L 在您保持 HSL L 不变时如何波动 —— 那条曲线就是 gamma 怪癖的可视化。一个适合课堂演示的、说明设计系统为什么迁到 OKLCH 的例子。
开源维护者现代化 token 文档
较老的设计系统文档通常只列 HEX 代码作为品牌色。现代化到 OKLCH 意味着同时展示两种空间下的同一颜色 —— HEX 用于代码块兼容,OKLCH 用于规范表与现代 token 定义。把每个 HEX 粘进来,复制 OKLCH 输出,更新文档。可分享的 URL 哈希也让贡献者能在 GitHub issue 中无歧义地链接到讨论中那一确切颜色。

HEX 转 OKLCH 的数学与流水线

HEX → OKLCH 是 7 步流水线
转换会经过 5 个中间表示:HEX → 整数 sRGB → 归一化 sRGB(0–1) → 线性 sRGB(gamma 解码) → CIE XYZ D65 → OKLAB → OKLCH。每一步都是来自主要来源、定义良好的矩阵或分段函数。工具在每次按键时跑完整流水线;数学足够快(微秒级),无需防抖。在 OKLCH 旁同屏展示中间的 RGB 三元组,让您可以通过观察 RGB 通道来调试一个意料之外的 OKLCH 值。
CSS Color 4 §11.2 Gamma 函数
sRGB → 线性 sRGB 的转换使用 CSS Color 4 §11.2 的分段函数:`v ≤ 0.04045 ? v/12.92 : ((v + 0.055) / 1.055)^2.4`。分段形式(在接近零处带一段小的线性段)避免了纯指数形式在很暗颜色上的数值不稳定。这是 ICC 配置文件用于编码 sRGB 的同一函数,也是浏览器在渲染 HEX 代码时内部使用的同一函数。OKLCH → HEX 的逆向应用相同函数的反函数:`v ≤ 0.0031308 ? v * 12.92 : 1.055 * v^(1/2.4) - 0.055`。
CSS Color 4 §15.1 矩阵:线性 sRGB ↔ XYZ D65
CSS Color 4 §15.1 的矩阵把线性 sRGB 在 D65 白点下转换到 CIE XYZ:`X = 0.4124564 R + 0.3575761 G + 0.1804375 B`、`Y = 0.2126729 R + 0.7151522 G + 0.0721750 B`、`Z = 0.0193339 R + 0.1191920 G + 0.9503041 B`。Y 行给出 sRGB 的相对发光强度公式。这套矩阵就是每个色彩管理库 —— 包括 ICC、Adobe Color Engine 与开源的 LCMS 流水线 —— 使用的同一套矩阵。OKLCH → HEX 反向应用 §15.1 的逆矩阵。
Ottosson 2020 OKLAB 矩阵与立方根步骤
XYZ D65 → OKLAB 的转换使用 Björn Ottosson 2020 年 OKLAB 论文中公布的两个矩阵与一个立方根步骤。第一个矩阵把 XYZ 变换到一个 LMS 锥响应空间(松散建模人眼 L/M/S 锥灵敏度)。对每个通道取立方根以非线性地压缩动态范围(感知均匀性的修正步骤)。第二个矩阵把立方根化后的 LMS 变换到 OKLAB 的 L/a/b 坐标。三项操作都使用论文参考实现中公布的精确值;不做重新推导,不做四舍五入。OKLCH → HEX 反向应用这些矩阵的反矩阵。
OKLAB ↔ OKLCH 是笛卡尔到极坐标
OKLAB 的 `a` 与 `b` 轴构成一个与 L 轴正交的色度平面。OKLCH 用极坐标编码这个平面:`C = sqrt(a² + b²)`(到灰色的欧式距离)、`H = atan2(b, a) * 180 / π`(角度,单位为度,包到 0–360°)。反向:`a = C * cos(H * π / 180)`、`b = C * sin(H * π / 180)`。极坐标形式比 OKLAB 更适合设计 token 存储,因为色相 Hue 是一个稳定的轴 —— 旋转色相不会像在 OKLAB 中旋转 `a` 或 `b` 那样意外地穿过灰色淡入淡出。
色域检测:通道范围检查
一个颜色被认为在目标空间(sRGB、Display P3、Rec.2020)内,当且仅当转换到该空间原色后,每一通道都落在 `[-ε, 1 + ε]` 内,其中 `ε = 1e-7`,以吸收边界附近的浮点精度噪声。任何一通道超出范围时,该空间的色域徽章变红。OKLCH 在色域上无上界 —— `oklch(0.7 0.4 30)` 是一个合法坐标,但可能超出 sRGB 的每通道 256 字节空间。检查在每次按键时运行;结合 Snap to sRGB,这个组合抓住了最常见的落地坑(广色域 OKLCH 在传统屏幕上显示不正确)。
Snap-to-sRGB 二分色度收缩
Snap to sRGB 与 CSS Color 4 §13 的非规范性色域映射算法匹配:把 L 与 H 固定在当前值,在 C ∈ [0, currentC] 上做二分搜索,找到使其 sRGB 转换仍在色域内的最大 C。搜索至多 30 次迭代(精度约 10⁻⁹),对视觉准确性来说绰绰有余。保留 L 与 H 意味着 snap 后的颜色读起来仍是同一个色相家族、同样的感知亮度 —— 它只丢饱和度。我们不直接裁剪 RGB 通道,因为那会明显扭曲色相(尤其是蓝色,会向紫色裁剪)。

HEX / OKLCH 工作流最佳实践

在新代码中以 OKLCH 作为规范 token 格式
对任何在 2025 年及以后交付的设计系统,以 OKLCH 定义品牌色与调色板色阶。L 轴自动给出感知均匀色阶;色度轴能表达 HEX 编码不了的广色域颜色。通过 `@supports not (color: oklch(0 0 0))` 或构建期 PostCSS 为较老浏览器保留 HEX 兜底,但在您的 token 仓里以 OKLCH 作为事实源。Tailwind v4 与 shadcn/ui 都按这种方式交付;新项目可以无障碍地照搬。
扫 L、固定 C 与 H,生成色阶
规范的 OKLCH 色阶构造:锁定 C 与 H,以等增量扫 L。一份 9 步色阶 `oklch(L 0.15 263)`,L = 0.1、0.2、…、0.9,产出视觉均匀间距,每一档都是。Tailwind v4 内部正是这样做。除非您刻意想让色阶的色度强度变化(罕见),否则不要在扫 L 的同时扫 C。不要在不同档之间漂移 H —— 哪怕只是 5° 的漂移也会让色阶感觉错乱。
匹配 Tailwind v4 的精度:L 与 C 三位小数、H 一位小数
Tailwind v4 默认调色板公布的 OKLCH 值在 L 与 C 上取三位小数,在 H 上取一位小数 —— blue-500 即 `oklch(0.629 0.193 263.4)`。在您自己的 token 中匹配这一精度,意味着粘进配置的工作流产出与 Tailwind 默认完全一致的值,diff 工具不会标出虚假差异。工具的默认舍入遵循这一约定;粘进 `@theme` 块比特精确。
用 Display P3 色域检查跑一遍广色域 OKLCH
如果您面向现代 Apple 硬件(2017 年及以后的 iPhone、iPad、MacBook)或交付 HDR 感知内容,色域徽章让您可以把 C 推到 sRGB 上限之上,获得额外的 P3 饱和度。浏览器内置的色度压缩会防止颜色在仅 sRGB 屏幕上裁剪。除非您确知整批受众都在传统显示设备上,否则不要默认预先 snap 到 sRGB —— 那会丢掉 P3 硬件能渲染的 30%+ 饱和度。
通过 @supports 为 2023 年之前的浏览器提供 HEX 兜底
尽管常青浏览器对 `oklch()` 的支持现在已达 94%+,长尾(IE 11、旧版 Android Chrome、内嵌 webview)仍需要兜底。把 token 包在 `@supports (color: oklch(0 0 0))` 里,在另一分支给出 HEX 变体。Snap to sRGB 的输出正是那个兜底 —— 由当前 OKLCH 三元组在保留 L 与 H 的前提下自动生成。构建期的 PostCSS 插件,如 `postcss-oklab-function`,也可以在编译时把 sRGB 近似内联进来。
在 token 中同时记录 OKLCH 与源 HEX
当您交付一个 CSS 变量 `--color-primary: oklch(0.629 0.193 263.4)` 时,在注释里附上源 HEX:`/* source: #3b82f6 (Tailwind blue-500) */`。半年后,当有人需要派生相近色阶或对照品牌指南 PDF 核值时,源 HEX 保留了完整的来源信息。OKLCH 单独看是有意义的,但更难一眼辨认;源 HEX 才是大多数队友会先去查的标识。
用 URL 哈希分享实时的颜色决策
每次颜色变更都会自动把 URL 哈希更新为 `#hex=3b82f6` 或 `#oklch=...`。把 URL 复制进 Slack 线程或 GitHub issue,打开它的人会落在同样的颜色、同样的 OKLCH 三元组上。这比在聊天里粘贴一个 OKLCH 字符串更可靠 —— 收件人偶尔会打错小数,或包错精度 —— 也让设计评审讨论可以指向某一确切颜色,而不是「上周二聊过的那个品牌蓝」。哈希永远不会传到服务器。

常见问题

什么是 OKLCH 颜色?
OKLCH 是 OKLAB 的极坐标形式,OKLAB 是 Björn Ottosson 于 2020 年发布的感知均匀色彩空间。三个通道是:感知亮度 Lightness(0–1,也可写成 0–100%)、色度 Chroma(0 到大约 0.4,依色相与 L 而变,上无硬上限)、色相 Hue(0–360°,概念上与 HSL 的色相完全一致)。它通过 LMS 锥细胞响应阶段加一次立方根步骤从 CIE-LAB 派生而来。CSS Color 4 在 2022 年加入了 `oklch()` 语法。Tailwind v4 在 2025 年为其默认调色板统一采用 OKLCH。示例:`oklch(0.629 0.193 263.4)` 即 Tailwind blue-500。
OKLCH 比 HSL 好吗?
对设计系统来说,是的。HSL 的 L(感知亮度)是几何的 —— 由 RGB 最大值与最小值取平均而来,继承了 sRGB 的 gamma 曲线,因此 `hsl(60 100% 50%)`(黄)在视觉上明显比 `hsl(240 100% 50%)`(蓝)更亮,尽管两者都报 L=50%。OKLCH 的 L 是感知的,锚定在 Ottosson 2020 的 OKLAB 模型上。实际影响是:OKLCH 在 L 恒定时的色阶在每一种色相上看起来视觉均匀;HSL 色阶则需要逐色相手工调修才能看起来均匀。这正是 Tailwind v4 把默认调色板从基于 HSL 迁移到基于 OKLCH 生成的原因。
哪些浏览器支持 oklch()?
截至 2023 年中,所有常青浏览器都支持:Chrome 与 Edge 111(2023 年 3 月)、Safari 15.4(2022 年 3 月,最早落地)、Firefox 113(2023 年 5 月)。caniuse 综合覆盖率超过 94%。对于长尾部分 —— IE 11、旧版 Safari、跑老硬件的 Android Chrome —— 把 token 包在 `@supports (color: oklch(0 0 0))` 中,并在另一分支提供 HEX 或 `hsl()` 兜底。构建期工具,如 PostCSS 的 `postcss-oklab-function`,也可以在编译时把 sRGB 近似与 OKLCH 值一并内联输出。
为什么要在 Tailwind v4 中用 OKLCH?
Tailwind v4(2025 年 1 月发布)把默认调色板从基于 HSL 迁到基于 OKLCH 生成,正是因为 OKLCH 能自动给出感知均匀的色阶。在 v3 的 HSL 体系下,`red-500` 与 `blue-500` 在 HSL L% 相同的情况下感知权重明显不同,设计师不得不手工微调每一档;在 v4 中,两者看起来均衡,因为都坐在同一个 OKLCH L 上。OKLCH 还解锁了 HEX 编码不了的 Display P3 广色域颜色 —— 像 `oklch(0.65 0.25 30)` 这样的 Tailwind v4 token 可以表达超出 sRGB 的 P3 红色。构建仍会为较老浏览器输出 HEX 兜底。
OKLCH 真的是感知均匀的吗?
是的 —— 这正是设计意图。OKLCH 从 OKLAB 继承感知均匀性,而 OKLAB 是 Björn Ottosson 在 2020 年专门设计的色彩空间,用于修复 CIE-LAB(此前最佳的感知均匀空间)中的非均匀问题。L 通道的固定步长对应固定的感知亮度差。C 的固定步长对应固定的感知色度差。CIE-LAB 的近似在饱和度极高的颜色附近会失效;OKLAB 与其极坐标形式 OKLCH 在整个色域上都保持准确,这就是为什么每一个现代设计系统工具(Tailwind v4、shadcn/ui、Radix Colors v3)都统一采用它。
怎么读一个 OKLCH 值?
`oklch(L C H)` —— 三个数字,可选加 `/ A` 表示 alpha。L 是感知亮度,0(黑)到 1(白);数字形式与百分比形式等价(`0.6` 等于 `60%`)。C 是色度,从 0(灰)到 sRGB 中最饱和颜色的约 0.4;没有硬上限,广色域颜色可以超过。H 是色相,以度为单位 0 到 360,和 HSL 一样(0/360 = 红、120 = 绿、240 = 蓝)。示例:`oklch(0.629 0.193 263.4)` 是 Tailwind blue-500 —— 明亮、色度高、坐在蓝色弧段上。
OKLCH 与 LCH 的区别是什么?
两者都是 CIE-LAB 家族色彩空间的极坐标形式(感知亮度 / 色度 / 色相)。LCH 是 1976 年 CIE-LAB(那一代感知均匀空间)的极坐标形式。OKLCH 是 Ottosson 2020 年版 OKLAB 的极坐标形式。差别在于:CIE-LAB 的感知均匀性在高饱和度的蓝与紫附近会失效(模型中有文档记录的弱点),所以 LCH 在饱和颜色上的色阶看起来会有微妙的不均。OKLAB 通过从修正过的 LMS 锥响应阶段重新推导矩阵来修复这一点。两者都在 CSS Color 4 中提供(`lch()` 与 `oklch()` 语法);2025 年的新设计系统工作,优先选 OKLCH。
怎么把 HEX 转成 OKLCH?
流水线是:把 HEX `#RRGGBB` 通过 `parseInt(hex, 16)` 解析成 sRGB 整数通道,归一化到 0–1,通过 CSS Color 4 §11.2 分段函数做 gamma 解码得到线性 sRGB,乘以 §15.1 矩阵得到 CIE XYZ D65,乘以 Ottosson 的 LMS 矩阵并对每个通道取立方根,乘以 Ottosson 的 OKLAB 矩阵得到 L/a/b,再做笛卡尔到极坐标变换:`C = sqrt(a² + b²); H = atan2(b, a) * 180 / π`。整套流水线在微秒级运行。本工具在您输入时实时跑这套流水线 —— `#3b82f6` 即时变成 `oklch(0.629 0.193 263.4)`。