开发中经常需要在 JavaScript 中使用颜色,而想高效处理这些,又需要对颜色格式和转换有一定的了解。本文总结了 13 个代码片段,可以满足大部分日常的需求,从随机生成十六进制的颜色,到在十六进制和 RGB 值之间转换,甚至一些更高级的技巧,比如使用 HSL 格式来改变颜色的亮度等。
随机生成十六进制颜色 1 2 3 4 5 6 7 8 const randomHexColorCode = ( ) => { let n = (Math .random () * 0xfffff * 1000000 ).toString (16 ); return "#" + n.slice (0 , 6 ); }; randomHexColorCode ();
RGB 转十六进制 1 2 3 4 5 6 const RGBToHex = (r, g, b ) => ((r << 16 ) + (g << 8 ) + b).toString (16 ).padStart (6 , "0" ); RGBToHex (255 , 165 , 1 );
十六进制转 RGB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 const hexToRGB = (hex ) => { let alpha = false , h = hex.slice (hex.startsWith ("#" ) ? 1 : 0 ); if (h.length === 3 ) h = [...h].map ((x ) => x + x).join ("" ); else if (h.length === 8 ) alpha = true ; h = parseInt (h, 16 ); return ( "rgb" + (alpha ? "a" : "" ) + "(" + (h >>> (alpha ? 24 : 16 )) + ", " + ((h & (alpha ? 0x00ff0000 : 0x00ff00 )) >>> (alpha ? 16 : 8 )) + ", " + ((h & (alpha ? 0x0000ff00 : 0x0000ff )) >>> (alpha ? 8 : 0 )) + (alpha ? `, ${h & 0x000000ff } ` : "" ) + ")" ); }; hexToRGB ("#27ae60ff" ); hexToRGB ("27ae60" ); hexToRGB ("#fff" );
将 3 位颜色扩展为 6 位颜色 1 2 3 4 5 6 7 8 9 10 11 12 const extendHex = (shortHex ) => "#" + shortHex .slice (shortHex.startsWith ("#" ) ? 1 : 0 ) .split ("" ) .map ((x ) => x + x) .join ("" ); extendHex ("#03f" ); extendHex ("05a" );
将 rgb()颜色字符串转换为具有每种颜色值的对象 1 2 3 4 5 6 7 8 const toRGBObject = (rgbStr ) => { const [red, green, blue] = rgbStr.match (/\d+/g ).map (Number ); return { red, green, blue }; }; toRGBObject ("rgb(255, 12, 0)" );
将 rgb()颜色字符串转换为数组 1 2 3 4 5 const toRGBArray = (rgbStr ) => rgbStr.match (/\d+/g ).map (Number );toRGBArray ("rgb(255, 12, 0)" );
将 RGB 颜色元组转换为 HSB 格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 const RGBToHSB = (r, g, b ) => { r /= 255 ; g /= 255 ; b /= 255 ; const v = Math .max (r, g, b), n = v - Math .min (r, g, b); const h = n === 0 ? 0 : n && v === r ? (g - b) / n : v === g ? 2 + (b - r) / n : 4 + (r - g) / n; return [60 * (h < 0 ? h + 6 : h), v && (n / v) * 100 , v * 100 ]; }; RGBToHSB (252 , 111 , 48 );
将 HSB 颜色元组转换为 RGB 格式 1 2 3 4 5 6 7 8 9 10 11 const HSBToRGB = (h, s, b ) => { s /= 100 ; b /= 100 ; const k = (n ) => (n + h / 60 ) % 6 ; const f = (n ) => b * (1 - s * Math .max (0 , Math .min (k (n), 4 - k (n), 1 ))); return [255 * f (5 ), 255 * f (3 ), 255 * f (1 )]; }; HSBToRGB (18 , 81 , 99 );
将 RGB 颜色元组转换为 HSL 格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 const RGBToHSL = (r, g, b ) => { r /= 255 ; g /= 255 ; b /= 255 ; const l = Math .max (r, g, b); const s = l - Math .min (r, g, b); const h = s ? l === r ? (g - b) / s : l === g ? 2 + (b - r) / s : 4 + (r - g) / s : 0 ; return [ 60 * h < 0 ? 60 * h + 360 : 60 * h, 100 * (s ? (l <= 0.5 ? s / (2 * l - s) : s / (2 - (2 * l - s))) : 0 ), (100 * (2 * l - s)) / 2 , ]; }; RGBToHSL (45 , 23 , 11 );
将 HSL 颜色元组转换为 RGB 格式 1 2 3 4 5 6 7 8 9 10 11 12 13 const HSLToRGB = (h, s, l ) => { s /= 100 ; l /= 100 ; const k = (n ) => (n + h / 30 ) % 12 ; const a = s * Math .min (l, 1 - l); const f = (n ) => l - a * Math .max (-1 , Math .min (k (n) - 3 , Math .min (9 - k (n), 1 ))); return [255 * f (0 ), 255 * f (8 ), 255 * f (4 )]; }; HSLToRGB (13 , 100 , 11 );
更改 hsl()颜色字符串的亮度值 1 2 3 4 5 6 7 8 9 10 11 12 13 const changeLightness = (delta, hslStr ) => { const [hue, saturation, lightness] = hslStr.match (/\d+/g ).map (Number ); const newLightness = Math .max ( 0 , Math .min (100 , lightness + parseFloat (delta)) ); return `hsl(${hue} , ${saturation} %, ${newLightness} %)` ; }; changeLightness (10 , "hsl(330, 50%, 50%)" ); changeLightness (-10 , "hsl(330, 50%, 50%)" );
将 hsl()颜色字符串转换为值数组 1 2 3 4 5 const toHSLArray = (hslStr ) => hslStr.match (/\d+/g ).map (Number );toHSLArray ("hsl(50, 10%, 10%)" );
将 hsl()颜色字符串转换为具有每种颜色值的对象 1 2 3 4 5 6 7 8 const toHSLObject = (hslStr ) => { const [hue, saturation, lightness] = hslStr.match (/\d+/g ).map (Number ); return { hue, saturation, lightness }; }; toHSLObject ("hsl(50, 10%, 10%)" );