当前位置:首页 > JavaScript

js实现倒计时

2026-04-03 17:50:22JavaScript

使用 setInterval 实现倒计时

通过 setInterval 定时器每秒更新剩余时间,并在倒计时结束时清除定时器。

function countdown(targetTime, callback) {
  const timer = setInterval(() => {
    const now = new Date().getTime();
    const distance = targetTime - now;

    if (distance <= 0) {
      clearInterval(timer);
      callback(0, 0, 0, 0);
      return;
    }

    const days = Math.floor(distance / (1000 * 60 * 60 * 24));
    const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
    const seconds = Math.floor((distance % (1000 * 60)) / 1000);

    callback(days, hours, minutes, seconds);
  }, 1000);
}

// 示例:倒计时到未来24小时
const targetTime = new Date().getTime() + 24 * 60 * 60 * 1000;
countdown(targetTime, (d, h, m, s) => {
  console.log(`${d}天 ${h}小时 ${m}分钟 ${s}秒`);
});

使用 requestAnimationFrame 实现高精度倒计时

适用于需要高精度渲染的场景(如动画),避免 setInterval 的时间漂移问题。

function animationCountdown(targetTime, callback) {
  let lastUpdate = 0;
  const update = (timestamp) => {
    if (timestamp - lastUpdate >= 1000) {
      const now = new Date().getTime();
      const distance = targetTime - now;

      if (distance <= 0) {
        callback(0, 0, 0, 0);
        return;
      }

      const days = Math.floor(distance / (1000 * 60 * 60 * 24));
      const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
      const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
      const seconds = Math.floor((distance % (1000 * 60)) / 1000);

      callback(days, hours, minutes, seconds);
      lastUpdate = timestamp;
    }
    requestAnimationFrame(update);
  };
  requestAnimationFrame(update);
}

使用 Web Worker 实现后台倒计时

避免主线程阻塞,适合长时间运行的倒计时场景。

// worker.js
self.onmessage = function(e) {
  const targetTime = e.data;
  setInterval(() => {
    const now = new Date().getTime();
    const distance = targetTime - now;
    postMessage(distance > 0 ? distance : 0);
  }, 1000);
};

// 主线程代码
const worker = new Worker('worker.js');
worker.postMessage(new Date().getTime() + 5000); // 5秒倒计时
worker.onmessage = (e) => {
  console.log(`剩余毫秒数: ${e.data}`);
};

格式化倒计时显示

将毫秒数转换为易读的字符串格式。

js实现倒计时

function formatCountdown(distance) {
  if (distance <= 0) return "00:00:00";
  const hours = Math.floor(distance / (1000 * 60 * 60)).toString().padStart(2, '0');
  const mins = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)).toString().padStart(2, '0');
  const secs = Math.floor((distance % (1000 * 60)) / 1000).toString().padStart(2, '0');
  return `${hours}:${mins}:${secs}`;
}

注意事项

  • 浏览器标签页休眠时,setInterval 可能被节流,建议用 Date 对象计算补偿时间。
  • 移动端页面隐藏时,requestAnimationFrame 会暂停,需监听 visibilitychange 事件。
  • 跨时区场景需统一使用 UTC 时间处理。

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

相关文章

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…

js实现弹框

js实现弹框

使用 alert 实现简单弹框 JavaScript 的 alert 方法可以直接显示一个简单的弹框,内容为纯文本: alert("这是一个简单的弹框"); 使用 confirm 实现确认弹框…