品牌常常會有一些數字想要呈現去說服消費者,
當然只放靜態的數字就太無聊了,最直覺的動態就是讓數字跑起來!
先來看成果:
今天終於來到了JS動態篇章,比賽也進行1/3了!
標題特別放了Vanilla JS
,第一次看到以為又是什麼新的框架想要左轉離開時,
才發現Vanilla JS只是要揶揄市面上框架的名稱,其實他就是JS啦!XD
這邊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();
})
有錯或是有任何更好寫法,歡迎留言!! ^^