如何获取十六进制颜色值而不是RGB值?


171

使用以下jQuery将获取元素背景色的RGB值:

$('#selector').css('backgroundColor');

有没有办法获取十六进制值而不是RGB?


2
在一个相关的话题,更多的(而且可能更好)的方式来转换十六进制和RGB颜色之间的位置:stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb这轮已经被彻底改造足够的时间修造公路火车 我希望一种流行的JS库(比它简单得多)具有实用程序功能。
Michael Scheper'1

请记住,某些浏览器会返回rgba(#,#,#,#),例如rgba(0,0,0,0)是透明的,而不是黑色的。第4个值为不透明度,其中1.0为全彩色100%,0.5为50%。
Twelve24

Answers:


141
var hexDigits = new Array
        ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"); 

//Function to convert rgb color to hex format
function rgb2hex(rgb) {
 rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
 return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

function hex(x) {
  return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
 }

来源


7
+1,您可以使用Number.toString(16)-至少对于每个十六进制数字(或16以下为0填充)
orip

19
-1。如orip所述,您可以使用toString(16)。为其他低效率而投票。如果要在每个函数调用中声明hexDigits,至少要在rgb2hex的函数主体(而不是hex的主体)中声明它,因此,每次1次对rgb2hex的调用都不会将数组重新定义3次。还要学习使用'var',这样您就不会污染全局范围。
马特

3
此方法似乎不太能容忍不同的空白或大写。jsfiddle.net/Xotic750/pSQ7d
Xotic750

1
如果您确实想学究,可以使正则表达式更宽松:rgb.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)但是,给定的正则表达式旨在应付使用jQuery时浏览器给定的格式,并且没有不同的空格或拼写一致性你在说。您也可以使用相同的正则表达式,然后删除所有空白并转换为小写,然后在rgb上进行匹配。PS您的小提琴示例:'rgb(
10,128

对我来说,jQuery css background-colors的返回格式为rgba,所以这不起作用。
Miguel 2015年

159

这是我根据@Matt建议编写的更清洁的解决方案:

function rgb2hex(rgb) {
    rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
    function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

一些浏览器已经返回十六进制的颜色(自Internet Explorer 8及更低版本开始)。如果需要处理这些情况,只需在函数内部附加一个条件,例如@gfrobenius建议:

function rgb2hex(rgb) {
    if (/^#[0-9A-F]{6}$/i.test(rgb)) return rgb;

    rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
    function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

如果您使用的是jQuery并希望使用更完整的方法,则可以使用自jQuery 1.4.3起可用的CSS挂钩,如我在回答此问题时所显示的:我可以强制jQuery.css(“ backgroundColor”)以十六进制格式返回吗?


2
我建议所有人:在这里查看我的回复以查看使用jQuery CSS Hooks的改进版本。
Erick Petrucelli '04年6

1
@Ghigo,对不起,但你错了。IE8在获取当前样式时已经以十六进制形式返回颜色,方法是:document.getElementById("your_id").currentStyle["backgroundColor"]rgb2hex()不需要该功能。这里的jQuery插件使用CSS的钩子我上面建议的,它已经完成了所有的验证,以恢复在不同的浏览器的颜色:stackoverflow.com/questions/6177454/...
埃里克Petrucelli

2
@Ghigo,我认为您会误解:如果您使用的浏览器以十六进制形式返回,则不应使用此功能。此功能仅将RGB转换为HEX。当它不在RGB中时,请勿使用它。您需要一个更完整的解决方案(它检测值是否已经由@ Jim-F生成的RGB值)这一事实并不能改变该解决方案提供了OP所要求的功能的事实。对不起,您的否决票毫无意义。
Erick Petrucelli

4
对不起,但我不同意。跨浏览器功能总是比基于浏览器检测需要执行的功能更好。Op要求转换$('#selector').css('backgroundColor')为十六进制,而不是将rgb值转换为十六进制。在IE8上,$('#selector').css('backgroundColor')已经是十六进制的,因此必须对其进行处理。而已。不要生我的气:)
Ghigo

1
伙计们,我在rgb2hex()函数中添加了一个简单的衬里,谢谢@ErickPetru!我必须回信给IE7才能相信。使用.css('backgroundColor')和时,本机obj.style.backgroundColorIE7和8将返回十六进制,而不是RGB,所以我rgb2hex()在提供的答案中将此作为函数的第一行添加了此行,因此它可以一直返回到IE7:/* IE7&8 will return hex, so no need to run this function if it is already hex. */ if (/^#[0-9A-F]{6}$/i.test(rgb)) return rgb.substring(1, 7); //I'm doing a subtring here because I do not want the leading # symbol希望有帮助。
gfrobenius

60

大多数浏览器似乎在使用时返回RGB值:

$('#selector').css('backgroundColor');

只有IE(到目前为止仅测试了6个)返回十六进制值。

为了避免IE中出现错误消息,您可以将函数包装在if语句中:

function rgb2hex(rgb) {
     if (  rgb.search("rgb") == -1 ) {
          return rgb;
     } else {
          rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
          function hex(x) {
               return ("0" + parseInt(x).toString(16)).slice(-2);
          }
          return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); 
     }
}

1
由于Jim充分考虑了rgba,因此它比大多数其他工具都更有效,这是Safari(至少在Mac OS X上使用)使用的。谢谢,吉姆!
Pascal Lindelauf 2011年

1
很好的解决方案。请注意,该函数返回小写字母,即#ff5544而不是#FF5544。
彼得

此正则表达式还将在上述解决方案中支持aplha通道rgb = rgb.match(/ ^ rgba?((\ d +),\ s *(\ d +),\ s *(\ d +)(?:,\ s * (0 \。\ d +))?)$ /);
亨宁

像魅力一样工作
ucMedia

22

更新了@ErickPetru以实现rgba兼容性:

function rgb2hex(rgb) {
    rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
    function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

我更新了正则表达式以匹配alpha值(如果已定义),但未使用它。


仅出于完整性考虑:我正在研究一种将导出到PowerPoint的东西(不要问...),并且它接受alpha通道的十六进制字符串的第四个字节,因此可以这样使用它: return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]) /* Add the alpha channel if it exists */ + (rgb[5] !== undefined ? hex(Math.round(rgb[5] * 255)) : ''); 另外,我还删除了该#符号,以使其与最终用途无关(0x例如,可以获取输出并在其前添加,或者不带前缀)。希望它能对某人有所帮助!
奥斯卡·戈麦斯阿尔卡尼斯

10

这是一个不使用jQuery的ES6衬板:

var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => parseInt(color).toString(16)).join('');

1
谢谢,这帮助我将其合并到Wordpress页面中,该页面在前面的答案中去除了正则表达式反斜杠。
杰森

5

这是一个也检查透明性的版本,我需要这样做,因为我的对象是将结果插入到style属性中,其中十六进制颜色的透明版本实际上是单词“ transparent”。

function rgb2hex(rgb) {
     if (  rgb.search("rgb") == -1 ) {
          return rgb;
     }
     else if ( rgb == 'rgba(0, 0, 0, 0)' ) {
         return 'transparent';
     }
     else {
          rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
          function hex(x) {
               return ("0" + parseInt(x).toString(16)).slice(-2);
          }
          return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); 
     }
}

4

以十六进制返回元素的背景色的函数。

function getBgColorHex(elem){
    var color = elem.css('background-color')
    var hex;
    if(color.indexOf('#')>-1){
        //for IE
        hex = color;
    } else {
        var rgb = color.match(/\d+/g);
        hex = '#'+ ('0' + parseInt(rgb[0], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[1], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[2], 10).toString(16)).slice(-2);
    }
    return hex;
}

用法示例:

$('#div1').click(function(){
   alert(getBgColorHex($(this));
}

jsfiddle


4

@Jim F答案相同的答案, 但使用ES6语法,因此,指令少:

const rgb2hex = (rgb) => {
  if (rgb.search("rgb") === -1) return rgb;
  rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
  const hex = (x) => ("0" + parseInt(x).toString(16)).slice(-2);
  return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
};

3

从引导程序颜色选择器中获取的颜色类别

// Color object
var Color = function(val) {
    this.value = {
        h: 1,
        s: 1,
        b: 1,
        a: 1
    };
    this.setColor(val);
};

Color.prototype = {
    constructor: Color,

    //parse a string to HSB
    setColor: function(val){
        val = val.toLowerCase();
        var that = this;
        $.each( CPGlobal.stringParsers, function( i, parser ) {
            var match = parser.re.exec( val ),
            values = match && parser.parse( match ),
            space = parser.space||'rgba';
            if ( values ) {
                if (space === 'hsla') {
                    that.value = CPGlobal.RGBtoHSB.apply(null, CPGlobal.HSLtoRGB.apply(null, values));
                } else {
                    that.value = CPGlobal.RGBtoHSB.apply(null, values);
                }
                return false;
            }
        });
    },

    setHue: function(h) {
        this.value.h = 1- h;
    },

    setSaturation: function(s) {
        this.value.s = s;
    },

    setLightness: function(b) {
        this.value.b = 1- b;
    },

    setAlpha: function(a) {
        this.value.a = parseInt((1 - a)*100, 10)/100;
    },

    // HSBtoRGB from RaphaelJS
    // https://github.com/DmitryBaranovskiy/raphael/
    toRGB: function(h, s, b, a) {
        if (!h) {
            h = this.value.h;
            s = this.value.s;
            b = this.value.b;
        }
        h *= 360;
        var R, G, B, X, C;
        h = (h % 360) / 60;
        C = b * s;
        X = C * (1 - Math.abs(h % 2 - 1));
        R = G = B = b - C;

        h = ~~h;
        R += [C, X, 0, 0, X, C][h];
        G += [X, C, C, X, 0, 0][h];
        B += [0, 0, X, C, C, X][h];
        return {
            r: Math.round(R*255),
            g: Math.round(G*255),
            b: Math.round(B*255),
            a: a||this.value.a
        };
    },

    toHex: function(h, s, b, a){
        var rgb = this.toRGB(h, s, b, a);
        return '#'+((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
    },

    toHSL: function(h, s, b, a){
        if (!h) {
            h = this.value.h;
            s = this.value.s;
            b = this.value.b;
        }
        var H = h,
        L = (2 - s) * b,
        S = s * b;
        if (L > 0 && L <= 1) {
            S /= L;
        } else {
            S /= 2 - L;
        }
        L /= 2;
        if (S > 1) {
            S = 1;
        }
        return {
            h: H,
            s: S,
            l: L,
            a: a||this.value.a
        };
    }
};

如何使用

var color = new Color("RGB(0,5,5)");
color.toHex()

3

可读&& Reg-exp免费(无Reg-exp)

我创建了一个使用可读的基本功能且没有reg-exp的功能。
该函数接受十六进制,rgb 或rgba CSS格式的颜色,并返回十六进制表示形式。
编辑:存在解析rgba()格式的错误,已修复...

function getHexColor( color ){
    //if color is already in hex, just return it...
    if( color.indexOf('#') != -1 ) return color;
    
    //leave only "R,G,B" :
    color = color
                .replace("rgba", "") //must go BEFORE rgb replace
                .replace("rgb", "")
                .replace("(", "")
                .replace(")", "");
    color = color.split(","); // get Array["R","G","B"]
    
    // 0) add leading #
    // 1) add leading zero, so we get 0XY or 0X
    // 2) append leading zero with parsed out int value of R/G/B
    //    converted to HEX string representation
    // 3) slice out 2 last chars (get last 2 chars) => 
    //    => we get XY from 0XY and 0X stays the same
    return  "#"
            + ( '0' + parseInt(color[0], 10).toString(16) ).slice(-2)
            + ( '0' + parseInt(color[1], 10).toString(16) ).slice(-2)
            + ( '0' + parseInt(color[2], 10).toString(16) ).slice(-2);
}

1
在rgba(0,0,0,0)上不起作用。首先:订单需要更改.replace("rgba", "") .replace("rgb", "") .replace("(", "") .replace(")", "");否则,您将剩下a0,0,0,0。并且,它返回#000000,它是黑色,而不是透明的。
Twelve24

如果rgba中的第4个值为0(零),则对于css,该“元素”为:element {color:#000000,opacity:0.0;}透明或有条件地返回“ rgba(0,0 ,0,0)'返回给呼叫者。
Twelve24

@ Twelve24解析固定-在阅读您的评论之前,我实际上注意到了这一点,但绝对感谢:),至于透明度 -函数应该返回HEXA颜色或“基础颜色”-因此,它是有目的的 :)
jave.web

2

这看起来更好一些:

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var r   = parseInt(rgb[0], 10);
var g   = parseInt(rgb[1], 10);
var b   = parseInt(rgb[2], 10);
var hex = '#'+ r.toString(16) + g.toString(16) + b.toString(16);

更简洁的单行代码:

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var hex = '#'+ Number(rgb[0]).toString(16) + Number(rgb[1]).toString(16) + Number(rgb[2]).toString(16);

强制jQuery始终返回十六进制:

$.cssHooks.backgroundColor = {
    get: function(elem) {
        if (elem.currentStyle)
            var bg = elem.currentStyle["backgroundColor"];
        else if (window.getComputedStyle) {
            var bg = document.defaultView.getComputedStyle(elem,
                null).getPropertyValue("background-color");
        }
        if (bg.search("rgb") == -1) {
            return bg;
        } else {
            bg = bg.match(/\d+/g);
            function hex(x) {
                return ("0" + parseInt(x).toString(16)).slice(-2);
            }
            return "#" + hex(bg[0]) + hex(bg[1]) + hex(bg[2]);
        }
    }
}

2

只是要添加到@Justin的答案中。

它应该是

var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => String("0" + parseInt(color).toString(16)).slice(-2)).join('');

由于上述parse int函数会截断前导零,因此可能会产生5或4个字母的错误颜色代码,即...对于rgb(216,160,10),它会产生#d8a0a,而它应该是#d8a00a。

谢谢


2

尝试

// c - color str e.g."rgb(12,233,43)", result color hex e.g. "#0ce92b"
let rgb2hex= c=> '#'+c.match(/\d+/g).map(x=>(+x).toString(16).padStart(2,0)).join``



1

史蒂芬·普比林斯基(Steven Pribilinskiy)的答案下降了前导零,例如,#ff0000变为#ff00。

一种解决方案是在末尾的两个数字后附加前导0和子字符串。

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var hex = '#'+ String('0' + Number(rgb[0]).toString(16)).slice(-2) + String('0' + Number(rgb[1]).toString(16)).slice(-2) + String('0' + Number(rgb[2]).toString(16)).slice(-2);

1

由于问题是使用JQuery,因此下面是基于Daniel Elliott的代码的JQuery插件:

$.fn.cssAsHex = function(colorProp) {

    var hexDigits = '0123456789abcdef';

    function hex(x) {
        return isNaN(x) ? '00' : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
    };

    // Convert RGB color to Hex format
    function rgb2hex(rgb) {
        var rgbRegex = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
        return '#' + hex(rgbRegex[1]) + hex(rgbRegex[2]) + hex(rgbRegex[3]);
    };

    return rgb2hex(this.css(colorProp));
};

像这样使用它:

var hexBackgroundColor = $('#myElement').cssAsHex('background-color');

0

这里是我的解决方案,也不会touppercase通过使用其他可能的空格和大写在所提供的字符串参数和检查。

var a = "rgb(10, 128, 255)";
var b = "rgb( 10, 128, 255)";
var c = "rgb(10, 128, 255 )";
var d = "rgb ( 10, 128, 255 )";
var e = "RGB ( 10, 128, 255 )";
var f = "rgb(10,128,255)";
var g = "rgb(10, 128,)";

var rgbToHex = (function () {
    var rx = /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i;

    function pad(num) {
        if (num.length === 1) {
            num = "0" + num;
        }

        return num;
    }

    return function (rgb, uppercase) {
        var rxArray = rgb.match(rx),
            hex;

        if (rxArray !== null) {
            hex = pad(parseInt(rxArray[1], 10).toString(16)) + pad(parseInt(rxArray[2], 10).toString(16)) + pad(parseInt(rxArray[3], 10).toString(16));

            if (uppercase === true) {
                hex = hex.toUpperCase();
            }

            return hex;
        }

        return;
    };
}());

console.log(rgbToHex(a));
console.log(rgbToHex(b, true));
console.log(rgbToHex(c));
console.log(rgbToHex(d));
console.log(rgbToHex(e));
console.log(rgbToHex(f));
console.log(rgbToHex(g));

jsfiddle上

速度比较 jsperf上的

进一步改进可能是trim()rgb字符串

var rxArray = rgb.trim().match(rx),

0

我美丽的非标准解决方案

的HTML

<div id="selector" style="background-color:#f5b405"></div>

jQuery的

$("#selector").attr("style").replace("background-color:", "");

结果

#f5b405

1
它返回样式中的所有内容。:c
艾迪(Eddie)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.