根据时间戳而变化的背景颜色

311 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

前言

某项目的需求,要一个不断变换的、随机的背景颜色,还不能重复。

如果使用需要随机的背景颜色,一般都会想到使用 Math.random() 获取随机种子,根据随机种子,创建随机的颜色取值。

然而,这种方法过于普通,不能完全满足我想要出风头的虚荣心,必须有一个与众不同的方法才行。

效果

基本思路

首先是随机种子,如果不用 Math.random() 获取,那么就只能使用另一个接近于随机的时间戳了。

虽然时间戳并不是完全随机,有一定的规律,但是项目需求来说,不是用户可以掌控,也能算是随机。而且最重要的一点是,它能转换成一个六位以上的 16 进制的字符串,只要任取其中六位,就能表示一个颜色。

将时间戳换算成毫秒数,再将毫秒数转换成 16 进制的字符串,方便颜色的表示,然后任取其中六位的字符,即是一个新的颜色。

从毫秒数中取出颜色的位置不同,效果也会大有差异,如果需要两个相差比较大的颜色,那自然是取最后六位的差异最大,越往前,每次变化的颜色差异越小。

代码

上面已经基本说明白了实现的思路,接下来就是将思路变为代码,步骤如下:

  1. 使用 Date.now() 获取当前时间的毫秒数
  2. 判断当前时间与上次执行的时间间隔是否大于规定好的间隔,如果没有,不执行任何操作;因为颜色的变化必须有一个过度效果,看起来才比较自然,突兀的颜色变化不是很友好,所以需要这个时间间隔的存在,就是用于颜色的变化过度,变化完成后,才朝着下一个颜色继续变化;
  3. 当前时间与上次执行的时间间隔大于规定好的间隔时,更新上次执行时间;
  4. 使用 toString(16) 将毫秒数转换为 16 进行进制的字符串,截取其中六位。

核心代码如下:

changeColor () {
  const now = Date.now()
  if (now - this.lastChangeTime < this.interval + 1000) return
  this.lastChangeTime = now
  this.element.style.backgroundColor = `#${now.toString(16).slice(-6)}`
}

其他部分代码,请看码上掘金