【问题标题】:javascript random color with 7digits must7位必须的javascript随机颜色
【发布时间】:2011-05-29 02:36:02
【问题描述】:

我发现以下很棒的脚本可以用 javascript 创建随机颜色。

var randColor = '#'+(Math.random()*0xFFFFFF<<0).toString(16);

我对这个脚本的唯一问题是它不能保证它返回一个正常的 7 位十六进制字符串。

有时它只有 6 位数字,例如 #e1d19。

有没有办法强制 7 位十六进制值?

感谢您的帮助。

编辑:这是我的实际问题:

function randColor() {
    var randColor = '#'+(Math.random()*0xFFFFFF<<0).toString(16);
    return randColor;
}

for (var i=0; i<100; i++) {
    $("#colorpicker").append("<div class='color' title="+randColor()+" style='background:"+randColor()+"'></div>");
}

我正在创建具有随机颜色的小 div,当我单击它们时,我会获取它们的标题属性并为我的身体背景着色。

但是目前我的代码以

结尾
<div style="background:rgb(176, 249, 252);" title="#8bc47d" class="color"></div>

所以当我获取标题属性时,我给身体的颜色与小 div 显示的颜色不同。

【问题讨论】:

  • 严格来说,你要的是一个6位的十六进制值,前面加一个“#”字符,一共7个字符。
  • 你得到不同的颜色,因为你调用 randColor 两次,给你两种不同的颜色。您需要调用一次,将其存储在一个变量中并使用该变量两次。

标签: javascript colors random


【解决方案1】:

没有人发布它,这是我获得随机颜色的最短代码。

'#'+Math.random().toString(16).slice(-6)
  • 它会得到一个随机浮点数 0.437920...
  • 将其转换为十六进制,您将得到类似 0.7c13b41830e33 的内容
  • 取最后 6 个字符,这将为您提供随机颜色#

简单易懂、简短高效。

【讨论】:

    【解决方案2】:
    var randColor = '#'+(0xFFFFFFFF-Math.random()*0xFFFFFFFF).toString(16).substr(0, 6);
    

    【讨论】:

    • 目前为止最好的答案,最不复杂,读起来很好;赞!
    • ... 除了,Math.random() 返回 0.99 时呢?减法问题的结果将是一个接近于零的数字,因此我们将面临完全相同的问题。
    • 你说得对。但在这种情况下,浏览器呈现白色。这是把戏:)
    • 还有一件事。数学随机返回一个小数点后 16 位的数字。返回 0.9900000000000000 的概率是多少?这不是一个把戏:)
    • @Lex ??当Math.random() 返回接近 1 的数字时,括号中的表达式将是一个小整数,对吧?当您将该小整数转换为字符串时,它将少于 6 位。这将如何产生有效的颜色字符串?
    【解决方案3】:

    您希望它是六位数,而不是七位数,但生成的字符串应该是七个字符长,包括哈希。吹毛求疵,我知道,但仍然。这个怎么样:

    var color = (Math.random() * 0xFFFFFF << 0).toString(16);
    "#" + String(color + "000000").slice(0, 6);
    

    如果你想在开头填充,应该这样做:

    var color = (Math.random() * 0xFFFFFF << 0).toString(16);
    "#" + String("000000" + color).slice(-6);
    

    为了澄清,这将填充 整个 字符串,而不是单独的通道。我在想,由于您没有对每个通道进行随机化,因此实际上只有您要填充的红色或蓝色通道(可能是红色,即第二个 sn-p)。

    您的第二个问题是您调用 randColor 两次,给您两种不同的颜色。您需要将生成的颜色存储在一个变量中,然后使用该变量两次。

    for (var i=0; i<100; i++) {
        var color = randColor();
        $("#colorpicker").append("<div class='color' title=" + color + " style='background:" + color + "'></div>");
    }
    

    【讨论】:

      【解决方案4】:

      您可以自己填充:

      function randomColor() {
        var rc = (~~(Math.random() * 0xFFFFFF)).toString(16);
        return '#' + new Array(7 - rc.length).join('0') + rc;
      }
      

      这招:

      new Array(n).join(char)
      

      是一种在字符串中获取“char”的n - 1 副本的方法。我从 7 而不是 6 中减去值的原始长度,这样当字符串长度为 5 个字符时,我得到一个零,当 4 时得到两个,等等。

      edit - 当然(如其他答案中所述)您也可以像这样获得填充零:

        return '#' + "000000".slice(rc.length) + rc;
      

      我必须做一件愚蠢的 jsperf 事情来看看哪个更快:-)

      【讨论】:

      • return '#' + ("000000" + rc).slice(-6);
      • 是的,这也有效——认为“切片”的否定论点会引起一些浏览器没有实现它的记忆;也许很久以前。
      【解决方案5】:

      我认为最好的办法是制作 3 组 2 位十六进制数字(R、G 和 B 各一组)。然后,只需用 0 向左填充,以确保它们都是两位数。也许像我提供的这个未经测试的代码以供参考:)

      //I am GUESSING that this is how you get a 2-digit hex value ranging 0-255
      var r = PadDigits(Math.random()*0xFF<<0).toString(16),2);
      var g = PadDigits(Math.random()*0xFF<<0).toString(16),2);
      var b = PadDigits(Math.random()*0xFF<<0).toString(16),2);
      
      var randColor = '#'+r+g+b;
      
      function PadDigits(n, totalDigits) 
      { 
          n = n.toString(); 
          var pd = ''; 
          if (totalDigits > n.length) 
          { 
              for (i=0; i < (totalDigits-n.length); i++) 
              { 
                  pd += '0'; 
              } 
          } 
          return pd + n.toString(); 
      } 
      

      【讨论】:

        【解决方案6】:

        这是我的(低技术)尝试:

        var randColor = (Math.random()*0xFFFFFF<<0).toString(16);
        while( randColor.length < 6 ) {
            randColor = '0' + randColor;
        }
        randColor = '#' + randColor;
        

        【讨论】:

        • 另外,您只是以这种方式填充 R 值。如果 G 值是个位数的罪魁祸首呢?
        • @Gabi:是什么让你这么认为?他只是像您在答案中那样在前面加上零。
        • 我只是在前面用 0 填充 randColor。看起来你也在尝试做。
        • @jdv 对此感到抱歉,我并没有很注意。你是对的
        • @Dutchie432:数字丢失的唯一方法是数字中有前导零(即 012345 == 12345)。对于五个字符串,如果通道按 RGB 排序,红色将始终是罪魁祸首。
        猜你喜欢
        • 2016-07-27
        • 2017-06-08
        • 2018-09-20
        • 2021-10-08
        • 2014-10-01
        • 2013-03-24
        • 1970-01-01
        • 2021-06-02
        • 2017-03-27
        相关资源
        最近更新 更多