it-swarm.com.ru

Цвет фона с шестнадцатеричной переменной JavaScript

Я новичок в JavaScript и jQuery, и теперь я столкнулся с проблемой:

Мне нужно отправить некоторые данные в PHP, и один бит данных должен быть шестнадцатеричным цветом фона div X.

в jQuery есть функция css ("background-color"), и с ее помощью я могу получить значение RGB фона в переменную JavaScript.

Кажется, что функция CSS возвращает строку вроде этого rgb (0, 70, 255). 

Я не смог найти какой-либо способ получить шестнадцатеричный цвет фона (хотя в CSS он задан как шестнадцатеричный).

Похоже, мне нужно преобразовать это. Я нашел функцию для преобразования RGB в hex, но ее нужно вызывать с тремя разными переменными, r, g и b. Поэтому мне нужно разобрать строку rgb (x, xx, xxx) в var r = x; var g = xx; var b = xxx; как-то. 

Я пытался гуглить парсинг строк с помощью JavaScript, но я не совсем понял, что такое регулярные выражения. 

Есть ли способ получить цвет фона div в шестнадцатеричном формате или строку можно преобразовать в 3 разные переменные?

36
Removed_account

попробуйте это:

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"]
62
nickf

Если у вас есть jQuery, это суперкомпактная версия, которую я только что придумал.

 var RGBtoHEX = функция (цвет) {
 return "#" + $. map (color.match (/\b (\ d +)\b/g), функция (цифра) {
 return ('0' + parseInt (цифра) .toString (16)) .slice (-2) 
}). join (''); 
}; 
10
Fotios

Вы также можете установить цвет CSS с помощью rgb, например так:

background-color: rgb(0, 70, 255);

Это правильный CSS , не волнуйтесь.


Правка: См. ответ nickf , чтобы найти хороший способ конвертировать его, если вам это абсолютно необходимо.

8
lpfavreau

Некоторое время назад я нашел другую функцию ( по R0bb13 ). В нем нет регулярного выражения, поэтому мне пришлось позаимствовать его у nickf, чтобы он работал правильно. Я публикую его только потому, что это интересный метод, который не использует оператор if или цикл для получения результата. Также этот скрипт возвращает шестнадцатеричное значение с символом # (оно было необходимо для 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

Примечание: шестнадцатеричный результат скрипта Никфа должен быть 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
Mottie

С 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;
};
3
Mark Rhodes

Эти решения потерпят неудачу в Chrome, так как он возвращает rgba (x, x, x, x) для цвета фона.

Правка: Это не обязательно правда. Chrome по-прежнему устанавливает фон с помощью rgb (), в зависимости от того, что вы делаете. Скорее всего, пока не используется альфа-канал, Chrome будет отвечать с помощью rgb вместо rgba.

1
Kevin.Riggen

Что касается этого решения, функция 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.

Значение style.background, например: "none no-repeat scroll rgb(0, 0, 0)", легко преобразовать в "none no-repeat scroll #000000", просто выполнив stringRGB2HEX(style.background)

1
Marco Demaio

http://www.phpied.com/rgb-color-parser-in-javascript/

Класс JavaScript, который принимает строку и пытается определить допустимый цвет из нее. Некоторые принятые входные данные, например:

* rgb(0, 23, 255)
* #336699
* ffee66
* fb0
* red
* darkblue
* cadet blue
1
user558987

Я нашел это решение http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx и я использую его в своем проекте

0
Amr Elgarhy

Итак, это позволит вам использовать $ (селектор) .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]);
}
0
The Virtual Machinist