溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript如何實(shí)現(xiàn)余額數(shù)字滾動效果

發(fā)布時間:2021-12-24 09:04:19 來源:億速云 閱讀:156 作者:柒染 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)JavaScript如何實(shí)現(xiàn)余額數(shù)字滾動效果,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

1.實(shí)現(xiàn)背景

上周在一個完成任務(wù)領(lǐng)取紅包的活動需求中,需要實(shí)現(xiàn)一個用戶點(diǎn)擊按鈕彈出領(lǐng)取紅包彈窗后,在關(guān) 閉彈窗返回原來的頁面時,頁面余額數(shù)字部分要展示一個每一位數(shù)字滾動后的效果。
因?yàn)橹皼]做過這樣的效果,一開始也不知道要如何實(shí)現(xiàn),本來想在GitHub上找一下相關(guān)的庫,看到一個最高star的庫,但發(fā)現(xiàn)它是依賴jQuery的,而且不可以npm包引入。感覺就很沒有必要,本來項(xiàng)目是react框架的,就是要盡量少的操作DOM,為了解決這個滾動就要引入jQuery,感覺不太合適。所以我決定還是自己實(shí)現(xiàn),先看了一下別人的思路,然后自己再去實(shí)現(xiàn)。

2.實(shí)現(xiàn)思路

其實(shí)就是將傳入的帶滾動的n位數(shù)字拆分成每一個要滾動的數(shù),然后動態(tài)的創(chuàng)建裝著滾動到每一位相應(yīng)數(shù)字的容器,然后放入傳入的目標(biāo)容器中。滾動到每一位相應(yīng)的數(shù)字的實(shí)現(xiàn)可以通過動態(tài)創(chuàng)建從0到相應(yīng)數(shù)字的間隔數(shù)的div,div的內(nèi)容分別為對應(yīng)的數(shù)字,就像一個豎直寫著從0-n的長紙條,然后拉著它在指定時間內(nèi)從0上拉到目標(biāo)數(shù)字。

3.實(shí)現(xiàn)過程

既然要封裝,還是寫成class的形式吧,話不多說,直接上代碼吧

/**
 * 實(shí)現(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è)置高度,否則默認(rèn)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ù)字的滾動隊(duì)列,如滾動到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é)點(diǎn)中
      const fragment = document.createDocumentFragment();
      // 生成從0到目標(biāo)數(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é)點(diǎn)中
    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));
  }
}

看完上述內(nèi)容,你們對JavaScript如何實(shí)現(xiàn)余額數(shù)字滾動效果有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI