为什么我的 Tailwind CSS v4 颜色消失了?—— 聊聊 OKLCH 与浏览器兼容性坑

0 阅读1分钟

案发现场

现象描述

最近在项目中使用了 Tailwind CSS v4 默认类名(如 .bg-gray-400),检查元素发现 CSS 属性 background-color: var(--color-gray-400) 已生效,但页面无颜色展示。

诡异点

控制台 Styles 面板中,该变量左侧没有出现颜色预览小方块。

  • 正常情况(注意:颜色预览小方块显示)

image.png

  • 非正常情况

image.png

逻辑推理

  1. 观察变量值。.text-white 和 .bg-gray-500引用的变量不同,既然这样,看下这俩变量有何不同? image.png

    猜想: 会不会是oklch()这个函数导致的问题?

  2. 验证猜想。将oklch函数定义的颜色值,更改为--color-white变量格式的颜色值,如:#f00。 image.png

    此时发现,背景色生效了,颜色预览也正常了。

    image.png

  3. 质疑语法规范。oklch() 函数兼容问题?浏览器不支持是否支持oklch() 函数?

问题原因

经过资料查询和排查发现,当前我用的是 Tailwind CSS v4(它默认全量使用 OKLCH)。而 oklch() 是 CSS Color Level 4 引入的新函数, Chrome 111 (2023年3月) 才是支持 OKLCH 的起点。我本地 Chrome 版本为 109,显然不支持 oklch函数。

image.png

参考文章:

  1. oklch() - CSS:层叠样式表 | MDN (mozilla.org)

解决方案

  1. (个人开发)升级 Chrome 浏览器版本;
  2. (生产环境)配置 Lightning CSS 或 PostCSS (postcss-preset-env)  进行色彩空间降级,将 oklch 自动转换为 rgb;
  3. (手动兼容)在 CSS 的 @theme 块中通过 Hex 手动覆盖核心变量;

更多思考

  1. 为什么要从 RGB/HSL 转向 OKLCH?OKLCH 有什么作用?