使用requestAnimationFrame实现精准倒计时功能

 更新时间:2024年09月20日 12:57:02   作者:low神  
实现精准倒计时对于活动预告、限时优惠和赛事计时等场景非常重要,常用的倒计时方法包括使用JavaScript的setInterval和setTimeout,但这些方法精度有限,为提高精度,本文介绍使用requestAnimationFrame实现精准倒计时功能,感兴趣的朋友一起看看吧

实现精准倒计时是一个常见的需求,尤其是在开发活动预告、限时优惠、赛事计时等场景中。实现精准倒计时的关键在于精确计算剩余时间,并确保时间更新的频率足够高,以保证显示时间的准确性。以下是一些实现精准倒计时的方法和技巧:

1. 使用 JavaScript 的 setTimeoutsetInterval

最常用的方法是使用 JavaScript 的 setInterval 函数每隔一段时间更新倒计时,但是这种方法存在精度上的局限性,因为 setInterval 的最小间隔是 10 毫秒,并且浏览器在标签页不活跃时可能会暂停定时器。

function countdown(targetDate) {
  const intervalId = setInterval(() => {
    const now = Date.now();
    const diff = targetDate - now;
    if (diff <= 0) {
      clearInterval(intervalId);
      console.log('Countdown finished!');
      return;
    }
    const days = Math.floor(diff / (1000 * 60 * 60 * 24));
    const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
    const seconds = Math.floor((diff % (1000 * 60)) / 1000);
    console.log(`${days}天${hours}小时${minutes}分钟${seconds}秒`);
  }, 1000);
}
const targetDate = new Date().getTime() + 24 * 60 * 60 * 1000; // 一天后的同一时间
countdown(targetDate);

2. 使用 requestAnimationFrame

为了提高精度,可以使用 requestAnimationFrame 替代 setIntervalrequestAnimationFrame 会在下一个重绘前调用指定的函数,这通常比 setInterval 更加高效且准确。

function rafCountdown(targetDate) {
  let lastTime = performance.now();
  const updateCountdown = () => {
    const now = performance.now();
    const diff = targetDate - now;
    if (diff <= 0) {
      console.log('Countdown finished!');
      return;
    }
    const days = Math.floor(diff / (1000 * 60 * 60 * 24));
    const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
    const seconds = Math.floor((diff % (1000 * 60)) / 1000);
    console.log(`${days}天${hours}小时${minutes}分钟${seconds}秒`);
    requestAnimationFrame(updateCountdown);
  };
  requestAnimationFrame(updateCountdown);
}
rafCountdown(targetDate);

3. 使用 Worker

对于更高精度的要求,可以考虑使用 Web Workers 来执行后台计时,这样可以避免主线程阻塞对倒计时的影响。

const worker = new Worker('worker.js');
worker.postMessage(targetDate);
// worker.js
self.onmessage = function(e) {
  const targetDate = e.data;
  const intervalId = setInterval(() => {
    const now = Date.now();
    const diff = targetDate - now;
    if (diff <= 0) {
      clearInterval(intervalId);
      postMessage('Countdown finished!');
      return;
    }
    const days = Math.floor(diff / (1000 * 60 * 60 * 24));
    const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
    const seconds = Math.floor((diff % (1000 * 60)) / 1000);
    postMessage(`${days}天${hours}小时${minutes}分钟${seconds}秒`);
  }, 1000);
};

4. 考虑时区和夏令时

在处理长时间跨度的倒计时时,需要考虑到时区差异以及夏令时变化对时间计算的影响。可以使用库如 Moment.js 或 Luxon 来处理这些复杂性。

5. 前后端同步校验

对于非常精确的倒计时(如秒级或毫秒级),可以考虑前后端同步校验时间,以确保显示的时间与实际时间一致。

总结

选择哪种方法取决于具体的应用场景和精度要求。对于一般的应用,使用 setIntervalrequestAnimationFrame 就已经足够;而对于需要更高精度的场合,则可以考虑使用 Web Workers 或其他更专业的解决方案。

到此这篇关于使用requestAnimationFrame实现精准倒计时的文章就介绍到这了,更多相关requestAnimationFrame倒计时内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ArtEditor富文本编辑器增加表单提交功能

    ArtEditor富文本编辑器增加表单提交功能

    artEditor是一款基于jQuery的移动端富文本编辑器,支持插入图片,后续完善其他功能。接下来通过本文给大家介绍ArtEditor富文本编辑器增加表单提交功能,对arteditor编辑器相关知识感兴趣的朋友一起学习吧
    2016-04-04
  • Electron 使用 Nodemon 配置自动重启的方法

    Electron 使用 Nodemon 配置自动重启的方法

    在Electron开发过程中,每次代码修改后需手动重新启动应用,这一过程可以通过引入Nodemon工具自动化,Nodemon能够监测文件变化并自动重启服务器,本文给大家介绍Electron 使用 Nodemon 配置自动重启,感兴趣的朋友一起看看吧
    2024-09-09
  • Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)

    Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件

    什么是Node.js?还服务器端javascript?对于这个概念我在这篇文章不做解释,可以自己去搜索了解下,服务器端js不是新技术,只是最近的node.js的火爆让他爆发了,我会在以后的文章里解释什么是node.js。
    2011-06-06
  • JS实现的tab切换并显示相应内容模块功能示例

    JS实现的tab切换并显示相应内容模块功能示例

    这篇文章主要介绍了JS实现的tab切换并显示相应内容模块功能,结合实例形式分析了JavaScript基于事件响应、元素遍历实现页面tab切换功能相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • JS小功能(列表页面隔行变色)简单实现

    JS小功能(列表页面隔行变色)简单实现

    这篇文章主要介绍了JS列表页面隔行变色简单实现,有需要的朋友可以参考一下
    2013-11-11
  • 微信小程序实现随机验证码

    微信小程序实现随机验证码

    这篇文章主要为大家详细介绍了微信小程序实现随机验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 基于JS实现右侧缓慢弹窗动态效果

    基于JS实现右侧缓慢弹窗动态效果

    在现代Web开发中,动态交互效果是提升用户体验的重要手段之一,其中,从页面右侧缓慢滑出的弹窗效果因其不遮挡主要内容、易于用户操作而备受欢迎,本文将详细介绍如何使用JavaScript结合CSS3动画实现这一效果,并探讨其在实际项目中的应用,需要的朋友可以参考下
    2025-02-02
  • JavaScript计算两个日期时间段内日期的方法

    JavaScript计算两个日期时间段内日期的方法

    这篇文章主要介绍了JavaScript计算两个日期时间段内日期的方法,涉及javascript操作时间的技巧,需要的朋友可以参考下
    2015-03-03
  • html文本框提示效果的示例代码

    html文本框提示效果的示例代码

    在html文本框中显示提示效果,以方便用户的输入,比如在输入姓名时,会自动提示 姓名长度最多16个字符,是不是很酷哦。快来看看吧
    2014-06-06
  • 原生JS上传大文件显示进度条 php上传文件代码

    原生JS上传大文件显示进度条 php上传文件代码

    这篇文章主要为大家详细介绍了JS原生上传大文件显示进度条,php上传文件关键代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论