Aşağıdaki jQuery kullanıldığında, öğenin arka plan renginin RGB değeri elde edilir:
$('#selector').css('backgroundColor');
RGB yerine onaltılık değeri almanın bir yolu var mı?
Aşağıdaki jQuery kullanıldığında, öğenin arka plan renginin RGB değeri elde edilir:
$('#selector').css('backgroundColor');
RGB yerine onaltılık değeri almanın bir yolu var mı?
Yanıtlar:
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];
}
( Kaynak )
rgb.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)
Bununla birlikte, verilen normal ifade, jQuery kullanırken bir tarayıcı tarafından verilen biçim ile başa çıkmak üzere tasarlanmıştır ve bu, farklı beyaz boşluk veya captilisation tutarlılıklarına sahip değildir. HAKKINDA konusuyorsun. Aynı regex'i kullanabilir ve tüm beyaz alanları kaldırabilir ve rgb ile eşleştirmeden önce küçük harfe dönüştürebilirsiniz. PS Keman örneğiniz: 'rgb (10, 128,)' Bunun test edilmesi makul olduğunu düşünmüyorum
@Matt önerisine göre yazdığım daha temiz çözüm:
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]);
}
Bazı tarayıcılar renkleri onaltılık olarak döndürür (Internet Explorer 8 ve sonraki sürümlerden itibaren). Bu durumlarla ilgilenmeniz gerekiyorsa, işlevin içine @gfrobenius'un önerdiği gibi bir koşul ekleyin:
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 kullanıyorsanız ve daha eksiksiz bir yaklaşım istiyorsanız, bu soruyu yanıtlarken gösterdiğim gibi jQuery 1.4.3'ten beri mevcut olan CSS Kancalarını kullanabilirsiniz: jQuery.css ("backgroundColor") onaltılık biçimde döndürülmesini zorlayabilir miyim?
document.getElementById("your_id").currentStyle["backgroundColor"]
. İşlev rgb2hex()
gerekli değildir. Yukarıda önerdiğim CSS Kancalarını kullanan jQuery eklentisi, zaten farklı tarayıcılarda renkleri kurtarmak için tüm doğrulamaları zaten yapıyor: stackoverflow.com/questions/6177454/…
$('#selector').css('backgroundColor')
, bir rgb değerini hex'e değil, hex'e dönüştürmeyi istedi . Ve IE8'de, $('#selector').css('backgroundColor')
zaten hex olduğundan ele alınmalıdır. Bu kadar. Bana kızma :)
rgb2hex()
fonksiyona ekledim , teşekkürler @ErickPetru! Ben inan ya da inan IE7 geri kodlamak zorunda. Ile .css('backgroundColor')
ve yerli obj.style.backgroundColor
IE7 & 8 RGB değil hex döndürür, bu yüzden rgb2hex()
verilen cevap işlevinde ilk satır olarak bunu ekledi böylece IE7 için sonuna kadar çalışır: /* 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
Umut yardımcı olur.
Çoğu tarayıcı kullanırken RGB değerini döndürüyor gibi görünüyor:
$('#selector').css('backgroundColor');
Yalnızca IE (şu ana kadar test edilen yalnızca 6 adet) Hex değerini döndürür.
IE'de hata iletilerinden kaçınmak için, işlevi bir if ifadesinde kapatabilirsiniz:
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 uyumluluğu için @ErickPetru güncellendi:
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]);
}
Normal ifadeyi, tanımlanmışsa alfa değeriyle eşleşecek şekilde güncelledim, ancak kullanmıyorum.
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)) : '');
Ayrıca #
, son kullanımdan agnostik hale getirmek için sembolü kaldırıyorum (biri çıktıyı alıp başa ekleyebilir 0x
veya önek olmadan bırakabilir). Umarım birine yardım eder!
İşte jQuery kullanmayan bir ES6 tek astar:
var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => parseInt(color).toString(16)).join('');
İşte aynı zamanda saydamlığı kontrol eden bir versiyon, nesneyi onaltılık bir rengin saydam versiyonunun aslında "saydam" kelimesi olduğu bir stil niteliğine eklemek olduğu için buna ihtiyacım vardı.
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]);
}
}
Onaltılık bir öğenin arka plan rengini döndüren işlev.
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;
}
kullanım örneği:
$('#div1').click(function(){
alert(getBgColorHex($(this));
}
@Jim F yanıtıyla aynı cevap ama ES6 sözdizimi, bu yüzden daha az talimat:
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]);
};
Bootstrap renk seçiciden alınan renk sınıfı
// 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
};
}
};
nasıl kullanılır
var color = new Color("RGB(0,5,5)");
color.toHex()
Okunabilir temel fonksiyonları ve reg-exps kullanan bir fonksiyon yarattım.
İşlev, onaltılık, rgb veya rgba CSS biçimindeki renkleri kabul eder ve onaltılık temsili döndürür.
EDIT: rgba () biçimini ayrıştırmada bir hata oluştu, düzeltildi ...
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(")", "");
Aksi takdirde, 0,0,0,0 ile ayrılırsınız. Saydam yerine Siyah olan # 000000 değerini döndürür.
Deneyin
// 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``
Bu biraz daha hoş görünüyor:
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);
daha özlü bir astar:
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'yi her zaman hex döndürmeye zorlama:
$.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]);
}
}
}
Yukarıdaki @ Justin'in cevabına eklemek için ..
olmalı
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('');
Yukarıdaki ayrıştırma int işlevleri önde gelen sıfırları kısalttığından, 5 veya 4 harflik yanlış renk kodları üretebilir ... yani rgb (216, 160, 10) için # d8a0a olması gerekirken # d8a00a üretir.
Teşekkürler
İşte IE'de komut dosyası hataları atmayan bir çözüm: http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx
Steven Pribilinskiy'nin cevabı önde gelen sıfırları düşürüyor, örneğin # ff0000 # ff00 oluyor.
Bir çözüm, önde gelen 0 ve son 2 basamaktan alt dize eklemektir.
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);
Soru JQuery kullandığından, Daniel Elliott koduna dayanan bir JQuery eklentisi:
$.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));
};
Gibi kullanın:
var hexBackgroundColor = $('#myElement').cssAsHex('background-color');
Burada da yok benim çözümdür toUpperCase sağlanan dizede diğer olası beyaz boşluklar ve büyük harf için bir argüman ve çeklerin kullanımıyla.
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));
Açık jsfiddle
Jsperf'de hız karşılaştırması
Bir başka gelişme bağlı olabilir dizetrim()
rgb
var rxArray = rgb.trim().match(rx),