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

IT技术 javascript colors
2021-02-09 10:28:27

是否有内置函数可以按名称将颜色转换为其十六进制表示?就像我想传递“白色”并接收“#FFFFFF”一样。我真的很想避免编码所有一百如果是我自己:)

6个回答

不,但使用此处列表您可以创建一个。像这样的东西:

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;
}
这个答案已经过时了(并且手动创建一个巨大的数组不值得这么多赞)。一个更好的解决方案(在添加新颜色时不需要更新)是下面@JayB 的答案
2021-03-16 10:28:27
不是试图将风从任何人的答案中吹走,但是正如我在提交的答案中链接的那样,有一种方法可以在所有浏览器中以编程方式从命名颜色中获取 HEX 和 RGB,\out 有一个像这样的巨大表格。Stack 上的人一般不会在首屏阅读吗?
2021-03-19 10:28:27
您可能想要防范继承的属性;) colourNameToHex('constructor')
2021-03-26 10:28:27
对于灰色的两种拼写,您还需要这些。根据我的视觉比较,其余的似乎都在那里。"darkgrey":"#a9a9a9", "darkslategrey":"#2f4f4f","dimgrey":"#696969","grey":"#808080","lightgray":"#d3d3d3","lightslategrey""# 778899","slategrey":"#708090",
2021-03-26 10:28:27
复制/粘贴/搜索/替换
2021-04-08 10:28:27

这将为您提供 RGB - 您应该能够很容易地进行十六进制转换。

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

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

IE9+,截至本评论 (2014/08/20) caniuse.com/#feat=getcomputedstyle 的所有常绿浏览器
2021-03-20 10:28:27
在 Chrome 上,节点确实需要在 DOM 中才能从getCompuedStyle. 否则颜色属性为"".
2021-03-30 10:28:27
请注意,这会将一个元素附加到您的<body>; 您应该在检查其颜色后将其删除。
2021-04-01 10:28:27
不会连需要的元素添加到您的文档,以检查它的风格,回避这个问题。
2021-04-01 10:28:27
可以确认在 Chrome 上需要 appendChild。另请注意:如果提供了无效的颜色字符串,它只会从 document.body 继承颜色。
2021-04-06 10:28:27

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

function standardize_color(str){
    var ctx = document.createElement('canvas').getContext(‌​'2d'​);
    ctx.fillStyle = str;
    return ctx.fillStyle;
}

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%)");
span { font-weight:800; }
The color named "Red" has a code of: <span id="myspan1">(requires js)</span>.<br>
 ...and color "PeachPuff"'s code is: <span id="myspan2">(requires js)</span>.<br>
 ...and "PaleGoldenRod" is: <span id="myspan3">(requires js)</span>.<br><br>
 
It works with "RGB(123,234,142)" too: <span id="myspan4">(needs js)</span>  
and therefore with: "HSL(284,6%,49%)", which is: <span id="myspan5">(requires js)
</span>.  Handy!

它实际上返回什么?
2021-03-15 10:28:27
绝对是最好的答案
2021-04-04 10:28:27
确实是最佳答案。请注意,传递无效颜色将为您提供默认填充颜色 (#000000)
2021-04-08 10:28:27

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

“向 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;
}

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

我已经在相当现代的 IE、Chrome、Safari 和 Firefox 版本中对此进行了测试。

那是超级整洁!我不确定我是否更喜欢它;使用“ctx.fillStyle 将颜色标准化为 rbga”技巧,您不能放入渐变或图案。我想它可以用更少的代码行来回答 OP,但它的灵活性稍差。
2021-03-15 10:28:27
@JayB 上面的答案是整个问题线程中最短的工作答案(为了可见性,您应该将其作为单独的答案记录)。
2021-03-25 10:28:27
函数standardize_color(str){ var ctx = document.createElement('canvas').getContext('2d'); ctx.fillStyle = str; 返回 ctx.fillStyle; }
2021-03-29 10:28:27
它甚至是每个规范:html.spec.whatwg.org/multipage/...
2021-04-08 10:28:27

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

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

按行解释:

  • 创建 html 元素
  • 设置颜色
  • 从刚刚附加到主体的元素中获取 rgb 代码(因此它被渲染),过滤数字并将每个数字转换为整数。
  • 删除我们刚刚创建的html元素
  • 使用 zyklus 代码返回 HEX 代码(有关更多信息,请参阅积分)

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

一个班轮从 rgb(a) 转换为 #hex var colors = '#'+window.getComputedStyle(document.body.appendChild(a)).color.match(/\d+/g).map(function(a,i){ return i>2 ? '' : ('0'+parseInt(a,10).toString(16)).substr(-2); }).join('');
2021-03-29 10:28:27