Исходное значение цвета hex для переменной JavaScript
Я немного новичок в JavaScript и jQuery, и теперь у меня возникла проблема:
Мне нужно отправить некоторые данные на PHP, и один бит данных должен быть шестнадцатеричным цветом фона div X.
jQuery имеет функцию css ( "background-color" ), и с ней я могу получить значение RGB фона в переменной JavaScript.
Кажется, что функция CSS возвращает строку, подобную этой rgb (0, 70, 255).
Я не мог найти способ получить шестнадцатеричный фоновый цвет (хотя он был установлен как hex в CSS).
Мне кажется, мне нужно его преобразовать. Я нашел функцию преобразования RGB в hex, но ее нужно вызвать с тремя разными переменными: r, g и b. Поэтому мне нужно будет разобрать строку rgb (x, xx, xxx) в var r = x; var g = xx; var b = xxx; как-то.
Я попытался разобрать строки в JavaScript с помощью JavaScript, но я не понял вещи регулярных выражений.
Есть ли способ получить фоновый цвет div как hex или преобразовать строку в 3 разные переменные?
Ответы
Ответ 1
попробуйте это:
var rgbString = "rgb(0, 70, 255)"; // get this in whatever way.
var parts = rgbString.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
// parts now should be ["rgb(0, 70, 255", "0", "70", "255"]
delete (parts[0]);
for (var i = 1; i <= 3; ++i) {
parts[i] = parseInt(parts[i]).toString(16);
if (parts[i].length == 1) parts[i] = '0' + parts[i];
}
var hexString ='#'+parts.join('').toUpperCase(); // "#0070FF"
В ответ на вопрос в комментариях ниже:
Я пытаюсь изменить регулярное выражение для обработки как rgb, так и rgba, в зависимости от того, какой я получаю. Любые намеки? Благодарю.
Я не совсем уверен, имеет ли смысл в контексте этого вопроса (поскольку вы не можете представлять цвет rgba в шестнадцатеричном формате), но я думаю, что могут быть и другие применения. В любом случае, вы можете изменить регулярное выражение таким образом:
/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(0\.\d+))?\)$/
Пример вывода:
var d = document.createElement('div');
d.style.backgroundColor = 'rgba( 255, 60, 50, 0)';
/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(1|0\.\d+))?\)$/.exec(d.style.backgroundColor);
// ["rgba(255, 60, 50, 0.33)", "255", "60", "50", "0.33"]
Ответ 2
Если у вас есть jQuery, это суперкомпактная версия, с которой я только что придумал.
var RGBtoHEX = function(color) {
return "#"+$.map(color.match(/\b(\d+)\b/g),function(digit){
return ('0' + parseInt(digit).toString(16)).slice(-2)
}).join('');
};
Ответ 3
Вы также можете установить цвет CSS с помощью rgb, например:
background-color: rgb(0, 70, 255);
действительный CSS, не беспокойтесь.
Изменить: См. nickf answer для приятного способа его преобразования, если вам абсолютно необходимо.
Ответ 4
Я снова нашел другую функцию (по R0bb13). У него нет регулярного выражения, поэтому мне пришлось заимствовать его из nickf, чтобы он работал правильно. Я просто отправляю его, потому что это интересный метод, который не использует оператор if или цикл, чтобы дать вам результат. Также этот script возвращает шестнадцатеричное значение с помощью # (это необходимо для Farbtastic плагина, который я использовал в то время)
//Function to convert hex format to a rgb color
function rgb2hex(rgb) {
var hexDigits = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
function hex(x) {
return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
}
return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}
// call the function: rgb( "rgb(0, 70, 255)" );
// returns: #0046ff
Примечание: шестнадцатеричный результат из nickf script должен быть 0046ff, а не 0070ff, но не имеет большого значения: P
Обновить, другой лучший альтернативный метод:
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]);
}
Ответ 5
С помощью JQuery..
var cssColorToHex = function(colorStr){
var hex = '#';
$.each(colorStr.substring(4).split(','), function(i, str){
var h = ($.trim(str.replace(')',''))*1).toString(16);
hex += (h.length == 1) ? "0" + h : h;
});
return hex;
};
Ответ 6
Эти решения не будут работать в Chrome, так как он возвращает rgba (x, x, x, x) для фона.
EDIT: Это не обязательно так. Chrome по-прежнему будет устанавливать фоны, используя rgb(), в зависимости от того, что вы делаете. Скорее всего, пока альфа-канал не применяется, Chrome ответит rgb вместо rgba.
Ответ 7
Как насчет этого решения, функция stringRGB2HEX возвращает копию входной строки, где все события цветов в формате "rgb (r, g, b)" заменены шестнадцатеричным форматом "#rrggbb".
//function for private usage of the function below
//(declaring this one in global scope should make it faster rather than
//declaraing it as temporary function inside stringRGB2HEX that need to be
//instantieted at every call of stringRGB2HEX
function _rgb2hex(rgb_string, r, g, b)
{
//VERY IMPORTANT: by adding (1 << 24) we avoid 'rgb(0, 0, 0)' to be mistakenly converted into '#0'
var rgb = (1 << 24) | (parseInt(r) << 16) | (parseInt(g) << 8) | parseInt(b); //same thing of: ( r + (256 * g) + (65536 * b) + 16777216)
//toString(16) specify hex 16 radix, works only for numbers [source: http://msdn.microsoft.com/en-us/library/dwab3ed2(v=VS.85).aspx]
return '#' + rgb.toString(16).substr(1); //substr(1) because we have to remove the (1 << 24) added above
}
function stringRGB2HEX(string)
{
if(typeof string === 'string')
string = string.replace(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/g, _rgb2hex);
return string;
}
Этот конвертирует также цвета rgb в сложных стилях, таких как background
.
A style.background
Значение типа: "none no-repeat scroll rgb(0, 0, 0)"
легко преобразуется в "none no-repeat scroll #000000"
, просто делая stringRGB2HEX(style.background)
Ответ 8
http://www.phpied.com/rgb-color-parser-in-javascript/
Класс JavaScript, который принимает строку и пытается определить допустимый цвет. Некоторые принятые входные данные, например:
* rgb(0, 23, 255)
* #336699
* ffee66
* fb0
* red
* darkblue
* cadet blue
Ответ 9
Я нашел это решение http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx, и я использую его в своем проекте
Ответ 10
Здесь вы идете, это позволит вам использовать $(селектор).getHexBackgroundColor(), чтобы легко получить шестнадцатеричное значение:
$.fn.getHexBackgroundColor = function() {
var rgb = $(this).css('background-color');
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]);
}