当前位置:首页 > JavaScript

js实现计时器效果

2026-04-04 23:23:21JavaScript

使用 setTimeout 实现单次计时器

通过 setTimeout 可以创建一个在指定时间后执行的单次计时器:

function delayedAlert() {
  console.log('3秒后执行');
}
setTimeout(delayedAlert, 3000);

使用 setInterval 实现循环计时器

setInterval 会按照固定时间间隔重复执行代码:

let counter = 0;
const intervalId = setInterval(() => {
  counter++;
  console.log(`已执行 ${counter} 次`);
  if(counter >= 5) {
    clearInterval(intervalId);
  }
}, 1000);

使用 requestAnimationFrame 实现动画计时器

对于需要与屏幕刷新率同步的动画效果,推荐使用 requestAnimationFrame

let startTime = null;
function animate(timestamp) {
  if (!startTime) startTime = timestamp;
  const elapsed = timestamp - startTime;
  console.log(`已运行 ${elapsed} 毫秒`);
  if (elapsed < 2000) {
    requestAnimationFrame(animate);
  }
}
requestAnimationFrame(animate);

实现可暂停的计时器

通过组合 Date 对象和 setTimeout 可以实现可暂停的计时器:

class Timer {
  constructor() {
    this.startTime = 0;
    this.elapsed = 0;
    this.timerId = null;
  }

  start() {
    this.startTime = Date.now() - this.elapsed;
    this.timerId = setInterval(() => {
      this.elapsed = Date.now() - this.startTime;
      console.log(`已运行: ${this.elapsed}ms`);
    }, 100);
  }

  pause() {
    clearInterval(this.timerId);
  }

  reset() {
    clearInterval(this.timerId);
    this.elapsed = 0;
    console.log('计时器已重置');
  }
}

const timer = new Timer();
timer.start();

实现倒计时功能

倒计时器可以通过计算剩余时间来实现:

function countdown(seconds) {
  const intervalId = setInterval(() => {
    console.log(`剩余: ${seconds}秒`);
    seconds--;
    if(seconds < 0) {
      clearInterval(intervalId);
      console.log('倒计时结束');
    }
  }, 1000);
}
countdown(10);

使用性能计时 API

对于需要高精度计时的场景,可以使用 performance.now()

const start = performance.now();
// 执行一些操作
for(let i=0; i<1000000; i++) {}
const end = performance.now();
console.log(`耗时: ${end - start} 毫秒`);

计时器精度问题处理

JavaScript 计时器的最小延迟通常为4ms,且会受到浏览器标签页状态影响。对于需要精确计时的场景:

function highPrecisionTimer(callback, interval) {
  let expected = performance.now() + interval;
  let timeoutId;

  function tick() {
    const drift = performance.now() - expected;
    callback();
    expected += interval;
    timeoutId = setTimeout(tick, Math.max(0, interval - drift));
  }

  timeoutId = setTimeout(tick, interval);
  return {
    clear: () => clearTimeout(timeoutId)
  };
}

const timer = highPrecisionTimer(() => {
  console.log('高精度计时');
}, 1000);

Web Worker 实现后台计时

为了避免主线程阻塞影响计时精度,可以使用 Web Worker:

worker.js:

let intervalId;
self.onmessage = function(e) {
  if(e.data.command === 'start') {
    let counter = 0;
    intervalId = setInterval(() => {
      counter++;
      self.postMessage(counter);
    }, 1000);
  } else if(e.data.command === 'stop') {
    clearInterval(intervalId);
  }
};

主线程:

js实现计时器效果

const worker = new Worker('worker.js');
worker.onmessage = function(e) {
  console.log(`计时: ${e.data}秒`);
};
worker.postMessage({command: 'start'});

标签: 计时器效果
分享给朋友:

相关文章

vue实现凤凰效果

vue实现凤凰效果

Vue 实现凤凰效果 凤凰效果通常指一种视觉动画,模拟凤凰展翅、火焰燃烧等动态效果。在 Vue 中实现这种效果,可以结合 CSS 动画、Canvas 或第三方动画库(如 GSAP)。以下是几种实现方式…

vue实现旋转效果

vue实现旋转效果

使用CSS动画实现旋转 在Vue中可以通过CSS的@keyframes或transform属性实现旋转效果。在组件的<style>部分定义旋转动画: .rotate { animat…

vue实现轮播效果

vue实现轮播效果

使用Swiper插件实现轮播 安装Swiper及相关依赖: npm install swiper vue-awesome-swiper 组件代码示例: <template> <…

vue实现翻页动画效果

vue实现翻页动画效果

Vue 实现翻页动画效果的方法 使用 CSS Transition 和 Vue 过渡 在 Vue 中可以通过 <transition> 组件结合 CSS 实现翻页动画效果。定义一个过渡类名…

vue实现步骤条效果

vue实现步骤条效果

实现步骤条的基本结构 使用Vue的v-for指令动态渲染步骤条,结合CSS样式实现基础布局。数据通常存储在组件的data或通过props传递。 <template> <div…

vue如何实现折叠效果

vue如何实现折叠效果

实现折叠效果的方法 在Vue中实现折叠效果可以通过多种方式完成,以下是几种常见的方法: 使用v-if或v-show指令 通过Vue的指令控制元素的显示与隐藏,结合CSS过渡效果实现折叠动画。…