Sử dụng jQuery sau đây sẽ nhận được giá trị RGB của màu nền của phần tử:
$('#selector').css('backgroundColor');
Có cách nào để có được giá trị hex hơn là RGB không?
Sử dụng jQuery sau đây sẽ nhận được giá trị RGB của màu nền của phần tử:
$('#selector').css('backgroundColor');
Có cách nào để có được giá trị hex hơn là RGB không?
Câu trả lời:
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];
}
( Nguồn )
rgb.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)
Tuy nhiên, biểu thức chính được đưa ra được thiết kế để đối phó với định dạng do trình duyệt đưa ra khi sử dụng jQuery và điều này không có tính nhất quán của không gian trắng hoặc lưu giữ bạn đang nói về. Bạn cũng có thể sử dụng regex tương tự và chỉ cần loại bỏ tất cả các khoảng trắng và chuyển đổi thành chữ thường trước khi khớp trên rgb. PS Ví dụ thú vị của bạn: 'rgb (10, 128,)' Tôi không nghĩ rằng điều đó là hợp lý để thử nghiệm
Đây là giải pháp sạch hơn tôi đã viết dựa trên đề xuất @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]);
}
Một số trình duyệt đã trả về màu dưới dạng thập lục phân (kể từ Internet Explorer 8 trở xuống). Nếu bạn cần xử lý những trường hợp đó, chỉ cần thêm một điều kiện bên trong hàm, như @gfrobenius đề xuất:
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]);
}
Nếu bạn đang sử dụng jQuery và muốn một cách tiếp cận đầy đủ hơn, bạn có thể sử dụng CSS Hook có sẵn kể từ jQuery 1.4.3, như tôi đã trình bày khi trả lời câu hỏi này: Tôi có thể buộc jQuery.css ("backgroundColor") trả về định dạng thập lục phân không?
document.getElementById("your_id").currentStyle["backgroundColor"]
. Các chức năng rgb2hex()
không cần thiết. Đây là plugin jQuery sử dụng CSS Hook mà tôi đã đề xuất ở trên, đã thực hiện tất cả các xác thực để khôi phục màu trong các trình duyệt khác nhau: stackoverflow.com/questions/6177454/
$('#selector').css('backgroundColor')
sang hex, không phải giá trị rgb thành hex. Và trên IE8, $('#selector').css('backgroundColor')
đã là hex nên nó phải được xử lý. Đó là nó. Đừng giận tôi :)
rgb2hex()
chức năng, cảm ơn @ErickPetru! Tôi phải mã lại cho IE7 tin hay không. Với IE7 & 8 .css('backgroundColor')
bản địa obj.style.backgroundColor
sẽ trả về hex, không phải RGB, vì vậy tôi đã thêm đây là dòng đầu tiên trong rgb2hex()
hàm trong câu trả lời được cung cấp để nó hoạt động hoàn toàn trở lại 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
Hy vọng điều đó có ích.
Hầu hết các trình duyệt dường như trả về giá trị RGB khi sử dụng:
$('#selector').css('backgroundColor');
Chỉ IE (chỉ có 6 thử nghiệm cho đến nay) trả về giá trị Hex.
Để tránh các thông báo lỗi trong IE, bạn có thể gói hàm trong câu lệnh 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]);
}
}
Đã cập nhật @ErickPetru để tương thích với 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]);
}
Tôi đã cập nhật regex để khớp với giá trị alpha nếu được xác định, nhưng không sử dụng nó.
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)) : '');
Ngoài ra, tôi đang xóa #
biểu tượng để làm cho nó không rõ ràng về việc sử dụng cuối cùng (người ta có thể lấy đầu ra và 0x
lấy ví dụ trước, hoặc để nó không có tiền tố). Hy vọng nó sẽ giúp được ai đó!
Đây là một lớp lót ES6 không sử dụng jQuery:
var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => parseInt(color).toString(16)).join('');
Đây là một phiên bản cũng kiểm tra độ trong suốt, tôi cần điều này vì đối tượng của tôi là chèn kết quả vào thuộc tính style, trong đó phiên bản trong suốt của màu hex thực sự là từ "trong suốt" ..
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]);
}
}
Hàm trả về màu nền của một phần tử trong hex.
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;
}
ví dụ sử dụng:
$('#div1').click(function(){
alert(getBgColorHex($(this));
}
Câu trả lời giống như câu trả lời @Jim F nhưng cú pháp ES6 , vì vậy, ít hướng dẫn hơn:
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]);
};
lớp màu lấy từ bộ chọn màu bootstrap
// 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
};
}
};
cách sử dụng
var color = new Color("RGB(0,5,5)");
color.toHex()
Tôi đã tạo một hàm sử dụng các hàm cơ bản có thể đọc được và không có reg-exp.
Hàm chấp nhận màu ở định dạng CSS hex, rgb hoặc rgba và trả về biểu diễn hex.
EDIT: đã xảy ra lỗi khi phân tích cú pháp định dạng rgba (), đã sửa ...
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(")", "");
Nếu không, bạn sẽ bị bỏ lại với a,0,0,0. Và, nó trả về # 000000, màu Đen, thay vì trong suốt.
Thử
// 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``
Cái này trông đẹp hơn một chút:
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);
một lớp lót ngắn gọn hơn:
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);
buộc jQuery luôn trả về hex:
$.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]);
}
}
}
Chỉ cần thêm vào câu trả lời của @ Justin ở trên ..
nó nên
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('');
Vì các hàm phân tích int ở trên cắt bớt các số 0 đứng đầu, do đó tạo ra mã màu không chính xác gồm 5 hoặc 4 chữ cái có thể là ... tức là đối với rgb (216, 160, 10), nó tạo ra # d8a0a trong khi nó phải là # d8a00a.
Cảm ơn
Đây là một giải pháp tôi thấy rằng không gây ra lỗi script trong IE: http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx
Câu trả lời của Steven Pribilinskiy giảm các số 0 hàng đầu, ví dụ # ff0000 trở thành # ff00.
Một giải pháp là nối thêm 0 hàng đầu và chuỗi con ra khỏi 2 chữ số cuối.
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);
Vì câu hỏi đang sử dụng JQuery, đây là một plugin JQuery dựa trên mã của Daniel Elliott:
$.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));
};
Sử dụng nó như:
var hexBackgroundColor = $('#myElement').cssAsHex('background-color');
Đây là giải pháp của tôi, cũng như touppercase bằng cách sử dụng một đối số và kiểm tra các khoảng trắng và viết hoa có thể khác trong chuỗi được cung cấp.
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));
Trên jsfiddle
So sánh tốc độ trên jsperf
Một cải tiến hơn nữa có thể là để trim()
các rgb
chuỗi
var rxArray = rgb.trim().match(rx),