【问题标题】:Background-color hex to JavaScript variableJavaScript 变量的背景颜色十六进制
【发布时间】:2010-10-12 22:37:23
【问题描述】:

我是 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;变量 g=xx;变量 b=xxx;不知何故。

我尝试用 google 解析字符串与 JavaScript,但我并没有真正理解正则表达式的东西。

有没有办法让div的背景颜色为十六进制,或者字符串可以转换成3个不同的变量?

【问题讨论】:

    标签: javascript jquery hex rgb background-color


    【解决方案1】:

    如果你有 jQuery,这是我刚刚想出的超紧凑版本。

    var RGBtoHEX = 函数(颜色){ return "#"+$.map(color.match(/\b(\d+)\b/g),function(digit){ return ('0' + parseInt(digit).toString(16)).slice(-2) })。加入(''); };

    【讨论】:

    • 现在我们甚至不需要 jQuery 来进行映射。这是香草版本:var RGBtoHEX = function(color) { return "#"+(color.match(/\b(\d+)\b/g).map(function(digit){ return ('0' + parseInt(digit).toString(16)).slice(-2) })).join(''); };
    【解决方案2】:

    试试这个:

    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"
    

    针对以下cmets中的问题:

    我正在尝试修改正则表达式以同时处理 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"]
    

    【讨论】:

    • 零件不应该是 ["rgb(0, 70, 255)","0","70","255"]?
    • 我喜欢 StackOverflow。谢谢,不想自己解决这个问题。 :-P
    • @Neal 或任何其他有此问题的人:在 IE 中,jquery 1.4.4 返回十六进制代码而不是 rgb 字符串。所以parts 为null,因为正则表达式不匹配,这会在使用parts 时导致错误。如果parts为null,我必须在删除之前添加一个检查并返回原始字符串。
    • @nickf 之前忘记感谢你了。顺便说一句,我在末尾添加了 /^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(1|0|0\.\d+))?\)$/ |0 以检查 alpha 何时仅为 0 而不是 0.x
    • @fortuneRice 我认为应该是(1|0|0?\.d+),因为.3 是有效的。
    【解决方案3】:

    来吧,这将允许您使用 $(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]);
    }
    

    【讨论】:

      【解决方案4】:

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

      接受字符串并尝试从中找出有效颜色的 JavaScript 类。一些接受的输入例如:

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

      【讨论】:

      • ffee66fb0 不是 CSS 中的有效颜色。也许你应该先尝试一下。
      【解决方案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】:

        这个解决方案怎么样,函数 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)" 只需执行 stringRGB2HEX(style.background) 即可轻松转换为 "none no-repeat scroll #000000"

        【讨论】:

          【解决方案7】:

          这些解决方案在 Chrome 中会失败,因为它会返回 rgba(x,x,x,x) 作为背景颜色。

          编辑:这不一定是真的。 Chrome 仍将使用 rgb() 设置背景,具体取决于您在做什么。很可能只要没有应用 Alpha 通道,Chrome 就会以 rgb 而不是 rgba 响应。

          【讨论】:

            【解决方案8】:

            不久前我发现了另一个函数 (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]);
            }
            

            【讨论】:

            • 我宁愿将函数 hex(x) 移出函数 rgb2hex 的范围以提高性能。无论如何,这是一个很好的干净解决方案,谢谢分享。看看我的下面,我想听听你的意见。
            【解决方案9】:

            我找到了这个解决方案http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx,我正在我的项目中使用它

            【讨论】:

            • 链接提供的解决方案是错误的,因为将“rgb(0, 0, 0)”转换为“#0”而不是“#000000”,原因是
            【解决方案10】:

            您也可以使用 rgb 设置 CSS 颜色,例如:

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

            valid CSS,别担心。


            编辑:如果您绝对需要,请参阅nickf answer 以了解转换它的好方法。

            【讨论】:

            • +1 - 如果稍后必须在某些网页上恢复颜色,那么为什么要进行任何转换工作:)
            猜你喜欢
            • 2016-04-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-26
            • 2019-07-20
            • 2018-06-06
            • 2018-01-05
            相关资源
            最近更新 更多