【countDown倒計時封裝】使用requestAnimationFrame封裝倒計時功能

requestAnimationFrame 介紹

Window:requestAnimationFrame() 方法 - Web API 接口參考 | MDN (mozilla.org)

代碼封裝

// CountDown.js
class CountDown {
      constructor(remain) {
        CountDown.remain = remain
        this.change = () => null
      }

      static remain = null

      static counting = false

      static endTime = null

      static rafId = null

      start() {
        CountDown.endTime = Date.now() + CountDown.remain
        CountDown.counting = true
        CountDown.count(this.change)
      }

      push() {
        CountDown.counting = false
        CountDown.cancelRaf(CountDown.refId)
      }

      static count(fn) {
        CountDown.rafId = CountDown.raf(() => {
          if (CountDown.counting) {
            const currentRemain = CountDown.getRemain()
            if (!CountDown.isTheSameSecond(currentRemain, CountDown.remain) || currentRemain === 0) {
              CountDown.setRemain(currentRemain)
              fn && fn(CountDown.parseTime(CountDown.remain))
            }
            if (CountDown.remain > 0) {
              this.count(fn)
            }
          }
        })
      }

      static getRemain() {
        return Math.max(this.endTime - Date.now(), 0)
      }

      static setRemain(value) {
        this.remain = value
      }

      // 是否同一秒
      static isTheSameSecond(time1, time2) {
        return Math.floor(time1 / 1000) === Math.floor(time2 / 1000)
      }

      // 格式化時間贪绘,輸出天數(shù)時分秒
      static parseTime(time) {
        const SECOND = 1000;
        const MINUTE = 60 * SECOND;
        const HOUR = 60 * MINUTE;
        const DAY = 24 * HOUR;

        const days = Math.floor(time / DAY);
        const hours = Math.floor((time % DAY) / HOUR);
        const minutes = Math.floor((time % HOUR) / MINUTE);
        const seconds = Math.floor((time % MINUTE) / SECOND);
        const milliseconds = Math.floor(time % SECOND);

        return {
          total: time,
          days,
          hours,
          minutes,
          seconds,
          milliseconds,
        };
      }

      // 啟用 requestAnimationFrame 倒計時
      static raf(callback) {
        return requestAnimationFrame(callback)
      }

      // 取消 requestAnimationFrame 
      static cancelRaf(id) {
        cancelAnimationFrame(id)
      }

    }

使用

<button id="start">開始</button>
  <button id="push">暫停</button>

  <div>
    剩余時間: <span id="days">0</span>天<span id="hours">0</span>時<span id="minutes">0</span>分<span id="seconds">0</span>秒
  </div>  
<script src="./CountDown.js">
  const countDown = new CountDown(1000 * 60 * 60 * 24 * 60)
    console.log(countDown)
    countDown.change = (date) => {
      console.log(date)
      days.innerText = date.days
      hours.innerText = date.hours
      minutes.innerText = date.minutes
      seconds.innerText = date.seconds
    }
    start.onclick = () => {
      countDown.start()
    }
    push.onclick = () => {
      countDown.push()
      console.log(countDown)
    }
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畔裕,一起剝皮案震驚了整個濱河市堡纬,隨后出現(xiàn)的幾起案子瞬痘,更是在濱河造成了極大的恐慌,老刑警劉巖辩昆,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阅酪,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機遮斥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門峦失,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人术吗,你說我怎么就攤上這事尉辑。” “怎么了较屿?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵隧魄,是天一觀的道長。 經(jīng)常有香客問我隘蝎,道長购啄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任嘱么,我火速辦了婚禮狮含,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曼振。我一直安慰自己几迄,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布冰评。 她就那樣靜靜地躺著映胁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甲雅。 梳的紋絲不亂的頭發(fā)上解孙,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音抛人,去河邊找鬼弛姜。 笑死,一個胖子當著我的面吹牛妖枚,可吹牛的內(nèi)容都是我干的娱据。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盅惜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忌穿?” 一聲冷哼從身側(cè)響起抒寂,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掠剑,沒想到半個月后屈芜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年井佑,在試婚紗的時候發(fā)現(xiàn)自己被綠了属铁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡躬翁,死狀恐怖焦蘑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盒发,我是刑警寧澤例嘱,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站宁舰,受9級特大地震影響拼卵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛮艰,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一腋腮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壤蚜,春花似錦即寡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至水泉,卻和暖如春善涨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背草则。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工钢拧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炕横。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓源内,卻偏偏與公主長得像,于是被迫代替她去往敵國和親份殿。 傳聞我的和親對象是個殘疾皇子膜钓,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容