What is the most efficient way to parse a CSS color in JavaScript?

后端 未结 9 1894
甜味超标
甜味超标 2020-12-06 04:36

Given a string of a valid CSS color value:

  • #fff
  • #ffffff
  • white
  • rgb(255, 255, 255)

Need to get an array of numbers of t

9条回答
  •  离开以前
    2020-12-06 04:55

    // This will return a [red.green,blue] decimal array for the samples you posted, plus rgb percentages.

    // It ignores transparency, hsl and the extended set of color names most browsers support:

    function getRgb(c){
        c= c.toLowerCase();
        if (/^[a-z]+$/.test(c)){
            var colornames={
                aqua:'#00ffff', black:'#000000', blue:'#0000ff', fuchsia:'#ff00ff',
                gray:'#808080', green:'#008000', lime:'#00ff00', maroon:'#800000',
                navy:'#000080', olive:'#808000', orange:'#ffa500', purple:'#800080',
                red:'#ff0000', silver:'#c0c0c0', teal:'#008080', white:'#ffffff',
                yellow:'#ffff00'
            }
            c= colornames[c];
        }
        if(/^#([a-f0-9]{3}){1,2}$/.test(c)){
            if(c.length== 4){
                c= '#'+[c[1], c[1], c[2], c[2], c[3], c[3]].join('');
            }
            c= '0x'+c.substring(1);
            return [(c>>16)&255, (c>>8)&255, c&255];
        }
        else if(c.indexOf('rgb')== 0){
            c= c.match(/\d+(\.\d+)?%?/g);
            if(c){
                for(var i= 0;i<3;i++){
                    if(c[i].indexOf('%')!= -1){
                             c[i]= Math.round(parseFloat(c[i])*2.55);
                        }
                    if(c[i]<0) c[i]= 0;
                    if(c[i]>255) c[i]= 255;
                }
                return c;
            }
        }
    }
    

    //This version will return a [red.green,blue] decimal array for most color strings, ignoring transparency.

    function getRgb2(c){
        c= c.toLowerCase();
        var colornames={
            aliceblue:'#f0f8ff', antiquewhite:'#faebd7', aqua:'#00ffff',
            aquamarine:'#7fffd4', azure:'#f0ffff', beige:'#f5f5dc',
            bisque:'#ffe4c4', black:'#000000', blanchedalmond:'#ffebcd',
            blue:'#0000ff', blueviolet:'#8a2be2', brown:'#a52a2a',
            burlywood:'#deb887', cadetblue:'#5f9ea0', chartreuse:'#7fff00',
            chocolate:'#d2691e', coral:'#ff7f50', cornflowerblue:'#6495ed',
            cornsilk:'#fff8dc', crimson:'#dc143c', cyan:'#00ffff',
            darkblue:'#00008b', darkcyan:'#008b8b', darkgoldenrod:'#b8860b',
            darkgray:'#a9a9a9', darkgreen:'#006400', darkkhaki:'#bdb76b',
            darkmagenta:'#8b008b', darkolivegreen:'#556b2f', darkorange:'#ff8c00',
            darkorchid:'#9932cc', darkred:'#8b0000', darksalmon:'#e9967a',
            darkseagreen:'#8fbc8f', darkslateblue:'#483d8b', darkslategray:'#2f4f4f',
            darkturquoise:'#00ced1', darkviolet:'#9400d3', deeppink:'#ff1493',
            deepskyblue:'#00bfff', dimgray:'#696969', dodgerblue:'#1e90ff',
            firebrick:'#b22222', floralwhite:'#fffaf0',
            forestgreen:'#228b22', fuchsia:'#ff00ff', gainsboro:'#dcdcdc',
            ghostwhite:'#f8f8ff', gold:'#ffd700', goldenrod:'#daa520', gray:'#808080',
            green:'#008000', greenyellow:'#adff2f', honeydew:'#f0fff0',
            hotpink:'#ff69b4', indianred:'#cd5c5c', indigo:'#4b0082',
            ivory:'#fffff0', khaki:'#f0e68c', lavender:'#e6e6fa',
            lavenderblush:'#fff0f5', lawngreen:'#7cfc00', lemonchiffon:'#fffacd',
            lightblue:'#add8e6', lightcoral:'#f08080', lightcyan:'#e0ffff',
            lightgoldenrodyellow:'#fafad2', lightgray:'#d3d3d3', lightgreen:'#90ee90',
            lightpink:'#ffb6c1', lightsalmon:'#ffa07a', lightseagreen:'#20b2aa',
            lightskyblue:'#87cefa', lightslategray:'#778899', lightsteelblue:'#b0c4de',
            lightyellow:'#ffffe0', lime:'#00ff00', limegreen:'#32cd32', linen:'#faf0e6',
            magenta:'#ff00ff', maroon:'#800000', mediumaquamarine:'#66cdaa',
            mediumblue:'#0000cd', mediumorchid:'#ba55d3', mediumpurple:'#9370db',
            mediumseagreen:'#3cb371', mediumslateblue:'#7b68ee',
            mediumspringgreen:'#00fa9a', mediumturquoise:'#48d1cc',
            mediumvioletred:'#c71585', midnightblue:'#191970', mintcream:'#f5fffa',
            mistyrose:'#ffe4e1', moccasin:'#ffe4b5', navajowhite:'#ffdead',
            navy:'#000080', oldlace:'#fdf5e6', olive:'#808000', olivedrab:'#6b8e23',
            orange:'#ffa500', orangered:'#ff4500', orchid:'#da70d6',
            alegoldenrod:'#eee8aa', palegreen:'#98fb98', paleturquoise:'#afeeee',
            palevioletred:'#db7093', papayawhip:'#ffefd5', peachpuff:'#ffdab9',
            peru:'#cd853f', pink:'#ffc0cb', plum:'#dda0dd', powderblue:'#b0e0e6',
            purple:'#800080', red:'#ff0000', rosybrown:'#bc8f8f', royalblue:'#4169e1',
            saddlebrown:'#8b4513', salmon:'#fa8072', sandybrown:'#f4a460',
            seagreen:'#2e8b57', seashell:'#fff5ee', sienna:'#a0522d',
            silver:'#c0c0c0', skyblue:'#87ceeb', slateblue:'#6a5acd',
            slategray:'#708090', snow:'#fffafa', springgreen:'#00ff7f',
            steelblue:'#4682b4', tan:'#d2b48c', teal:'#008080', thistle:'#d8bfd8',
            tomato:'#ff6347', turquoise:'#40e0d0', violet:'#ee82ee', wheat:'#f5deb3',
            white:'#ffffff', whitesmoke:'#f5f5f5', yellow:'#ffff00', yellowgreen:'#9acd32'
        }
        if (/^[a-z]+$/.test(c)){
            c= colornames[c];
        }
        if(/^#([a-f0-9]{3}){1,2}$/.test(c)){
            if(c.length== 4){
                c= '#'+[c[1], c[1], c[2], c[2], c[3], c[3]].join('');
            }
            c= '0x'+c.substring(1);
            return [(c>>16)&255, (c>>8)&255, c&255];
        }
        if(c.indexOf('hsl')== 0) return hslToRgb(c);
        else{
            c= c.match(/\d+(\.\d+)?%?/g);
            if(c){
                for(var i= 0;i<3;i++){
                    if(c[i].indexOf('%')!= -1) c[i]= parseFloat(c[i])*2.55;
                    c[i]= Math.round(c[i]);
                    if(c[i]<0) c[i]= 0;
                    if(c[i]>255) c[i]= 255;
                }
                return c;
            }
        }
        function hslToRgb(hsl){
            if(typeof hsl== 'string'){
                hsl= hsl.match(/(\d+(\.\d+)?)/g);
            }
            var sub, h= hsl[0]/360, s= hsl[1]/100, l= hsl[2]/100,
            t1, t2, t3, rgb, val;
            if(s== 0){
                val= Math.round(l*255);
                rgb= [val, val, val];
            }
            else{
                if(l<0.5)   t2= l*(1 + s);
                else t2= l + s - l*s;
                t1= 2*l - t2;
                rgb= [0, 0, 0];
                for(var i= 0;i<3;i++){
                    t3= h + 1/3*-(i - 1);
                    t3<0 && t3++;
                    t3>1 && t3--;
                    if(6*t3<1) val= t1 +(t2 - t1)*6*t3;
                    else if(2*t3<1) val= t2;
                    else if(3*t3<2) val= t1 +(t2 - t1)*(2/3 - t3)*6;
                    else val= t1;
                    rgb[i]= Math.round(val*255);
                }
            }
            return rgb;
        }
    }
    

提交回复
热议问题