当前位置:首页 > JavaScript

用js实现一个倒计时器

2026-03-02 03:37:45JavaScript

实现倒计时器的基本方法

使用JavaScript实现倒计时器可以通过setIntervalrequestAnimationFrame结合时间差计算来完成。以下是两种常见的实现方式。

基于setInterval的倒计时器

创建一个简单的倒计时器,显示剩余时间并支持暂停和重置功能。

class CountdownTimer {
  constructor(duration, displayElement) {
    this.duration = duration; // 总时长(秒)
    this.displayElement = displayElement;
    this.remainingTime = duration;
    this.timerId = null;
  }

  start() {
    if (this.timerId) return;
    this.timerId = setInterval(() => {
      this.remainingTime--;
      this.updateDisplay();
      if (this.remainingTime <= 0) {
        this.stop();
      }
    }, 1000);
  }

  stop() {
    clearInterval(this.timerId);
    this.timerId = null;
  }

  reset() {
    this.stop();
    this.remainingTime = this.duration;
    this.updateDisplay();
  }

  updateDisplay() {
    const minutes = Math.floor(this.remainingTime / 60);
    const seconds = this.remainingTime % 60;
    this.displayElement.textContent = `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
  }
}

// 使用示例
const display = document.getElementById('countdown-display');
const timer = new CountdownTimer(300, display); // 5分钟倒计时
document.getElementById('start-btn').addEventListener('click', () => timer.start());
document.getElementById('stop-btn').addEventListener('click', () => timer.stop());
document.getElementById('reset-btn').addEventListener('click', () => timer.reset());

基于requestAnimationFrame的高精度倒计时器

如果需要更高精度或更流畅的动画效果,可以使用requestAnimationFrame

用js实现一个倒计时器

class HighPrecisionCountdown {
  constructor(duration, displayElement) {
    this.duration = duration * 1000; // 转换为毫秒
    this.displayElement = displayElement;
    this.startTime = null;
    this.remainingTime = this.duration;
    this.animationId = null;
  }

  start() {
    if (this.animationId) return;
    this.startTime = performance.now();
    this.animationId = requestAnimationFrame(this.update.bind(this));
  }

  update(timestamp) {
    const elapsed = timestamp - this.startTime;
    this.remainingTime = Math.max(0, this.duration - elapsed);
    this.render();
    if (this.remainingTime > 0) {
      this.animationId = requestAnimationFrame(this.update.bind(this));
    }
  }

  stop() {
    cancelAnimationFrame(this.animationId);
    this.animationId = null;
  }

  reset() {
    this.stop();
    this.remainingTime = this.duration;
    this.render();
  }

  render() {
    const totalSeconds = Math.ceil(this.remainingTime / 1000);
    const minutes = Math.floor(totalSeconds / 60);
    const seconds = totalSeconds % 60;
    this.displayElement.textContent = `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
  }
}

// 使用示例
const display = document.getElementById('high-precision-countdown');
const highPrecisionTimer = new HighPrecisionCountdown(300, display);
document.getElementById('start-btn').addEventListener('click', () => highPrecisionTimer.start());
document.getElementById('stop-btn').addEventListener('click', () => highPrecisionTimer.stop());
document.getElementById('reset-btn').addEventListener('click', () => highPrecisionTimer.reset());

注意事项

  • setInterval可能存在时间漂移问题,长时间运行后可能不准确。
  • requestAnimationFrame更适合需要平滑动画的场景,但会消耗更多资源。
  • 页面不可见时(如切换到其他标签页),requestAnimationFrame会暂停执行,而setInterval可能继续运行但会被浏览器限制。

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

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promise…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…