我是JavaScript和jQuery的新手,现在我遇到了一个问题:
我需要将一些数据发布到PHP,并且一位数据需要是div X的背景颜色十六进制。
jQuery具有css(“background-color”)功能,通过它我可以将背景的RGB值变为JavaScript变量。
CSS函数似乎返回一个像这个rgb(0,70,255)的字符串。
我找不到任何方法来获取背景颜色的十六进制(即使它在CSS中设置为十六进制)。
所以我似乎需要转换它。我发现了一个将RGB转换为十六进制的函数,但需要使用三个不同的变量r,g和b来调用它。所以我需要将字符串rgb(x,xx,xxx)解析为var r = x; var g = xx; var b = xxx;不知何故。
我尝试使用JavaScript解析字符串,但我并不真正了解正则表达式。
有没有办法将div的背景颜色变为十六进制,还是可以将字符串转换为3个不同的变量?
答案 0 :(得分:62)
试试这个:
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"]
答案 1 :(得分:10)
如果你有jQuery可用,这是我刚刚提出的超紧凑版本。
var RGBtoHEX = function(color) { return "#"+$.map(color.match(/\b(\d+)\b/g),function(digit){ return ('0' + parseInt(digit).toString(16)).slice(-2) }).join(''); };
答案 2 :(得分:8)
您也可以使用rgb设置CSS颜色,例如:
background-color: rgb(0, 70, 255);
valid CSS,请不要担心。
修改:如果您绝对需要,请参阅nickf answer以获得转换它的好方法。
答案 3 :(得分:5)
我发现了另一个功能(by 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
注意:nickf脚本的十六进制结果应该是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]);
}
答案 4 :(得分:3)
使用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;
};
答案 5 :(得分:1)
这些解决方案在Chrome中会失败,因为它会返回背景颜色的rgba(x,x,x,x)。
编辑:这不一定是真的。 Chrome仍将使用rgb()设置背景,具体取决于您的操作。最有可能的是,只要没有应用Alpha通道,Chrome就会使用rgb而不是rgba进行响应。答案 6 :(得分:1)
此解决方案如何,函数 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)
答案 7 :(得分:1)
http://www.phpied.com/rgb-color-parser-in-javascript/
一个JavaScript类,它接受一个字符串并试图从中找出一个有效的颜色。一些接受的输入例如是:
* rgb(0, 23, 255)
* #336699
* ffee66
* fb0
* red
* darkblue
* cadet blue
答案 8 :(得分:0)
我找到了这个解决方案http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx,我在我的项目中使用它
答案 9 :(得分:0)
在这里,这将允许您使用$(selector).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]);
}