Javascript函数将颜色名称转换为十六进制代码

And*_*rey 64 javascript colors

是否有内置函数可以将颜色按名称转换为十六进制表示形式?就像我想通过'白'并接收'#FFFFFF'一样.如果是我自己,我真的想避免全部编码:)

Gre*_*reg 92

不,但是在这里使用列表你可以创建一个.像这样的东西:

function colourNameToHex(colour)
{
    var colours = {"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",
    "lightgrey":"#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":"#9370d8","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":"#d87093","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","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 (typeof colours[colour.toLowerCase()] != 'undefined')
        return colours[colour.toLowerCase()];

    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 对于这两种灰色拼写,你也需要这些拼写.其余似乎是基于我的视觉比较."darkgrey":"#a9a9a9","darkslategrey":"#2f4f4f","dimgrey":"#696969","灰色":"#808080","lightgray":"#d3d3d3","lightslategrey""# 778899" , "slategrey": "#708090", (7认同)
  • 复制/粘贴/搜索/替换 (5认同)
  • 没有试图在任何人的答案中敲响风,但是正如我在提交的答案中所链接的那样,有一种方法可以在所有浏览器中以编程方式从命名颜色中获取HEX和RGB,并且具有像这样的巨大表格.Stack上的人一般不会在首屏下方阅读吗? (4认同)
  • 这个答案已经过时了(并且手动创建一个巨大的数组不值得这么多赞)。更好的解决方案(在添加新颜色时不需要更新)是下面的 [@JayB 的答案](/sf/answers/3314863121/)。 (2认同)

Tim*_*Tim 48

这将以RGB形式呈现给您 - 您应该能够非常轻松地进行十六进制转换.

d = document.createElement("div");
d.style.color = "white";
document.body.appendChild(d)
//Color in RGB 
window.getComputedStyle(d).color
Run Code Online (Sandbox Code Playgroud)

并非所有浏览器都支持Get Computed样式.

  • 请注意,这会在您的`<body>`中附加一个元素; 你应该检查它的颜色后删除它. (7认同)
  • 在 Chrome 上,节点确实需要位于 DOM 中才能从“getCompuedStyle”获取任何内容。否则颜色属性为`""`。 (6认同)
  • 您甚至不需要将元素附加到文档中以检查其样式,从而避免该问题. (4认同)
  • 可以确认 Chrome 上需要appendChild。另请注意:如果提供了无效的颜色字符串,它只会从 document.body 继承颜色。 (2认同)

Nat*_*ate 32

编辑:我已经清理了一下,并做了一个要点演示.基本方法保持不变.

"向DOM添加元素并检查其ComputedStyle"方法对我来说似乎有点复杂 - 您需要添加它并检查它并记得删除它并且您只是为了计算颜色而更改DOM并且它会导致它回流?所以这是一个基于临时(并且从未渲染)的解决方案<canvas>:

function colorToRGBA(color) {
    // Returns the color as an array of [r, g, b, a] -- all range from 0 - 255
    // color must be a valid canvas fillStyle. This will cover most anything
    // you'd want to use.
    // Examples:
    // colorToRGBA('red')  # [255, 0, 0, 255]
    // colorToRGBA('#f00') # [255, 0, 0, 255]
    var cvs, ctx;
    cvs = document.createElement('canvas');
    cvs.height = 1;
    cvs.width = 1;
    ctx = cvs.getContext('2d');
    ctx.fillStyle = color;
    ctx.fillRect(0, 0, 1, 1);
    return ctx.getImageData(0, 0, 1, 1).data;
}

function byteToHex(num) {
    // Turns a number (0-255) into a 2-character hex number (00-ff)
    return ('0'+num.toString(16)).slice(-2);
}

function colorToHex(color) {
    // Convert any CSS color to a hex representation
    // Examples:
    // colorToHex('red')            # '#ff0000'
    // colorToHex('rgb(255, 0, 0)') # '#ff0000'
    var rgba, hex;
    rgba = colorToRGBA(color);
    hex = [0,1,2].map(
        function(idx) { return byteToHex(rgba[idx]); }
        ).join('');
    return "#"+hex;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这允许您使用任何有效的画布fillStyle,因此如果您想从图像中提取1像素图案,它也会告诉您颜色.

我已经在IE,Chrome,Safari和Firefox的合理现代版本中对此进行了测试.

  • 函数standardize_color(str){ var ctx = document.createElement('canvas').getContext('2d'); ctx.fillStyle = str; 返回 ctx.fillStyle; } (6认同)

Tie*_*ies 20

这里是您使用浏览器为您计算的功能

function getHexColor(colorStr) {
    var a = document.createElement('div');
    a.style.color = colorStr;
    var colors = window.getComputedStyle( document.body.appendChild(a) ).color.match(/\d+/g).map(function(a){ return parseInt(a,10); });
    document.body.removeChild(a);
    return (colors.length >= 3) ? '#' + (((1 << 24) + (colors[0] << 16) + (colors[1] << 8) + colors[2]).toString(16).substr(1)) : false;
}
getHexColor('teal') // returns #008080
Run Code Online (Sandbox Code Playgroud)

按行说明:

  • 创建html元素
  • 设置颜色
  • 获取rgb-code形式的元素,它只是附加到正文(因此它被渲染),过滤数字并将每个数字转换为整数.
  • 删除我们刚刚创建的html元素
  • 使用zyklus代码返回HEX代码(有关详细信息,请参阅信用)

归功于zyklus他的rgb到十六进制代码


Jay*_*ayB 18

@dlauzon建议我将评论转换为答案。感谢您的建议!这里是 :)

function standardize_color(str){
    var ctx = document.createElement('canvas').getContext(??'2d'?);
    ctx.fillStyle = str;
    return ctx.fillStyle;
}
Run Code Online (Sandbox Code Playgroud)

function standardize_color(str){
    var ctx = document.createElement('canvas').getContext(??'2d'?);
    ctx.fillStyle = str;
    return ctx.fillStyle;
}
Run Code Online (Sandbox Code Playgroud)
function standardize_color(str){
	var ctx = document.createElement("canvas").getContext("2d");
	ctx.fillStyle = str;
	return ctx.fillStyle;
}

document.getElementById("myspan1").innerHTML = standardize_color("red");
document.getElementById("myspan2").innerHTML = standardize_color("PeachPuff");
document.getElementById("myspan3").innerHTML = standardize_color("PaleGoldenRod"); 
document.getElementById("myspan4").innerHTML = standardize_color("RGB(123,234,142)"); 
document.getElementById("myspan5").innerHTML = standardize_color("HSL(284,6%,49%)");
Run Code Online (Sandbox Code Playgroud)
span { font-weight:800; }
Run Code Online (Sandbox Code Playgroud)

  • 绝对是众多答案中的最佳答案 (4认同)

csu*_*cat 14

这是一个全能的解决方案,可以在每个浏览器中完成您想要的100%编程,再见巨型静态名称表和十六进制值!:

// Here is the solution tied together as a native String native extension using 
// MooTools, though you can implement the same thing in whatever framework you prefer:

(function(String){

var valueMatch = {
        'rgb(0,0,0)': { 'black': ' ', 'rgb(0,0,0)': ' ' },
        'rgba(0,0,0,0)': { 'transparent': ' ', 'rgba(0,0,0,0)': ' ' },
        '#ffffff': { 'transparent': ' ' },
        'transparent': { 'transparent': ' ' }
    },
    colorFromProbe = function(color){
        color = color.toString();
        if(!color.match(/^#.+$|^[^0-9]+$/)) return color;
        var probe = ($('moo_color_probe') || new Element('textarea', {
                'id': 'moo_color_probe',
                'styles': {
                    'display': 'none',
                    'color': 'transparent'
                }
            }).inject(document.body, 'after'));
        try{ probe.setStyle('color', color) } catch(e){ return color } //IE throws an error instead of defaulting the style to some color or transparent when the value is unrecognized
        var computed = (Browser.ie) ? ieColorToHex(probe) : (Browser.opera) ? probe.style.color : probe.getComputedStyle('color'),
            match = valueMatch[computed.replace(/ /g, '')];
        probe.setStyle('color', 'transparent');
        if((!Browser.ie || Browser.ie9) && color == 'transparent' && (match && match['transparent'])) return 'rgba(0, 0, 0, 0)';
        return (computed == 'transparent' || match && !match[color.replace(/ /g, '')]) ? color : computed;
    },
    ieColorToHex = function(probe){ // Special IE mojo, thanks to Dean Edwards for the inspiration, his code used a pop-up window to test the color, I found you can simply use a textarea instead ;)
        var value = probe.set('value', '').createTextRange().queryCommandValue("ForeColor");
        value = (((value & 0x0000ff) << 16) | (value & 0x00ff00) | ((value & 0xff0000) >>> 16)).toString(16);
        return "#000000".slice(0, 7 - value.length) + value;
    };

    String.implement({
        colorToRgb: function(){
            var color = colorFromProbe(this);
            return (color.charAt(0) == '#') ? color.hexToRgb() : color;
        },
        colorToHex: function(){
            var color = colorFromProbe(this);
            return (color.test('rgb')) ? color.rgbToHex() : color;
        }
    });

})(String);    
Run Code Online (Sandbox Code Playgroud)

可在此处找到更完整的解释和实例:http: //www.backalleycoder.com/2010/10/05/converting-css-named-colors-to-rgb-and-hex/

  • @csuwldcat:一切都是真的,在我们之间我们已经彻底解决了这个问题.我认为我的主要观点是两种方法都是有效的,而且更好的方法取决于具体情况,而您的意见似乎表明您认为程序化解决方案本质上更优越. (3认同)

Duc*_*tro 6

你需要依靠getComputedStyle(...).

使用示例getComputedStyle:

function convertToHexColor(englishColor) {

    // create a temporary div. 
    var div = $('<div></div>').appendTo("body").css('background-color', englishColor);
    var computedStyle = window.getComputedStyle(div[0]);

    // get computed color.
    var computedColor = computedStyle.backgroundColor;

    // cleanup temporary div.
    div.remove();

    // done.
    return computedColor;

    // The above returns "rgb(R, G, B)" on IE9/Chrome20/Firefox13.
};
Run Code Online (Sandbox Code Playgroud)

要将"rgb(R,G,B)"转换为#RRGGBB,您可以使用:

function convertRGBDecimalToHex(rgb)
{
    var regex = /rgb *\( *([0-9]{1,3}) *, *([0-9]{1,3}) *, *([0-9]{1,3}) *\)/;
    var values = regex.exec(rgb);
    if(values.length != 4)
    {
        return rgb; // fall back to what was given.              
    }
    var r = Math.round(parseFloat(values[1]));
    var g = Math.round(parseFloat(values[2]));
    var b = Math.round(parseFloat(values[3]));
    return "#" 
        + (r + 0x10000).toString(16).substring(3).toUpperCase() 
        + (g + 0x10000).toString(16).substring(3).toUpperCase()
        + (b + 0x10000).toString(16).substring(3).toUpperCase();
}
Run Code Online (Sandbox Code Playgroud)