在JavaScript中获取CSS/HTML命名颜色的RGB值



我已经构建了一个名为[rgb]Javascript的对象。你的基本:

namedColors = {
  AliceBlue: [240, 248, 255],
  AntiqueWhite: [250, 235, 215],
  ...

对象。但我突然想到,我应该可以取一个名称字符串,"AliceBlue",比如。。并让JavaScript找到它的某种RGB表示(十六进制很好)。我知道浏览器中至少有140种命名颜色,但我似乎找不到它们。

有没有CSS或"style=…"特技可以让我查找颜色名称的RGB表示?

最小JavaScript函数:

function nameToRgba(name) {
    var canvas = document.createElement('canvas');
    var context = canvas.getContext('2d');
    context.fillStyle = name;
    context.fillRect(0,0,1,1);
    return context.getImageData(0,0,1,1).data;
}

这就是我最终得到的解决方案。我意识到颜色有两种类型:css字符串和webgl类型的数组(根据具体情况,通常是4个浮点或int)。

见鬼去吧,让浏览器想象一下:创建一个1x1画布,用任何字符串颜色填充它,获取像素,然后解构成rgba数组。下面有两个实用程序,用于创建1x1 2d画布ctx。

# Return an RGB array given any legal CSS color, null otherwise.
# http://www.w3schools.com/cssref/css_colors_legal.asp
# The string can be CadetBlue, #0f0, rgb(255,0,0), hsl(120,100%,50%)
# The rgba/hsla forms ok too, but we don't return the a.
# Note: The browser speaks for itself: we simply set a 1x1 canvas fillStyle
# to the string and create a pixel, returning the r,g,b values.
# Warning: r=g=b=0 can indicate an illegal string.  We test
# for a few obvious cases but beware of unexpected [0,0,0] results.
ctx1x1: u.createCtx 1, 1 # share across calls. closure wrapper better?
stringToRGB: (string) ->
  @ctx1x1.fillStyle = string
  @ctx1x1.fillRect 0, 0, 1, 1
  [r, g, b, a] = @ctx1x1.getImageData(0, 0, 1, 1).data
  return [r, g, b] if (r+g+b isnt 0) or
    (string.match(/^black$/i)) or
    (string in ["#000","#000000"]) or
    (string.match(/rgba{0,1}(0,0,0/i)) or
    (string.match(/hsla{0,1}(0,0%,0%/i))
  null

我喜欢它的一点是浏览器为自己说话。任何合法的字符串都可以正常工作。唯一的缺点是,如果字符串是非法的,就会变成黑色,所以需要做一些检查。错误检查不是很好,但我在使用中不需要它。

实用程序功能:

# Create a new canvas of given width/height
createCanvas: (width, height) ->
  can = document.createElement 'canvas'
  can.width = width; can.height = height
  can
# As above, but returing the context object.
# Note ctx.canvas is the canvas for the ctx, and can be use as an image.
createCtx: (width, height) ->
  can = @createCanvas width, height
  can.getContext "2d"

此页面上的其他方法使用HTML5 Canvas

但一个简单的替代方案是使用从任何颜色关键字导出rgb()

  • window.getComputedStyle()

工作示例:

const colorKeywordToRGB = (colorKeyword) => {
  // CREATE TEMPORARY ELEMENT
  let el = document.createElement('div');
  // APPLY COLOR TO TEMPORARY ELEMENT
  el.style.color = colorKeyword;
  // APPEND TEMPORARY ELEMENT
  document.body.appendChild(el);
  // RESOLVE COLOR AS RGB() VALUE
  let rgbValue = window.getComputedStyle(el).color;
  
  // REMOVE TEMPORARY ELEMENT
  document.body.removeChild(el);
  return rgbValue;
}
// BASIC COLORS
console.log('red:', colorKeywordToRGB('red'));
console.log('green:', colorKeywordToRGB('green'));
console.log('yellow:', colorKeywordToRGB('yellow'));
console.log('blue:', colorKeywordToRGB('blue'));
// SIMPLE COLORS
console.log('fuchsia:', colorKeywordToRGB('fuchsia'));
console.log('lime:', colorKeywordToRGB('lime'));
console.log('maroon:', colorKeywordToRGB('maroon'));
console.log('navy:', colorKeywordToRGB('navy'));
console.log('olive:', colorKeywordToRGB('olive'));
console.log('purple:', colorKeywordToRGB('purple'));
console.log('teal:', colorKeywordToRGB('teal'));
console.log('transparent:', colorKeywordToRGB('transparent'));
// ADVANCED COLORS
console.log('blanchedalmond:', colorKeywordToRGB('blanchedalmond'));
console.log('coral:', colorKeywordToRGB('coral'));
console.log('darkorchid:', colorKeywordToRGB('darkorchid'));
console.log('firebrick:', colorKeywordToRGB('firebrick'));
console.log('gainsboro:', colorKeywordToRGB('gainsboro'));
console.log('honeydew:', colorKeywordToRGB('honeydew'));
console.log('papayawhip:', colorKeywordToRGB('papayawhip'));
console.log('seashell:', colorKeywordToRGB('seashell'));
console.log('thistle:', colorKeywordToRGB('thistle'));
console.log('wheat:', colorKeywordToRGB('wheat'));


进一步阅读:

  • https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle

查看函数为"name2hex"one_answers"name2rgb"的Colors.js。此库返回颜色名称的十六进制或rgb值。

您可以使用画布从名称中获取RGBA颜色。

请看这把小提琴:https://jsfiddle.net/AaronWatters/p1y298zk/19/

// We want to know the rgba values for this color name:
var testColor = "salmon"
// make a canvas
var canvas = $('<canvas width="100px" height="100px">');
// optional: display the canvas
var body = $(document.body);
canvas.appendTo(body);
// draw a rectangle on the canvas
var context = canvas[0].getContext("2d");
context.beginPath();
context.rect(0,0,100,100);
context.fillStyle = testColor;
context.fill();
// get the canvas image as an array
var imgData = context.getImageData(0, 0, 10, 10);
// rbga values for the element in the middle
var array = imgData.data.slice(50*4, 50*4+4);
// convert the opacity to 0..1
array[3] = array[3] / 255.0;
$("<div>The rgba for " + testColor + " is " + array + "</div>").appendTo(body);

以下是jp_doodle在过渡中进行颜色插值的方式:https://aaronwatters.github.io/jp_doodle/080_transitions.html

最新更新