#9-数字动态好棒棒!(Vanilla JS requestAnimationFrame)

品牌常常会有一些数字想要呈现去说服消费者,
当然只放静态的数字就太无聊了,最直觉的动态就是让数字跑起来!

先来看成果:

今天终於来到了JS动态篇章,比赛也进行1/3了!
标题特别放了Vanilla JS,第一次看到以为又是什麽新的框架想要左转离开时,
才发现Vanilla JS只是要揶揄市面上框架的名称,其实他就是JS啦!XD


JS!帮我做动画!requestAnimationFrame

这边JS主要是搭配:requestAnimationFrame 的功能。

window.requestAnimationFrame()方法
通知浏览器我们想要产生动画,
并且要求浏览器在下次重绘画面前呼叫特定函数更新动画。

来源

当然我们也可以用setInterval来做特效,在离开视窗时动画依旧会一直跑;
requestAnimationFrame的话离开视窗会暂停动画,等到回来视窗时候才继续跑。

requestAnimationFrame也很常用在游戏里面,
之後还会不断看到!

这次上JS的code!

const numberContainer = 
document.querySelectorAll('.number')
const button = document.querySelector('button')

//这边是每一个数字的状态,因为我们有两个数字~
const numbers = [
  {startNum: 100,currentNum : 100, endNum : 345},
	{startNum: 100,currentNum : 100, endNum : 185}
]

//这边是为了要控制速度
const startTime = Date.now() //开始时间
const duration = 50 //指每一个单位变化数字+1的时候,要多少时间

//这边是为了控制动画开关
let animationStart = false;

//数字++的function
function addUp(){

  //看数字有没有超过上限,搭配最下面
  animationStart = numbers[0].currentNum < numbers[0].endNum || 
numbers[1].currentNum < numbers[1].endNum ? true : false;
  
 //要计算现在到刚刚是不是已经过了我们要的时间,到了数字就++
  let now = Date.now();
  
  numberContainer.forEach((item, i)=>{
    if(now > startTime + duration * (numbers[i].currentNum - numbers[i].startNum) 
&& numbers[i].currentNum  < numbers[i].endNum){
	//看现在的时间是不是已经 > (开始时间+单位时间*已过单位)&&现在的单位有没有< 我们上限
    numbers[i].currentNum++;
    item.innerHTML = numbers[i].currentNum;
  }
  })

  //看数字有没有超过上限,如果数字还没有超过上限,就持续呼叫自己
  if(animationStart) requestAnimationFrame(()=>addUp());
};

//做了一个button来开关动画
button.addEventListener('click',()=>{
  numbers.forEach((item)=>{  
    item.currentNum = item.startNum
  })
  addUp();
})

以上!

今天的code

有错或是有任何更好写法,欢迎留言!! ^^


<<:  卡夫卡的藏书阁【Book11】- Kafka Connect 2

>>:  [Day 12] Sass - 常用的内建Modules

Day 31 (Jq+JqUI)

1.意义 [] 很多个东西要拿出来 {} 多个变数形容她 function 重复做的事情 2.推敲过...

轻松救回被删语音备忘录

如何救回 iPhone 13/12 Pro/12/11/11 Pro/XS/XR/X 被删除的录音档...

Day 05:简写好用一直用-v-on、v-bind

延续上篇最後提到 Webpack 设置了别名「@」来取代路径「/src」,然而在模版语法中,「@」则...

使用 Breeze 建立基础专案框架

Breeze 是官方推荐的起手套装,内建有登入、注册、忘记密码等常用的用户功能,令外可以选择使用 V...

[Day16] TS:在 Mapped Type 中修改物件的 property modifiers:理解 Partial、Required 和 Readonly 的实作

这是我们今天要聊的内容,老样的,如果你已经可以轻松看懂,欢迎直接左转去看同事 Kyle 的精彩文章...