linear-gradient不支持in srgb语法,浏览器默认用sRGB线性插值导致中间色偏暗;真正支持in srgb的是color-mix()和color()函数;改善过渡需改用lch()/oklch()或预设RGB中间色。

不是in srgb导致变暗,而是你根本没写in srgb——浏览器默认就在sRGB空间插值,所谓“指定in srgb”在渐变里压根不合法,CSS语法不支持。
linear-gradient里根本没有in srgb语法
CSS渐变函数linear-gradient()不接受色彩空间声明。你写的linear-gradient(to right, #ff6b6b, #4ecdc4)或linear-gradient(to right, rgb(255 107 107), rgb(78 205 196)),浏览器内部一律按sRGB坐标做线性插值,不存在“显式启用sRGB”这回事。
真正能写in srgb的地方只有color-mix()和color()函数:
-
color-mix(in srgb, red 50%, blue 50%)—— 合法,但意义不大(本来就是默认) -
color(srgb 1 0.4 0.3)—— 合法,用于显式定义sRGB色值(注意是0–1归一化) -
linear-gradient(in srgb, ...)—— 语法错误,会被整个忽略或降级为第一个颜色
你以为的“变暗”其实是sRGB插值固有缺陷
从#ff0000到#0000ff中间帧算出来是rgb(128, 0, 128),这个值在sRGB下实际亮度偏低,人眼看着发灰、偏暗。这不是“用了sRGB才暗”,而是“所有浏览器都用sRGB,所以都暗”。
立即学习“前端免费学习笔记(深入)”;
常见误判场景:
- 把Figma里预览的LAB/HSL感知均匀预览,当成网页该有的效果
- 对比Chrome(走sRGB)和Safari(有时误走Display P3),发现后者反而更亮,就以为“sRGB=暗”,其实只是P3映射绕过了gamma压缩
- 用
hsl(0, 100%, 50%) → hsl(240, 100%, 50%),结果过渡跳色、中间发绿,误以为是亮度问题,实则是HSL空间本身不均匀
真想解决暗淡感,得换空间,不是加srgb
要改善视觉过渡,必须脱离sRGB线性插值,但不能靠虚构语法:
- 用
lch()或oklch()写关键帧:background-color: lch(50% 80 30);→lch(50% 80 270);,前提是Chrome 112+/Safari 16.4+ - 用
color-mix(in lch, ...)生成中间色,再手动塞进linear-gradient()的stop列表里 - 降级方案:预设5–7个
rgb()中间色,用百分比精确控制停靠点,绕过浏览器插值
alpha通道永远独立线性插值,哪怕你用了oklch(),透明度变化还是生硬——这点容易漏掉,得单独调。


















