如何比较 jQuery/JavaScript 中的两个颜色值?

IT技术 javascript jquery css
2021-03-01 07:57:02

我使用 jQuery 获得颜色值.css('color'),然后我知道它应该是什么颜色。

如何比较从 jQuery 获得的颜色值与例如黑色值?

6个回答

这是一种适用于所有使用 JQuery 的浏览器的方法:

  1. <div id="dummy" style="display:none;"></div>在您的 HTML 页面上创建一个隐藏的 div (使用 JQuery 动态创建虚拟元素不适用于命名颜色)
  2. 将虚拟元素的颜色设置为预期的颜色,即 $('#dummy').css('color','black');
  3. 将虚拟元素的颜色与要检查的元素进行比较

IE

if($('#element').css('color') === $('#dummy').css('color')) {
  //do something
}
我也不认为这是可靠的。在最新的 Chrome 中,我的虚拟 div 返回了 'white',但我将它与返回的元素进行了比较,返回了 'rgb(255,255,255)'
2021-04-25 07:57:02
你在哪个操作系统上?你有你所做的示例代码吗?
2021-05-02 07:57:02
某些浏览器会以您提供给他们的格式将其返还给您。(不是很多,这些天,但是......)
2021-05-05 07:57:02
这应该是正确答案。这是您可以确信 #c0cc00 和 RGB(192, 204, 0) 之类的东西会进行比较的唯一方法。
2021-05-13 07:57:02
5-6 小时后,我很高兴我找到了这个。你会认为他们现在已经找到了更好的解决方案。对你的主要荣誉,我希望我能投票两次!
2021-05-14 07:57:02

关于什么...

if ($('#element').css('color') == 'rgb(0, 0, 0)')
{
    // do something
}

将 0, 0, 0 替换为要比较的颜色值的红色、绿色和蓝色值。

.css() jQuery API

请注意,这并不总是适用于 Internet Explorer,因为它返回原始值。因此,它可以是从 3 位或 6 位十六进制值到命名颜色的任何内容。
2021-04-29 07:57:02
是的,我不确定,但我认为 jQuery 抽象出了浏览器的差异?
2021-05-04 07:57:02
难道没有更多实现独立的解决方案吗?即使 RGB 值之间的空格稍有变化也会破坏这种相等性,更不用说十六进制表示,甚至是像白色或黑色这样的简单单词表示。任何人的想法?
2021-05-09 07:57:02

我有一个类似的问题,我不得不切换元素的 bgnd 颜色。我是这样解决的:

var color_one = "#FFA500";
var color_two = "#FFFF00";

function toggle_color(elem){
    var bgcolor = elem.css("background-color");
    elem.css("background-color", color_one);     // try new color
    if(bgcolor == elem.css("background-color"))  // check if color changed
        elem.css("background-color", color_two); // if here means our color was color_one
}
不错的一个,但它不适用于 CSS3 过渡,但它是好的。我将尝试将颜色值转换为常量值。
2021-04-24 07:57:02
我喜欢这个,虽然我仍然认为要健壮,最好使用全局变量来跟踪状态..所以要在我当前的项目中这样做。检查颜色更容易,但错误的机会太多。
2021-05-09 07:57:02

这是我在一个函数中实现 Mike 的答案。

function compareColors(left, right) {
    // Create a dummy element to assign colors to.
    var dummy = $('<div/>');

    // Set the color to the left color value, and read it back.
    $(dummy).css('color', left);
    var adjustedLeft = $(dummy).css('color');

    // Set the color to the right color value, and read it back.
    $(dummy).css('color', right);
    var adjustedRight = $(dummy).css('color');

    // Both colors are now adjusted to use the browser's internal format,
    // so we can compare them directly.
    return adjustedLeft == adjustedRight;
}

您无需实际将元素添加到 DOM 即可使其正常工作。在 IE8、IE10、FF、Chrome、Safari 中测试。

简单明了。这对于比较 rgb(r, g, b) 和 #ffffff 值很有用。
2021-05-05 07:57:02

CSS 颜色可以以多种格式出现 - rgbrgba#hex、几乎不支持的#hexalpha、臭名昭著的命名颜色和特殊的transparent. 要将任何颜色与任何颜色进行比较,您需要先对它们进行标准化。此处 (gist)此处colorValues找到函数(SO answer将始终为您提供数值数组。 然后您可以像这样比较它们:[r,g,b,a]

var sameColor = colorValues(color1).join(',') === colorValues(color2).join(',');

颜色值函数

// return array of [r,g,b,a] from any valid color. if failed returns undefined
function colorValues(color)
{
    if (color === '')
        return;
    if (color.toLowerCase() === 'transparent')
        return [0, 0, 0, 0];
    if (color[0] === '#')
    {
        if (color.length < 7)
        {
            // convert #RGB and #RGBA to #RRGGBB and #RRGGBBAA
            color = '#' + color[1] + color[1] + color[2] + color[2] + color[3] + color[3] + (color.length > 4 ? color[4] + color[4] : '');
        }
        return [parseInt(color.substr(1, 2), 16),
            parseInt(color.substr(3, 2), 16),
            parseInt(color.substr(5, 2), 16),
            color.length > 7 ? parseInt(color.substr(7, 2), 16)/255 : 1];
    }
    if (color.indexOf('rgb') === -1)
    {
        // convert named colors
        var temp_elem = document.body.appendChild(document.createElement('fictum')); // intentionally use unknown tag to lower chances of css rule override with !important
        var flag = 'rgb(1, 2, 3)'; // this flag tested on chrome 59, ff 53, ie9, ie10, ie11, edge 14
        temp_elem.style.color = flag;
        if (temp_elem.style.color !== flag)
            return; // color set failed - some monstrous css rule is probably taking over the color of our object
        temp_elem.style.color = color;
        if (temp_elem.style.color === flag || temp_elem.style.color === '')
            return; // color parse failed
        color = getComputedStyle(temp_elem).color;
        document.body.removeChild(temp_elem);
    }
    if (color.indexOf('rgb') === 0)
    {
        if (color.indexOf('rgba') === -1)
            color += ',1'; // convert 'rgb(R,G,B)' to 'rgb(R,G,B)A' which looks awful but will pass the regxep below
        return color.match(/[\.\d]+/g).map(function (a)
        {
            return +a
        });
    }
}