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

后端 未结 9 1922
甜味超标
甜味超标 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 05:07

    Necromancing.
    For anybody that actually needs it, here's fully working and feature-complete code.
    Think of it as complement to the answer of "Niet the Dark Absol"
    Cheers.

    function parseColor(input) {
        var mm;
        var m;
        // Obviously, the numeric values will be easier to parse than names.So we do those first.
        mm = input.match(/^#?([0-9a-f]{3})$/i);
        if (mm) {
            m = mm[1];
            // in three-character format, each value is multiplied by 0x11 to give an
            // even scale from 0x00 to 0xff
            return [
                parseInt(m.charAt(0), 16) * 0x11,
                parseInt(m.charAt(1), 16) * 0x11,
                parseInt(m.charAt(2), 16) * 0x11
            ];
        }
        // That's one. Now for the full six-digit format: 
        mm = input.match(/^#?([0-9a-f]{6})$/i);
        if (mm) {
            m = mm[1];
            return [
                parseInt(m.substr(0, 2), 16),
                parseInt(m.substr(2, 2), 16),
                parseInt(m.substr(4, 2), 16)
            ];
        }
        // And now for rgb() format:
        var mm = input.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);
        if (mm) {
            return [mm[1], mm[2], mm[3]];
        }
        // https://www.w3schools.com/colors/colors_names.asp
        // https://en.wikipedia.org/wiki/Web_colors
        // http://www.colors.commutercreative.com/grid/
        var webColors = {
            "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",
            "DarkGrey": "#A9A9A9",
            "DarkGreen": "#006400",
            "DarkKhaki": "#BDB76B",
            "DarkMagenta": "#8B008B",
            "DarkOliveGreen": "#556B2F",
            "DarkOrange": "#FF8C00",
            "DarkOrchid": "#9932CC",
            "DarkRed": "#8B0000",
            "DarkSalmon": "#E9967A",
            "DarkSeaGreen": "#8FBC8F",
            "DarkSlateBlue": "#483D8B",
            "DarkSlateGray": "#2F4F4F",
            "DarkSlateGrey": "#2F4F4F",
            "DarkTurquoise": "#00CED1",
            "DarkViolet": "#9400D3",
            "DeepPink": "#FF1493",
            "DeepSkyBlue": "#00BFFF",
            "DimGray": "#696969",
            "DimGrey": "#696969",
            "DodgerBlue": "#1E90FF",
            "FireBrick": "#B22222",
            "FloralWhite": "#FFFAF0",
            "ForestGreen": "#228B22",
            "Fuchsia": "#FF00FF",
            "Gainsboro": "#DCDCDC",
            "GhostWhite": "#F8F8FF",
            "Gold": "#FFD700",
            "GoldenRod": "#DAA520",
            "Gray": "#808080",
            "Grey": "#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",
            "LightGrey": "#D3D3D3",
            "LightGreen": "#90EE90",
            "LightPink": "#FFB6C1",
            "LightSalmon": "#FFA07A",
            "LightSeaGreen": "#20B2AA",
            "LightSkyBlue": "#87CEFA",
            "LightSlateGray": "#778899",
            "LightSlateGrey": "#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",
            "PaleGoldenRod": "#EEE8AA",
            "PaleGreen": "#98FB98",
            "PaleTurquoise": "#AFEEEE",
            "PaleVioletRed": "#DB7093",
            "PapayaWhip": "#FFEFD5",
            "PeachPuff": "#FFDAB9",
            "Peru": "#CD853F",
            "Pink": "#FFC0CB",
            "Plum": "#DDA0DD",
            "PowderBlue": "#B0E0E6",
            "Purple": "#800080",
            "RebeccaPurple": "#663399",
            "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",
            "SlateGrey": "#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"
        };
        for (var p in webColors) {
            webColors[p.toLowerCase()] = webColors[p];
        }
        var wc = webColors[input.toLowerCase()];
        if (wc != null)
            return parseColor(wc);
        console.log(input);
        throw Error("'" + input + "' is not a valid color...");
    }
    // parseColor("steelblue");
    parseColor("SteelBlue");
    // JSON.stringify(webColors, null, 2);
    // JSON.stringify(lcWebColors, null, 2);
    //# sourceMappingURL=colorInfluence.js.map
    

提交回复
热议问题