三位十六进制颜色码转六位的正确方法是将每位字符原样复制一次:#f06→#ff0066、#abc→#aabbcc、#999→#999999;错误做法包括补零、十进制运算或错位复制;所有三位写法语法合法,但仅当源自可简写的六位值时才语义正确;js中应使用正则匹配+字符重复实现,避免数学推导。

直接复制每位字符扩展成两位即可,不需要查表或调用函数——浏览器本身就这么解析,你手动还原时也该照此规则做。
三位缩写怎么转成六位?
不是“补零”,也不是“按十进制算”,而是把每一位原样复制一次:
-
#f06→#ff0066(f→ff,0→00,6→66) -
#abc→#aabbcc(a→aa,b→bb,c→cc) -
#999→#999999,不是#909090或#99999
常见错误是误以为 #f0a 可以变成 #f000aa 或 #fa00aa,这两种都错。只有严格按“单字复制”才对。
哪些三位写法不能乱扩?
所有三位写法在语法上都合法,但前提是它原本就来自可简写的六位值。如果设计稿给的是 #8b4513,你手抖写成 #8b4,浏览器会把它当 #88bb44 解析——红绿蓝全偏了。
- ✅ 可安全缩写再扩回:
#ff6600→#f60→#ff6600 - ❌ 不可缩写却硬缩:
#fe0123不能写成#fe1,因为fe≠ff且01≠00或11 - ⚠️ Git diff 看不出差异:
#333和#333333在视觉上几乎一样,但数值差 9,自动化对比工具可能漏掉
JS里怎么可靠地做转换?
正则匹配 + 字符重复是最稳的方式,别用 parseInt 后再乘 17 这类数学推导(容易浮点误差):
function hex3to6(hex) {
const m = /^#?([a-f\d])([a-f\d])([a-f\d])$/i.exec(hex);
if (!m) return null;
return '#' + m[1] + m[1] + m[2] + m[2] + m[3] + m[3];
}
// hex3to6('#f0a') → '#ff00aa'
注意:m[3] + m[3] 别写成 m[2] + m[2]——第三位是蓝色,抄错位置颜色就废了。
最易被忽略的点:三位写法只是语法糖,不改变色值,但会掩盖原始意图。你在主题变量里写 --primary: #007bff,比写 --primary: #07f 更利于后续调试、生成色阶、对接设计系统。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











