การใช้ jQuery ต่อไปนี้จะได้รับค่า RGB ของสีพื้นหลังขององค์ประกอบ:
$('#selector').css('backgroundColor');
มีวิธีรับค่า hex มากกว่า RGB หรือไม่?
การใช้ jQuery ต่อไปนี้จะได้รับค่า RGB ของสีพื้นหลังขององค์ประกอบ:
$('#selector').css('backgroundColor');
มีวิธีรับค่า hex มากกว่า RGB หรือไม่?
คำตอบ:
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.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)
อย่างไรก็ตาม regex ที่ได้รับนั้นถูกออกแบบมาเพื่อรับมือกับรูปแบบที่เบราว์เซอร์ให้เมื่อใช้ jQuery และสิ่งนี้ไม่ได้มีพื้นที่สีขาวที่แตกต่างกัน คุณกำลังพูดถึง คุณสามารถใช้ regex เดียวกันและเพียงแค่ลบช่องว่างทั้งหมดและแปลงเป็นตัวพิมพ์เล็กก่อนที่จะจับคู่กับ rgb PS ตัวอย่างซอของคุณ: 'rgb (10, 128,)' ฉันไม่คิดว่ามันมีเหตุผลที่จะทดสอบใน
นี่คือทางออกที่สะอาดกว่าที่ฉันเขียนตามคำแนะนำ @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 และต้องการวิธีการที่สมบูรณ์ยิ่งขึ้นคุณสามารถใช้CSS Hooksได้ตั้งแต่ jQuery 1.4.3 ดังที่ฉันแสดงเมื่อตอบคำถามนี้: ฉันสามารถบังคับให้ jQuery.css ("backgroundColor") กลับมาเป็นรูปแบบเลขฐานสิบหกได้หรือไม่
document.getElementById("your_id").currentStyle["backgroundColor"]
แล้วส่งกลับสีเป็นเลขฐานสิบหกเมื่อได้รับรูปแบบในปัจจุบันวิธีนี้: rgb2hex()
ไม่จำเป็นต้องใช้ฟังก์ชั่น นี่คือปลั๊กอิน jQuery โดยใช้ CSS Hooks ที่ฉันแนะนำไว้ข้างต้นซึ่งทำการตรวจสอบทั้งหมดเพื่อกู้คืนสีในเบราว์เซอร์ที่แตกต่างกันอยู่แล้ว: stackoverflow.com/questions/6177454/…
$('#selector').css('backgroundColor')
เป็น hex ไม่ใช่ค่า rgb เป็น hex และใน IE8 $('#selector').css('backgroundColor')
นั้นมีเลขฐานสิบหกอยู่แล้วดังนั้นจึงต้องจัดการ แค่นั้นแหละ. อย่าโกรธฉันเลย :)
rgb2hex()
ฟังก์ชั่นขอบคุณ @ErickPetru! ฉันต้องโค้ดกลับไปที่ IE7 เชื่อหรือไม่ ด้วย.css('backgroundColor')
และพื้นเมืองobj.style.backgroundColor
IE7 & 8 จะคืนค่า hex ไม่ใช่ 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
หวังว่าจะช่วยได้
เบราว์เซอร์ส่วนใหญ่ดูเหมือนจะคืนค่า RGB เมื่อใช้:
$('#selector').css('backgroundColor');
เฉพาะ IE (ทดสอบเพียง 6 ครั้งเท่านั้น) จะส่งกลับค่า Hex
เพื่อหลีกเลี่ยงข้อความแสดงข้อผิดพลาดใน 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]);
}
ฉันอัพเดต regex ให้ตรงกับค่า 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
ตัวอย่างหรือทิ้งไว้โดยไม่มีคำนำหน้า) หวังว่ามันจะช่วยให้ใครบางคน!
นี่คือซับใน ES6 หนึ่งที่ไม่ใช้ jQuery:
var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => parseInt(color).toString(16)).join('');
นี่คือรุ่นที่ตรวจสอบความโปร่งใสฉันต้องการสิ่งนี้เนื่องจากวัตถุของฉันคือการแทรกผลลัพธ์ลงในแอตทริบิวต์ของสไตล์โดยที่รุ่นโปร่งใสของสี hex เป็นคำที่ "โปร่งใส"
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]);
}
}
ฟังก์ชันที่ส่งคืนสีพื้นหลังขององค์ประกอบในรูปหกเหลี่ยม
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));
}
คำตอบเดียวกันเช่น @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]);
};
คลาสสีนำมาจากตัวเลือกสีบูตสแตรป
// 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()
ฉันได้สร้างฟังก์ชันที่ใช้ฟังก์ชั่นพื้นฐานที่อ่านได้และไม่มี reg-exps
ฟังก์ชั่นยอมรับสีในรูปแบบhex, 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 ซึ่งเป็นสีดำแทนที่จะเป็นแบบโปร่งใส
ลอง
// 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``
อันนี้ดูดีกว่านิดหน่อย:
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]);
}
}
}
เพียงเพิ่มคำตอบของ @ 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('');
เนื่องจากฟังก์ชัน int แจงส่วนตัดทอนศูนย์นำหน้าจึงสร้างรหัสสีที่ไม่ถูกต้องของตัวอักษร 5 หรือ 4 ตัวอาจเป็น ... เช่นสำหรับ rgb (216, 160, 10) จะสร้าง # d8a0a ในขณะที่ควรเป็น # d8a00a
ขอบคุณ
นี่เป็นวิธีแก้ปัญหาที่ฉันพบว่าไม่ทิ้งข้อผิดพลาดของสคริปต์ใน IE: http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx
คำตอบของ Steven Pribilinskiy ลดลงเป็นศูนย์นำตัวอย่างเช่น # ff0000 กลายเป็น # ff00
วิธีแก้ไขคือผนวก 0 นำหน้าและซับสตริงออกจาก 2 หลักสุดท้าย
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);
เนื่องจากคำถามใช้ JQuery นี่คือปลั๊กอิน JQuery ตามรหัสของ 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));
};
ใช้มันเหมือน:
var hexBackgroundColor = $('#myElement').cssAsHex('background-color');
นี่คือวิธีแก้ปัญหาของฉันก็คือ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),
โซลูชันที่ไม่ได้มาตรฐานที่สวยงามของฉัน
HTML
<div id="selector" style="background-color:#f5b405"></div>
jQuery
$("#selector").attr("style").replace("background-color:", "");
ผลลัพธ์
#f5b405