我是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个不同的变量?
试试这个:
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"]
如果你有jQuery可用,这是我刚刚提出的超紧凑版本.
var RGBtoHEX = function(color) { return "#"+$.map(color.match(/\b(\d+)\b/g),function(digit){ return ('0' + parseInt(digit).toString(16)).slice(-2) }).join(''); };
您也可以使用rgb设置CSS颜色,例如:
background-color: rgb(0, 70, 255);
它是有效的CSS,不用担心.
编辑:如果您绝对需要,请参阅nickf答案以获得转换它的好方法.
我发现了另一个功能(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]); }