当前位置:首页 > JavaScript

js实现倒计时

2026-01-12 12:58:29JavaScript

使用 setInterval 实现倒计时

通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。

js实现倒计时

function countdown(seconds, callback) {
  const timer = setInterval(() => {
    seconds--;
    callback(seconds);
    if (seconds <= 0) clearInterval(timer);
  }, 1000);
}

// 使用示例
countdown(10, (remaining) => {
  console.log(`剩余时间: ${remaining}秒`);
});

使用 requestAnimationFrame 实现高精度倒计时

通过递归调用 requestAnimationFrame 实现更高精度的倒计时,适合需要平滑动画的场景。

js实现倒计时

function preciseCountdown(endTime, updateCallback, finishCallback) {
  function update() {
    const now = Date.now();
    const remaining = Math.max(0, endTime - now);
    updateCallback(Math.ceil(remaining / 1000));

    if (remaining > 0) {
      requestAnimationFrame(update);
    } else {
      finishCallback?.();
    }
  }
  update();
}

// 使用示例
const targetTime = Date.now() + 10000; // 10秒后
preciseCountdown(
  targetTime,
  (sec) => console.log(`精确剩余: ${sec}秒`),
  () => console.log('倒计时结束')
);

带暂停/继续功能的倒计时类

封装一个完整的倒计时类,支持暂停、继续和重置功能。

class Countdown {
  constructor(duration, onUpdate, onComplete) {
    this.duration = duration;
    this.remaining = duration;
    this.onUpdate = onUpdate;
    this.onComplete = onComplete;
    this.timer = null;
    this.startTime = null;
  }

  start() {
    this.startTime = Date.now();
    this.timer = setInterval(() => {
      this.remaining = Math.max(0, this.duration - Math.floor((Date.now() - this.startTime) / 1000));
      this.onUpdate(this.remaining);
      if (this.remaining <= 0) {
        this.stop();
        this.onComplete?.();
      }
    }, 1000);
  }

  pause() {
    clearInterval(this.timer);
    this.duration = this.remaining;
  }

  stop() {
    clearInterval(this.timer);
    this.remaining = this.duration;
  }
}

// 使用示例
const cd = new Countdown(
  30,
  (sec) => console.log(`高级剩余: ${sec}秒`),
  () => console.log('高级倒计时结束')
);
cd.start();

格式化显示的倒计时

添加时间格式化功能,将秒数转换为 HH:MM:SS 格式。

function formatTime(seconds) {
  const hours = Math.floor(seconds / 3600);
  const mins = Math.floor((seconds % 3600) / 60);
  const secs = seconds % 60;

  return [
    hours.toString().padStart(2, '0'),
    mins.toString().padStart(2, '0'),
    secs.toString().padStart(2, '0')
  ].join(':');
}

// 结合到之前的示例中
countdown(3665, (remaining) => {
  console.log(`格式化显示: ${formatTime(remaining)}`);
});

注意事项

  1. 浏览器标签页处于非激活状态时,setInterval 可能会被节流,导致计时不准
  2. 使用 requestAnimationFrame 可以改善精度但更耗性能
  3. 清除定时器时务必使用 clearIntervalcancelAnimationFrame
  4. 长时间倒计时应考虑使用服务器时间同步

标签: 倒计时js
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

js实现乘法

js实现乘法

实现乘法运算的方法 在JavaScript中实现乘法运算可以通过多种方式完成,以下列举几种常见方法: 基础运算符 直接使用乘法运算符*是最简单的方式: let result = 3 * 5; //…