当前位置:首页 > 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);
  }
};

主线程:

js实现计时器效果

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

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

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

相关文章

vue效果实现

vue效果实现

Vue 效果实现方法 Vue.js 提供了多种方式实现动态效果,包括过渡动画、状态驱动的 UI 变化以及第三方动画库集成。以下是常见效果的实现方案: 过渡动画 使用 Vue 内置的 <tran…

react如何添加效果

react如何添加效果

React 添加动画效果的方法 使用 CSS 过渡动画 在 React 组件中直接通过 className 或 style 属性应用 CSS 过渡效果。定义 CSS 类包含 transition 属性…

vue实现效果更新

vue实现效果更新

Vue 实现效果更新的方法 Vue 提供了多种方式实现动态效果更新,主要依赖其响应式系统和生命周期钩子。以下是几种常见的方法: 数据绑定与响应式更新 Vue 的核心是数据驱动视图。通过修改数据,视图…

vue实现taggle效果

vue实现taggle效果

Vue实现Toggle效果 在Vue中实现Toggle效果可以通过多种方式完成,以下是几种常见的方法: 方法1:使用v-model和v-show/v-if 通过v-model绑定一个布尔值,结合v…

vue实现gif效果

vue实现gif效果

Vue 中实现 GIF 效果的方法 在 Vue 中实现 GIF 效果可以通过多种方式完成,以下是几种常见的方法: 直接使用 GIF 图片 将 GIF 图片作为静态资源引入,直接在 Vue 模板中使用…

vue实现聊天效果

vue实现聊天效果

Vue 实现聊天效果 在 Vue 中实现聊天效果,可以通过组件化设计、数据绑定和事件处理来完成。以下是关键步骤和代码示例。 数据结构和状态管理 使用 Vue 的 data 或 ref(Composi…