当前位置:首页 > JavaScript

js实现计时器效果

2026-01-31 07:23:25JavaScript

使用 setTimeout 实现单次计时器

通过 setTimeout 可以在指定延迟后执行一次回调函数。适合单次延迟执行的场景。

setTimeout(() => {
  console.log('计时结束');
}, 1000); // 1000毫秒后执行

使用 setInterval 实现循环计时器

通过 setInterval 可以按照固定时间间隔重复执行回调函数,直到被清除。

let counter = 0;
const intervalId = setInterval(() => {
  counter++;
  console.log(`已过去 ${counter} 秒`);
  if (counter >= 5) {
    clearInterval(intervalId); // 停止计时器
  }
}, 1000); // 每秒执行一次

使用 requestAnimationFrame 实现动画计时器

requestAnimationFrame 是浏览器提供的专门用于动画的高性能计时API,会在每次重绘前执行回调。

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

实现可暂停的计时器

结合 Date 对象和变量控制,可以创建更灵活的计时器。

let startTime, elapsedTime = 0, timerId;
let isRunning = false;

function startTimer() {
  if (isRunning) return;
  isRunning = true;
  startTime = Date.now() - elapsedTime;
  timerId = setInterval(updateTimer, 10);
}

function pauseTimer() {
  if (!isRunning) return;
  isRunning = false;
  clearInterval(timerId);
}

function resetTimer() {
  isRunning = false;
  clearInterval(timerId);
  elapsedTime = 0;
  document.getElementById('display').textContent = '00:00:00';
}

function updateTimer() {
  const now = Date.now();
  elapsedTime = now - startTime;
  displayTime(elapsedTime);
}

function displayTime(time) {
  const formatted = new Date(time).toISOString().substr(11, 8);
  document.getElementById('display').textContent = formatted;
}

高性能计时器实现

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

let lastTime = performance.now();
function highPrecisionTimer() {
  const now = performance.now();
  const delta = now - lastTime;
  lastTime = now;

  console.log(`时间差: ${delta.toFixed(3)}ms`);
  requestAnimationFrame(highPrecisionTimer);
}
requestAnimationFrame(highPrecisionTimer);

Web Worker 后台计时器

通过 Web Worker 可以在后台线程运行计时器,避免主线程阻塞。

worker.js:

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

主线程:

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

// 停止计时
// worker.postMessage('stop');

js实现计时器效果

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

相关文章

vue实现突出效果

vue实现突出效果

Vue 实现突出效果的方法 在 Vue 中实现突出效果可以通过多种方式,包括动态样式绑定、过渡动画、第三方库等。以下是几种常见的方法: 动态样式绑定 通过 v-bind:class 或 v-bind…

css3制作立体效果

css3制作立体效果

使用 transform 属性实现立体旋转 通过 transform-style: preserve-3d 和 rotateX/Y/Z 实现 3D 空间变换: .container { tr…

vue实现翻页效果

vue实现翻页效果

使用Vue实现翻页效果 在Vue中实现翻页效果通常需要结合分页组件和数据处理逻辑。以下是几种常见方法: 基础分页组件实现 <template> <div>…

vue实现吸附效果

vue实现吸附效果

实现吸附效果的基本思路 吸附效果通常指当页面滚动到某个位置时,元素固定在视口的特定位置。Vue中可以通过监听滚动事件结合CSS的position: sticky或动态样式切换实现。 使用CSS的po…

vue实现突出效果

vue实现突出效果

Vue 实现突出效果的方法 在 Vue 中实现突出效果通常涉及动态样式绑定、动画过渡或第三方库的使用。以下是几种常见实现方式: 动态类名绑定 通过 v-bind:class 或简写 :class 实…

vue实现基金效果

vue实现基金效果

Vue 实现基金效果 在 Vue 中实现基金效果,通常指的是模拟基金的增长、波动或可视化展示。以下是几种常见的实现方式: 数据绑定与动态更新 通过 Vue 的数据绑定特性,可以动态展示基金净值的变化…