只有每组两位十六进制数完全相同时(如#ff6600→#f60),#rrggbb才能无损缩写为#rgb;否则会因解析错误导致色值偏差、可访问性失败或自动化流程隐性失效。

#rgb 缩写本身不造成精度损失——但**误用缩写**会。
真正出问题的,是把本不该缩写的六位值强行压成三位,或者把三位写法当成“高位补零”来理解。浏览器不会报错,它会按规则硬解析,结果却和你脑内预期完全不符。
哪些 #rrggbb 值能安全缩写为 #rgb
只有当每组两位十六进制数完全相同时,才可无损缩写:
-
#ff6600 → 可缩为 #f60(因为 ff、66、00 都是双同字符)
-
#aabbcc → 可缩为 #abc
-
#000000、#ffffff、#333333 等全重复值都 OK
-
#fe0123 → 不可缩(fe ≠ ff 或 ee,01 ≠ 00 或 11)
一旦缩写条件不满足,CSS 解析器会直接丢弃该声明(部分旧引擎可能静默忽略),或按错误规则展开——比如把
#8b4 当作
#88bb44,而设计稿给的是
#8b4513,差得离谱。
#999 不等于 #909090:单字复制不是补零
这是最常踩的坑:
-
#999 展开为 #999999(R=G=B=153)
-
#909090 是 R=G=B=144 的中灰
-
#f0a → #ff00aa,不是 #f000aa,也不是 #fa00aa
肉眼难分,但色值偏差达 9 个单位;在深色模式适配、对比度自动检测(如 axe-core)、色盲模拟工具中,这种偏差可能直接导致可访问性失败。
缩写在协作与自动化流程中隐性失效
- Git diff 里
#333 和 #333333 看似一样,但前者是简写,后者是完整值;如果某人手抖把 #333334 改成 #334,实际变成 #333344,视觉几乎看不出,却已偏离原设计
- CSS 预处理器(Sass/Less)默认不展开三位写法,输出仍是
#fff;但 JS 里调用 getComputedStyle(el).color 返回的是 rgb(255, 255, 255),原始写法信息彻底丢失
- 压缩工具(如 cssnano)只对合规缩写做转换,不会校验你手动写的
#8b4 是否合法——它照单全收,然后渲染出错色
缩写省下的那 3 个字符,换来的可能是设计还原偏差、自动化检测误报、Code Review 时反复 mentally 展开确认。真要缩,就严格按
RRGGGBB 三组各自重复的规则来;否则,老老实实写六位。