根本原因是浏览器默认色彩空间不同:Safari/iOS用display-p3(色域更广),Chrome桌面版用sRGB,导致同一十六进制色值如#ff6b6b在不同浏览器中呈现差异;应使用color()函数显式指定色彩空间并配回退值。

为什么CSS颜色在Chrome和Safari里看起来不一样
根本原因不是浏览器“乱来”,而是默认色彩空间不同:display-p3(Safari/iOS默认支持)比sRGB色域更广,同一组rgb()或十六进制值,在开启P3的设备上会映射到更鲜艳的物理像素。Chrome桌面版默认仍走sRGB,结果就是——你写的#ff6b6b在Mac Safari里偏粉,在Windows Chrome里偏橙。
用color()函数显式指定色彩空间
现代CSS支持color()函数,能强制把颜色锚定在某个色彩空间里,避免浏览器自行猜测:
-
color(display-p3 1 0.42 0.42):明确按P3色域解释,适合需要高饱和红/绿的设计(如iOS App图标风格) -
color(srgb 1 0.42 0.42):强制走sRGB,跨浏览器最稳,但会损失P3设备的色域优势 - 别写
color(display-p3 #ff6b6b)——语法错误,color()不接受十六进制参数
必须给color()加回退值
Firefox 119之前、所有IE、旧版Edge都不认识color(),直接忽略整条声明。不加回退=颜色消失:
button {
background-color: #ff6b6b; /* 所有浏览器都认 */
background-color: color(srgb 1 0.42 0.42); /* 新浏览器覆盖上面那行 */
}
注意顺序:老写法在前,新写法在后。CSS会按顺序尝试,遇到不认识的就跳过,继续往下读。
十六进制值本身没有“标准”——它隐含sRGB
#ff6b6b这种写法从来就不是“无色彩空间”的纯数字,W3C规范明确定义它等价于rgb(255, 107, 107),而rgb()默认绑定sRGB。所以它天然不适合P3屏幕的精准还原。想兼顾?要么接受sRGB为基准(最稳妥),要么用color(display-p3 ...)配好回退,别指望一个十六进制值自己“聪明适配”。
真要压精度,连color(srgb ...)都可能被旧浏览器当无效值丢掉——这时候#ff6b6b反而是最不可靠的“兼容写法”,因为它的表现反而最不一致。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











