使用下面的jQuery将获得元素背景颜色的RGB值:

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

有没有办法得到十六进制值而不是RGB?


当前回答

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

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));
}

斯菲德尔

其他回答

博士TL;

使用这个干净的单行函数,同时支持rgb和rgba:

const rgba2hex = (rgba) => `#${rgba.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+\.{0,1}\d*))?\)$/).slice(1).map((n, i) => (i === 3 ? Math.round(parseFloat(n) * 255) : parseFloat(n)).toString(16).padStart(2, '0').replace('NaN', '')).join('')}`

2021年更新答案

从我最初回答这个问题到现在已经过去了很久。然后很酷的ECMAScript 5和2015+特性在浏览器上大量可用,比如箭头函数、数组。地图,字符串。padStart和模板字符串。从几年开始,可以编写跨浏览器的单行rgb2hex:

几点rgb2hex = (rgb) = > ' # {rgb美元。竞赛(d - ^ rgb (\), s * (\ d + s), \ * (d +) \)美元/片(1))。地图(n =>帕特森(n, 10), to弦(16)。padStart(2,‘0’)。加入(")的 //用你想要的… 控制台日志(rgb2hex (rgb(0,0,0)’) 控制台.log(rgb2hex('rgb(255, 255) 控制台日志(rgb2hex (rgb(255,0,0)’) 控制台(rgb2十六克('rgb(38,170, 90)

它的工作原理是使用正则表达式来获取rgb字符串中的每个数字,slice(1)只获得数字(匹配的第一个结果是完整的字符串本身),map迭代每个数字,每次迭代转换为parseInt的Number,然后返回到十六进制字符串(通过16进制转换),如果需要通过padStart添加零。最后,将每个转换/调整的数字连接到一个以'#'开头的唯一字符串。

当然,我们可以毫不费力地将其扩展为一行代码rgba2hex:

const rgba2hex = (rgba) => `#${rgba.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+\.{0,1}\d*))?\)$/).slice(1).map((n, i) => (i === 3 ? Math.round(parseFloat(n) * 255) : parseFloat(n)).toString(16).padStart(2, '0').replace('NaN', '')).join('')}` // Now it doesn't matter if 'rgb' or 'rgba'... console.log(rgba2hex('rgb(0,0,0)')) console.log(rgba2hex('rgb(255, 255, 255)')) console.log(rgba2hex('rgb(255,0,0)')) console.log(rgba2hex('rgb(38, 170, 90)')) console.log(rgba2hex('rgba(255, 0, 0, 0.5)')) console.log(rgba2hex('rgba(0,255,0,1)')) console.log(rgba2hex('rgba(127,127,127,0.25)'))

就是这样。但如果您想深入了解旧式JavaScript世界,请继续阅读。


原2010年答案

以下是我根据@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 Hooks,就像我在回答这个问题时所展示的:我可以强制jQuery. CSS ("backgroundColor")以十六进制格式返回吗?

对于所有函数式编程爱好者,这里有一个有点函数式的方法:)

const getHexColor = (rgbValue) =>
  rgbValue.replace("rgb(", "").replace(")", "").split(",")
    .map(colorValue => (colorValue > 15 ? "0" : "") + colorValue.toString(16))
    .reduce((acc, hexValue) => acc + hexValue, "#")

然后这样使用它:

const testRGB = "rgb(13,23,12)"
getHexColor(testRGB)

下面是我发现的一个解决方案,它不会在IE中抛出脚本错误: http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx

// 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``

// RGB -颜色STR,例如" RGB(12,233,43)",结果颜色十六进制,例如“# 0 ce92b” 让rgb2hex = c = > ' # ' + c.match (\ d + / g) . map (x = > (+ x) .toString (16) .padStart (2,0)) . join ' ' console.log (rgb2hex(“rgb(12233年,43”);

可读&& 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);
}