使用以下jQuery代码可以获取元素背景色的RGB值:
$('#selector').css('backgroundColor');
有没有办法获取十六进制值而非RGB值?
使用以下jQuery代码可以获取元素背景色的RGB值:
$('#selector').css('backgroundColor');
有没有办法获取十六进制值而非RGB值?
使用这个干净的一行函数,支持 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('')}`
自我最初回答此问题以来,已经过去了很长时间。现在,像箭头函数、Array.map、String.padStart和模板字符串等酷炫的ECMAScript 5和2015+功能已经在浏览器上广泛使用。几年来,可以编写跨浏览器的一行代码rgb2hex
:
const rgb2hex = (rgb) => `#${rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/).slice(1).map(n => parseInt(n, 10).toString(16).padStart(2, '0')).join('')}`
// Use as you wish...
console.log(rgb2hex('rgb(0,0,0)'))
console.log(rgb2hex('rgb(255, 255, 255)'))
console.log(rgb2hex('rgb(255,0,0)'))
console.log(rgb2hex('rgb(38, 170, 90)'))
rgb
字符串中的每个数字,使用slice(1)
获取数字(match
的第一个结果是完整的字符串本身),使用map
迭代每个数字,每次迭代将其转换为parseInt
中的Number
,然后再转换为十六进制String
(通过基数16转换),如果需要则使用padStart
添加零。最后,使用join
将每个转换/调整后的数字连接成以'#'
开头的唯一String
。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的世界,请继续阅读。
这是我根据@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]);
}
$('#selector').css('backgroundColor')
转换为十六进制,而不是将RGB值转换为十六进制。在IE8上,$('#selector').css('backgroundColor')
已经是十六进制,因此必须进行处理。就这样,不要对我发脾气 :) - Ghigorgb2hex()
函数中,感谢 @ErickPetru!你们可能不信,我必须要编写兼容 IE7 的代码。使用 .css('backgroundColor')
和本地的 obj.style.backgroundColor
,IE7 和 IE8 将返回十六进制值而不是 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); //我进行了子字符串操作,因为我不想要前导的 # 符号。希望这有所帮助。 - gfrobeniusvar 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];
}
(来源)
rgb.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)
然而,给定的正则表达式是为了处理使用jQuery时浏览器提供的格式而设计的,这并没有你所说的不同的空格或大小写一致性。你也可以使用相同的正则表达式,在匹配rgb之前删除所有空格并转换为小写。另外,关于你的fiddle示例:'rgb(10, 128,)',我认为这不是一个合理的测试。 - binderbound大多数浏览器在使用以下代码时似乎返回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]);
}
}
为了兼容rgba,更新了@ErickPetru的代码:
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 值(如果被定义),但不使用它。
return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]) /* 如果存在,则添加alpha通道 */ + (rgb[5] !== undefined ? hex(Math.round(rgb[5] * 255)) : '');
同时我删除了“#”符号,以使其不依赖于最终使用(例如,可以获取输出并在前面添加“0x”,或者保留没有前缀)。希望它能对某个人有所帮助! - Óscar Gómez Alcañiz这里有一个ES6只需一行代码就能完成而不需要使用jQuery的方法:
var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => parseInt(color).toString(16).padStart(2, '0')).join('');
parseInt('0').toString(16)#=> '0'
,如果是单个数字,则必须填充字符串parseInt('0').toString(16).padStart(2,'0')=> '00'
。 - SidOfcfunction 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]);
}
}
// 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 - 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``
console.log(rgb2hex("rgb(12,233,43"));
返回元素背景颜色的十六进制函数。
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));
}
我创建了一个使用易于理解的基本函数且不使用正则表达式的函数。
该函数接受以十六进制、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);
}
.replace("rgba", "") .replace("rgb", "") .replace("(", "") .replace(")", "");
否则,你会得到a0,0,0,0。并且,它返回#000000,这是黑色,而不是透明的。 - Twelve24相同的答案喜欢@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]);
};