当前位置:首页 > 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中实现翻页效果通常需要结合分页组件和数据处理逻辑。以下是几种常见方法: 基础分页组件实现 <template> <div> <…

vue实现框架效果

vue实现框架效果

Vue实现框架效果的方法 使用Vue实现框架效果可以通过多种方式完成,包括使用Vue Router、动态组件或第三方UI库。以下是几种常见的方法: 使用Vue Router实现布局框架 Vue Ro…

vue实现气泡效果

vue实现气泡效果

实现气泡效果的方法 在Vue中实现气泡效果可以通过CSS动画、第三方库或自定义组件完成。以下是几种常见方法: 使用纯CSS动画 通过CSS的@keyframes和transform属性创建气泡上升动…

vue实现tag效果

vue实现tag效果

实现基本标签结构 使用 Vue 的模板语法创建标签容器和单个标签元素。通过 v-for 动态渲染标签列表,结合 v-bind:key 确保渲染性能。 <template> <…

h5页面滑动效果实现

h5页面滑动效果实现

实现H5页面滑动效果的方法 H5页面滑动效果可以通过多种方式实现,包括原生JavaScript、CSS动画或第三方库。以下是几种常见的方法: 使用CSS Scroll Snap CSS Scroll…

vue实现tab效果

vue实现tab效果

Vue 实现 Tab 效果的方法 使用动态组件和 v-if 通过 v-if 或 v-show 控制不同标签内容的显示与隐藏,结合点击事件切换当前激活的标签页。 <template>…