RGB字符串转十六进制需三步:正则提取数值→Math.round()并clamp至0–255→padStart(2,"0")补零后转小写,如rgb(255, 0, 128)→#ff0080。
rgb() 字符串不能直接当 CSS 颜色值用在 color 或 background 里——它本身就是合法 CSS 值,无需“转换”。真正要做的,是把 rgb(255, 0, 128) 这类字符串解析成 #ff0080 这样的六位小写十六进制字符串。这不是浏览器行为,而是你在 JS 里做数据处理时的常见需求。
rgb() 输入格式千奇百怪:可能带空格、换行、多余逗号,甚至有浮点数或负数(如 rgb(255.4, -10, 300))。别用 split(",")。- 必须用正则提取:/rgb((d+.?d*),s*(d+.?d*),s*(d+.?d*))/i,它能匹配整数和小数- 提取后对每个值调用 Math.round(parseFloat(val)),再用 Math.min(255, Math.max(0, n)) 截断到 0–255- 若匹配失败(比如输入是 rgba(255,0,128,0.5) 或 #ff0080),应提前返回原值或报错,不强行解析17.toString(16) 得 "11",没问题;但 0.toString(16) 是 "0",10.toString(16) 是 "a"——长度不对,大小写也不统一。- 每个通道必须严格两位:用 String(n).padStart(2, "0") 补零(ES2017+)- 补零后统一转小写:.toLowerCase(),因为设计系统、Git diff、PostCSS 插件都依赖小写约定- 错误示例:rgb(0, 17, 255) → 若漏补零,可能产出 "011ff"(5位),浏览器会当作无效颜色忽略rgba() 不是 rgb() 的超集,alpha 通道不能丢弃或硬塞进六位 HEX。- 明确需求:只要主色?那就只取前三个数字,按 RGB 流程走,忽略第四个参数- 要保留透明度?不要转八位 #rrggbbaa,除非你确认目标环境支持(iOS Safari 16.4+ 才稳定支持,IE 完全不认)- 输入已是 #abc 或 #ffffff?先用正则 /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/ 判断,匹配即直接返回,不进转换逻辑真正容易被忽略的点,是把「字符串清洗」和「数值校验」当成可选步骤。一个没校验的 rgb(999, -50, 1e3) 会悄悄产出 #fc0000,而不是报错或 fallback。