使用以下 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('')}`
自从我最初回答这个问题以来已经过去了很长时间。然后很酷的 ECMAScript 5 和 2015+ 特性在浏览器上大量可用,如箭头函数、Array.map、String.padStart和模板字符串。所以现在可以写一个单行了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
遍历每个数字,每次迭代转换为Number
with parseInt
,然后返回为十六进制String
(通过 base-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]);
}
如果您正在使用 jQuery 并想要更完整的方法,您可以使用自 jQuery 1.4.3 以来可用的CSS Hooks,正如我在回答这个问题时所展示的:Can I force jQuery.css("backgroundColor") returns on hexadecimal format?
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];
}
(来源)
大多数浏览器在使用时似乎会返回 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]);
}
}
更新了@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 值,但不使用它。
这是一个不使用 jQuery 的 ES6 one liner:
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('');