JavaScript實現(xiàn)余額數(shù)字滾動效果
1.實現(xiàn)背景
上周在一個完成任務(wù)領(lǐng)取紅包的活動需求中,需要實現(xiàn)一個用戶點擊按鈕彈出領(lǐng)取紅包彈窗后,在關(guān) 閉彈窗返回原來的頁面時,頁面余額數(shù)字部分要展示一個每一位數(shù)字滾動后的效果。
因為之前沒做過這樣的效果,一開始也不知道要如何實現(xiàn),本來想在GitHub
上找一下相關(guān)的庫,看到一個最高star的庫,但發(fā)現(xiàn)它是依賴jQuery
的,而且不可以npm
包引入。感覺就很沒有必要,本來項目是react
框架的,就是要盡量少的操作DOM,為了解決這個滾動就要引入jQuery
,感覺不太合適。所以我決定還是自己實現(xiàn),先看了一下別人的思路,然后自己再去實現(xiàn)。
2.實現(xiàn)思路
其實就是將傳入的帶滾動的n位數(shù)字拆分成每一個要滾動的數(shù),然后動態(tài)的創(chuàng)建裝著滾動到每一位相應(yīng)數(shù)字的容器,然后放入傳入的目標容器中。滾動到每一位相應(yīng)的數(shù)字的實現(xiàn)可以通過動態(tài)創(chuàng)建從0到相應(yīng)數(shù)字的間隔數(shù)的div
,div的內(nèi)容分別為對應(yīng)的數(shù)字,就像一個豎直寫著從0-n的長紙條,然后拉著它在指定時間內(nèi)從0上拉到目標數(shù)字。
3.實現(xiàn)過程
既然要封裝,還是寫成class
的形式吧,話不多說,直接上代碼吧
/** * 實現(xiàn)數(shù)字滾動的效果的類 */ class DigitScroll { constructor(options) { //獲取容器的DOM,沒有則拋出錯誤 this.container = document.querySelector(options.container); if (!this.container) { throw Error("no container"); } this.container.style.overflow = "hidden"; this.container.style.display = "flex"; //可視容器高度 也是滾動間隔距離,容器要設(shè)置高度,否則默認30px this.rollHeight = parseInt(getComputedStyle(this.container).height) || 30; this.container.style.height = this.rollHeight + "px"; } roll(num) { // 將傳入的要滾動的數(shù)字拆分后初始化每一位數(shù)字的容器 this.initDigitEle(num); const numEles = this.container.querySelectorAll(".single-num"); // 遍歷生成每一位數(shù)字的滾動隊列,如滾動到7,則生成內(nèi)容為0,1,2,3,4,5,6,7的7個div,用于滾動動畫 [...numEles].forEach((numEle, index) => { const curNum = 0; let targetNum = Number(this.numberArr[index]); if (curNum >= targetNum) { targetNum = targetNum + 10; } let cirNum = curNum; // 文檔碎片,拼湊好后一次性插入節(jié)點中 const fragment = document.createDocumentFragment(); // 生成從0到目標數(shù)字對應(yīng)的div while (targetNum >= cirNum) { const ele = document.createElement("div"); ele.innerHTML = cirNum % 10; cirNum++; fragment.appendChild(ele); } numEle.innerHTML = ""; numEle.appendChild(fragment); //重置位置 numEle.style.cssText += "-webkit-transition-duration:0s;-webkit-transform:translateY(0)"; setTimeout(() => { numEle.style.cssText += `-webkit-transition-duration:1s;-webkit-transform:translateY(${ -(targetNum - curNum) * this.rollHeight }px);`; }, 50); }); } // 初始化容器 initDigitEle(num) { // 數(shù)字拆分位數(shù) const numArr = num.toString().split(""); // 文檔碎片,拼湊好后一次性插入節(jié)點中 const fragment = document.createDocumentFragment(); numArr.forEach((item) => { const el = document.createElement("div"); // 數(shù)字是要滾動的,非數(shù)字如.是不滾動的 if (/[0-9]/.test(item)) { el.className = "single-num"; el.style.height = this.rollHeight + "px"; el.style.lineHeight = this.rollHeight + "px"; } else { el.innerHTML = item; el.className = "no-move"; el.style.verticalAlign = "bottom"; } // el.style.float='left'; fragment.appendChild(el); }, []); this.container.innerHTML = ""; this.container.appendChild(fragment); // 存儲滾動的數(shù)字 this.numberArr = numArr.filter((item) => /[0-9]/.test(item)); } }
到此這篇關(guān)于JavaScript實現(xiàn)余額數(shù)字滾動效果的文章就介紹到這了,更多相關(guān)JavaScript實現(xiàn) 數(shù)字滾動 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS前端宏任務(wù)微任務(wù)及Event Loop使用詳解
這篇文章主要為大家介紹了JS前端宏任務(wù)微任務(wù)及Event Loop使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07TypeScript編寫自動創(chuàng)建長度固定數(shù)組的類型工具詳解
這篇文章主要為大家介紹了TS編寫自動創(chuàng)建長度固定數(shù)組的類型工具詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08TypeScript5.2引入新關(guān)鍵字using介紹
這篇文章主要介紹了TypeScript5.2引入新關(guān)鍵字using使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06js二進制數(shù)據(jù)及其互相轉(zhuǎn)化實現(xiàn)詳解
這篇文章主要為大家介紹了js二進制數(shù)據(jù)及其互相轉(zhuǎn)化實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02