Background-color Hex to JavaScript variable

Jestem trochę nowy w JavaScript i jQuery i teraz mam problem:

Muszę wrzucić trochę danych do PHP i jeden bit danych musi być hex koloru tła div X.

JQuery posiada funkcję css ("background-color") i dzięki niej mogę uzyskać wartość RGB tła do zmiennej JavaScript.

Funkcja CSS wydaje się zwracać łańcuch taki jak ten RGB (0, 70, 255).

Nie mogłem znaleźć sposobu, aby uzyskać hex koloru tła (mimo jest ustawiony jako hex w CSS).

Więc wygląda na to, że muszę to przekonwertować. Znalazłem funkcję do konwersji RGB NA hex, ale musi być wywołana z trzema różnymi zmiennymi, r, G i b. więc musiałbym parsować łańcuch rgb(x,xx,xxx) do var r=x; var g=xx; var b=xxx; jakoś.

Próbowałem googlować parsowanie ciągów za pomocą JavaScript, ale tak naprawdę nie rozumiałem wyrażeń regularnych.

Czy istnieje sposób, aby uzyskać kolor tła div jako hex, czy może łańcuch być konwertowane na 3 różne zmienne?

Author: Blazemonger, 2009-03-12

10 answers

Wypróbuj to:

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"

W odpowiedzi na pytanie w komentarzach poniżej:

Próbuję zmodyfikować regex tak, aby obsługiwał zarówno rgb, jak i rgba, w zależności od tego, który z nich dostanę. Jakieś wskazówki? Dzięki.

Nie jestem do końca pewien, czy to ma sens w kontekście tego pytania (ponieważ nie można reprezentować koloru rgba w hex), ale myślę, że mogą być inne zastosowania. W każdym razie możesz zmienić wyrażenie regularne na takie:

/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(0\.\d+))?\)$/

Przykładowe wyjście:

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
Author: nickf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-06 12:26:52

Jeśli masz jQuery dostępny, jest to super-kompaktowa wersja, którą właśnie wymyśliłem.

var RGBtoHEX = function(color) {
  return "#"+$.map(color.match(/\b(\d+)\b/g),function(digit){
    return ('0' + parseInt(digit).toString(16)).slice(-2)
  }).join('');
};
 10
Author: Fotios,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-10 23:04:02

Możesz również ustawić kolor CSS używając rgb, na przykład:

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

Jest to poprawny CSS , nie martw się.


Edit: Zobacz nickf answer dla miłego sposobu, aby przekonwertować go, jeśli absolutnie trzeba.

 8
Author: lpfavreau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:30:26

Znalazłem inną funkcję jakiś czas temu (przez R0bb13 ). Nie ma regex, więc musiałem pożyczyć go od nickf, aby działał poprawnie. Zamieszczam go tylko dlatego, że jest to ciekawa metoda, która nie używa instrukcji if ani pętli, aby dać ci wynik. Również ten skrypt zwraca wartość szesnastkową za pomocą # (była potrzebna przez Farbtastic plugin, którego używałem w tym czasie)

//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

Uwaga: wynik hex ze skryptu nickf powinien wynosić 0046ff, a nie 0070ff, ale nie jest duży umowa: p

Update, another better alternatywna metoda:

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
Author: Mottie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-16 04:40:17

Z 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
Author: Mark Rhodes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-16 14:25:48

Te rozwiązania zawiodą w Chrome, ponieważ zwraca rgba (x, x,X,x) dla koloru tła.

EDIT: to niekoniecznie prawda. Chrome nadal będzie ustawiać tła za pomocą RGB (), w zależności od tego, co robisz. Najprawdopodobniej tak długo, jak nie ma zastosowanego kanału alfa, Chrome odpowie rgb zamiast rgba.

 1
Author: Kevin.Riggen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-22 19:56:41

Co powiesz na to rozwiązanie, funkcja stringRGB2HEX zwraca kopię ciągu wejściowego,w którym wszystkie występujące kolory w formacie "rgb(R,g, b)" zostały zastąpione przez format hex "#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;
   }

Ten konwertuje również kolory rgb w złożonych stylach, takich jak background.

A style.background wartość taka jak: "none no-repeat scroll rgb(0, 0, 0)" jest łatwo przekonwertowana na "none no-repeat scroll #000000" po prostu wykonując stringRGB2HEX(style.background)

 1
Author: Marco Demaio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-21 09:42:44

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

Klasa JavaScript, która akceptuje ciąg znaków i próbuje dowiedzieć się poprawnego koloru z niego. Niektóre akceptowane wejścia to na przykład:

* rgb(0, 23, 255)
* #336699
* ffee66
* fb0
* red
* darkblue
* cadet blue
 1
Author: user558987,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-20 07:54:42

Znalazłem to rozwiązanie http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx i używam go w moim projekcie

 0
Author: Amr Elgarhy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-11 14:38:40

Proszę bardzo, pozwoli to na użycie $(selektor).getHexBackgroundColor (), aby łatwo zwrócić wartość szesnastkową :

$.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
Author: The Virtual Machinist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 04:23:01