发布于 2026-01-06 5 阅读
0

这是什么十六进制颜色代码?!(如何在JavaScript中生成随机十六进制颜色代码)

这是什么十六进制颜色代码?!(如何在JavaScript中生成随机十六进制颜色代码)

在我最近的Flatiron School 项目中,我需要能够以编程方式随机更改页面上某个元素的背景颜色。我需要的是一个可重用的函数,可以onclick对页面上的不同元素调用。以下是我找到的两种实现方法:

首先,我知道我不想在任何地方存储一堆预设颜色。维护一个包含预设颜色代码的数组或对象会很麻烦,而且我希望颜色选择是真正随机的。我决定使用十六进制颜色代码,因为它们相对较短,而且组成它们所需的数据(数字 0-9 和字母 af)也不会占用太多空间。这就是我最初(有点“偷懒”)的解决方案的由来。

首先,我们创建一个包含所有可能的十六进制数字的数组:


 js 
const digits = [0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f']


Enter fullscreen mode Exit fullscreen mode

接下来,我们需要设置基础十六进制代码字符串:



let hexCode = "#" 


Enter fullscreen mode Exit fullscreen mode

我们已经设置好了一个包含哈希/八位字节的字符串,所以我们只需将数字附加到该字符串即可。

接下来,我们需要从数组中随机选择一个十六进制数字。为此Math.round(),我们使用Math.random()`and` 函数来获取数组中随机选择的索引。得到该数字后,我们将其附加到十六进制代码字符串中,直到字符串长度为 7 个字符(6 个数字 + 井号/八位符号),因为十六进制颜色代码是 6 位数字:



while( hexCode.length < 7 ){
  hexCode += digits[ Math.round( Math.random() * digits.length ) ]
}


Enter fullscreen mode Exit fullscreen mode

我们乘以数组Math.random()元素个数digits.length(或数组元素个数digits),因为该Math.random()函数返回的浮点数介于 0 和 1 之间。通过将该浮点数乘以数组元素个数digits,我们确保始终得到一个介于 0 和数组元素个数之间的浮点数。我们用 `if` 函数包装该函数,Math.round()将返回的浮点数四舍五入到最接近的整数,这样数组元素个数就包含了 0 和数组的总长度。然后,我们使用这个随机整数作为索引来选择digits数组中的元素。

完成这一步后,我们只需要return hexCode……,最终的函数如下所示:



function generateRandomHexCode(){
  const digits = [0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f']

  let hexCode = "#" 

  while( hexCode.length < 7 ){
    hexCode += digits[ Math.round( Math.random() * digits.length ) ]
  }

  return hexCode 
}


Enter fullscreen mode Exit fullscreen mode

以下是该函数的一些示例输出:



> generateRandomHexCode()
'#fd88d4'
> generateRandomHexCode()
'#349cba'
> generateRandomHexCode()
'#43a29e'
> generateRandomHexCode()
'#1a1d94'


Enter fullscreen mode Exit fullscreen mode

这完全符合我们的需求!但在找到这个解决方案之后,我仍然想知道是否有更编程的方式来生成十六进制数字,结果发现确实

首先,我们来谈谈十六进制(或称16进制)数字的工作原理。十六进制数字包含十进制数字0-9和字母a、b、c。它们分别对应于十进制(或称10进制)数字0-15。以下是一个简表:

十进制到十六进制转换表

所以,如果我们能找到一种方法将十进制数转换为另一种进制,我们只需要生成一个 0 到 15 之间的随机数,然后将其转换为 16 进制即可。在 JavaScript 中,我们可以使用该方法.toString()并传入基数,快速轻松地将数字转换为另一种进制。

例如,我们可以使用以下方法将数字转换为二进制:.toString(2)



  > (10).toString(2)
  '1010'

  /* if you do not pass the number to `.toString()` 
inside of parentheses you will get a syntax error */


Enter fullscreen mode Exit fullscreen mode

让我们看看用几个十进制数转换成十六进制后会发生什么:



  > (0).toString(16)
  '0'
  > (11).toString(16)
  'b'
  > (5).toString(16)
  '5'
  > (15).toString(16)
  'f'


Enter fullscreen mode Exit fullscreen mode

太好了!这正是我们所期望的,也是我们需要的!

利用这些知识,我们可以将十六进制代码随机化函数转换成如下形式:



  function generateRandomHexCode() {
    let hexCode = "#" 

    while ( hexCode.length < 7 ) {
      hexCode += (Math.round(Math.random() * 15)).toString(16) 
    }

    return hexCode 
  }


Enter fullscreen mode Exit fullscreen mode

在这个版本的函数中,我们使用Math.round()Math.random() * 15生成 0 到 15 之间的随机数,然后使用 将该数字转换为其十六进制等效值.toString(16),并将新生成的数字附加到hexCode基数上,直到我们有 6 位数字。

以下是一些生成的十六进制代码:



  > generateRandomHexCode()
  '#d5758c'
  > generateRandomHexCode()
  '#26711b'
  > generateRandomHexCode()
  '#8deca6'
  > generateRandomHexCode()
  '#3df62c'
  > generateRandomHexCode()
  '#1a293a'


Enter fullscreen mode Exit fullscreen mode

出色的!

您可以使用此输出更新项目中的color`<div>`和 `<span>` 元素,例如使用以下代码:backgroundColor



  someElement.style.backgroundColor = generateRandomHexCode()


Enter fullscreen mode Exit fullscreen mode

您可以在下面的代码示例 CodePen 中看到这段代码的实际运行效果。

如果您知道其他十六进制代码生成方法,请告诉我;如果您在自己的项目中尝试了这种方法,也请务必告诉我!

xx Emily/ @thecodepixi

文章来源:https://dev.to/thecodepixi/what-the-hex-how-to-generate-random-hex-color-codes-in-javascript-21n