17 ответов:
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]; }(источник)
вот более чистое решение, которое я написал на основе предложения @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 крючки доступно с jQuery 1.4.3, как я показал при ответе на этот вопрос: могу ли я заставить jQuery.css ("backgroundColor") возвращает шестнадцатеричный формат?
большинство браузеров, кажется, возвращают значение RGB при использовании:
$('#selector').css('backgroundColor');только т. е. (только 6 проверено до сих пор) возвращает шестнадцатеричное значение.
чтобы избежать сообщений об ошибках в т. е., вы можете обернуть функцию в Оператор 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]); }я обновил регулярное выражение, чтобы соответствовать Альфа-значению, если оно определено, но не использовать его.
вот 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('');
вот версия, которая также проверяет прозрачность, мне это было нужно, так как мой объект должен был вставить результат в атрибут стиля, где прозрачная версия шестнадцатеричного цвета на самом деле является словом "прозрачный"..
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]); } }
Readable & & Reg-exp free (no Reg-exp)
Я создал функцию, которая использует читаемые основные функции и не reg-exps.
функция принимает цвет в шестнадцатеричном формате, rgb или rgba формат CSS и возвращает шестнадцатеричное представление.
EDIT: была исправлена ошибка с разбором формата 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); }
класс цвета, взятый из bootstrap color picker
// 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()
Это выглядит немного лучше:
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 всегда возвращать 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]); } } }
функция, которая возвращает цвет фона элемента в 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; }пример использования:
$('#div1').click(function(){ alert(getBgColorHex($(this)); }
просто добавить к ответу @Justin выше..
он должен быть!--2-->
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('');как указано выше функции parse int усекает ведущие нули, таким образом, производит неправильные цветовые коды из 5 или 4 букв может быть... т. е. для rgb(216, 160, 10) он производит #d8a0a, в то время как он должен быть #d8a00a.
спасибо
вот решение, которое я нашел, что не бросает ошибки сценариев в IE: http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx
тот же ответ как @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]); };
Так как вопрос был с помощью JQuery, вот плагин JQuery на основе кода Даниэля Эллиота:
$.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));On jsfiddle
сравнение скорости на jsperf
дальнейшее улучшение может быть
trim()thergbстрокаvar rxArray = rgb.trim().match(rx),
ответ Стивена Прибилинского отбрасывает ведущие нули, например #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);
мое красивое нестандартное решение
HTML
<div id="selector" style="background-color:#f5b405"></div>jQuery
$("#selector").attr("style").replace("background-color:", "");результат
#f5b405
Comments