文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

仅用18行JavaScript实现一个倒数计时器

2024-12-11 21:40

关注

 

前言

有时,您将需要构建一个JavaScript倒数时钟。您可能有活动,销售,促销或游戏。您可以使用原始JavaScript构建时钟,而不用寻找最近的插件。虽然有很多很棒的时钟插件,但是使用原始JavaScript可以带来以下好处:

因此,事不宜迟,这里介绍了如何仅用18行JavaScript来制作自己的倒计时时钟

 

 

基本时钟:倒数到特定的日期或时间

以下是创建基本时钟所涉及步骤的快速概述:

设定有效的结束日期

首先,您需要设置一个有效的结束日期。这应该是JavaScript的Date.parse()方法可以理解的任何格式的字符串。例如:

在ISO 8601格式:

 

  1. const deadline = '2015-12-31'

简短格式:

 

  1. const deadline = '31/12/2015'

或者,长格式:

 

  1. const deadline = 'December 31 2015'

这些格式中的每一种都允许您指定确切的时间和时区(对于ISO日期,则为UTC的偏移量)。例如:

 

  1. const deadline = 'December 31 2015 23:59:59 GMT+0200'

您可以在本文中阅读有关JavaScript中日期格式的更多信息。

计算剩余时间

下一步是计算剩余时间。我们需要编写一个函数,该函数需要一个表示给定结束时间的字符串(如上所述)。然后,我们计算该时间与当前时间之间的时差。看起来像这样:

 

  1. function getTimeRemaining(endtime){ 
  2.   const total = Date.parse(endtime) - Date.parse(new Date()); 
  3.   const seconds = Math.floor( (total/1000) % 60 ); 
  4.   const minutes = Math.floor( (total/1000/60) % 60 ); 
  5.   const hours = Math.floor( (total/(1000*60*60)) % 24 ); 
  6.   const days = Math.floor( total/(1000*60*60*24) ); 
  7.  
  8.   return { 
  9.     total, 
  10.     days, 
  11.     hours, 
  12.     minutes, 
  13.     seconds 
  14.   }; 

首先,我们创建一个变量total,以保留剩余时间直到截止日期。该Date.parse()函数将时间字符串转换为毫秒值。这使我们可以相减两次,并获得两者之间的时间量。

 

  1. const total = Date.parse(endtime) - Date.parse(new Date()); 

将时间转换为可用格式

现在,我们要将毫秒转换为天,小时,分钟和秒。让我们以秒为例:

 

  1. const seconds = Math.floor( (t/1000) % 60 ); 

让我们分解一下这里发生的事情。

  1. 将毫秒除以1000可转换为秒: (t/1000)
  2. 将总秒数除以60,然后取余数。您不希望所有的秒数,仅需要计算分钟数之后剩下的秒数:(t/1000) % 60
  3. 四舍五入到最接近的整数。这是因为您需要完整的秒数,而不是几分之一秒:Math.floor( (t/1000) % 60 )

重复此逻辑,将毫秒转换为分钟,小时和天。

输出时钟数据作为可重用对象

准备好几天,几小时,几分钟和几秒钟之后,我们现在可以将数据作为可重用的对象返回:

 

  1. return { 
  2.   total, 
  3.   days, 
  4.   hours, 
  5.   minutes, 
  6.   seconds 
  7. }; 

该对象允许您调用函数并获取任何计算值。这是如何获取剩余时间的示例:

 

  1. getTimeRemaining(deadline).minutes 

方便吧?

显示时钟并在达到零时停止

现在,我们有了一个可以花费剩余的天,小时,分钟和秒的功能,我们可以构建时钟了。首先,我们将创建以下HTML元素来保存时钟:

 

 

 

然后,我们将编写一个在新div中输出时钟数据的函数:

 

  1. function initializeClock(id, endtime) { 
  2.   const clock = document.getElementById(id); 
  3.   const timeinterval = setInterval(() => { 
  4.     const t = getTimeRemaining(endtime); 
  5.     clock.innerHTML = 'days: ' + t.days + '
    '
     + 
  6.                       'hours: '+ t.hours + '
    '
     + 
  7.                       'minutes: ' + t.minutes + '
    '
     + 
  8.                       'seconds: ' + t.seconds; 
  9.     if (t.total <= 0) { 
  10.       clearInterval(timeinterval); 
  11.     } 
  12.   },1000); 

该函数有两个参数。这些是包含我们时钟的元素的ID,以及倒计时的结束时间。在函数内部,我们将声明一个clock变量并将其用于存储对我们的时钟容器div的引用。这意味着我们不必继续查询DOM。

接下来,我们将使用setInterval每秒执行一个匿名函数。此功能将执行以下操作:

 

  1. initializeClock('clockdiv', deadline); 

恭喜你!现在,您仅用18行JavaScript就拥有了一个基本时钟。

准备显示时钟

在设置时钟样式之前,我们需要进行一些细化。

消除初始延迟

在时钟中,我们习惯于setInterval每秒更新一次显示。多数情况下,这很好,除非在开始时会有一秒钟的延迟。要消除此延迟,我们必须在间隔开始之前更新一次时钟。

让我们将要传递给setInterval它的匿名函数移到其自己的独立函数中。我们可以命名这个函数updateClock。在updateClock外部调用该函数setInterval,然后在内部再次调用setInterval。这样,时钟显示就没有延迟了。

在您的JavaScript中,替换为:

 

  1. const timeinterval = setInterval(() => { ... },1000); 

有了这个:

 

  1. function updateClock(){ 
  2.   const t = getTimeRemaining(endtime); 
  3.   clock.innerHTML = 'days: ' + t.days + '
    '
     + 
  4.                     'hours: '+ t.hours + '
    '
     + 
  5.                     'minutes: ' + t.minutes + '
    '
     + 
  6.                     'seconds: ' + t.seconds; 
  7.   if (t.total <= 0) { 
  8.     clearInterval(timeinterval); 
  9.   } 
  10.  
  11. updateClock(); // run function once at first to avoid delay 
  12. var timeinterval = setInterval(updateClock,1000); 

避免持续重建时钟

我们需要使时钟脚本更高效。我们只想更新时钟中的数字,而不是每秒重新构建整个时钟。实现此目的的一种方法是将每个数字放在span标签中,然后仅更新这些跨度的内容。

这是HTML:

 

 
  1. "clockdiv"
  2.     Days: "days">
     
  3.     Hours: "hours">
     
  4.     Minutes: "minutes">
     
  5.     Seconds: "seconds"> 
 

 

现在让我们参考这些元素。在clock定义变量的位置之后添加以下代码

 

  1. const daysSpan = clock.querySelector('.days'); 
  2. const hoursSpan = clock.querySelector('.hours'); 
  3. const minutesSpan = clock.querySelector('.minutes'); 
  4. const secondsSpan = clock.querySelector('.seconds'); 

接下来,我们需要更改updateClock功能以及更新数字。新代码如下所示:

 

  1. function updateClock(){ 
  2.     const t = getTimeRemaining(endtime); 
  3.  
  4.     daysSpan.innerHTML = t.days; 
  5.     hoursSpan.innerHTML = t.hours; 
  6.     minutesSpan.innerHTML = t.minutes; 
  7.     secondsSpan.innerHTML = t.seconds; 
  8.  
  9.     ... 

添加前导零

现在时钟不再每秒都在重建,我们还有另一件事要做:添加前导零。例如,不是让时钟显示7秒,而是显示07秒。一种简单的方法是在数字的开头添加字符串“ 0”,然后切掉最后两位数字。

例如,要在“ seconds”值上添加前导零,您可以对此进行更改:

 

  1. secondsSpan.innerHTML = t.seconds; 

对此:

 

  1. secondsSpan.innerHTML = ('0' + t.seconds).slice(-2); 

如果需要,您也可以在分钟和小时中添加前导零。如果您走了这么远,恭喜!您的时钟现在可以显示了。

注意:您可能需要在CodePen中单击“重新运行”才能开始倒计时。

更进一步

下面的示例演示如何针对某些用例扩展时钟。它们都是基于上面看到的基本示例。

自动安排时钟

假设我们希望时钟显示在某些日子,而不是其他日子。例如,我们可能会发生一系列事件,并且不想每次都手动更新时钟。这是提前安排事情的方法。

通过在CSS中将其display属性设置为隐藏时钟none。然后将以下内容添加到initializeClock函数中(以开头的行之后var clock)。一旦initializeClock调用此函数,这将导致时钟仅显示:

 

  1. clock.style.display = 'block'

接下来,我们可以指定显示时钟的日期。这将替换deadline变量:

 

  1. const schedule = [ 
  2.     ['Jul 25 2015''Sept 20 2015'], 
  3.     ['Sept 21 2015''Jul 25 2016'], 
  4.     ['Jul 25 2016''Jul 25 2030'
  5. ]; 

schedule数组中的每个元素代表一个开始日期和一个结束日期。如上所述,可以包括时间和时区,但是我在这里使用了简单的日期来保持代码的可读性。

最后,当用户加载页面时,我们需要检查是否在指定的时间范围内。该代码应替换先前对该initializeClock函数的调用。

 

  1. // iterate over each element in the schedule 
  2. for (var i=0; i
  3.   var startDate = schedule[i][0]; 
  4.   var endDate = schedule[i][1]; 
  5.  
  6.   // put dates in milliseconds for easy comparisons 
  7.   var startMs = Date.parse(startDate); 
  8.   var endMs = Date.parse(endDate); 
  9.   var currentMs = Date.parse(new Date()); 
  10.  
  11.   // if current date is between start and end dates, display clock 
  12.   if (endMs > currentMs && currentMs >= startMs ) { 
  13.     initializeClock('clockdiv', endDate); 
  14.   } 
  15.  
  16. schedule.forEach(([startDate, endDate]) => { 
  17.   // put dates in milliseconds for easy comparisons 
  18.   const startMs = Date.parse(startDate); 
  19.   const endMs = Date.parse(endDate); 
  20.   const currentMs = Date.parse(new Date()); 
  21.  
  22.   // if current date is between start and end dates, display clock 
  23.   if (endMs > currentMs && currentMs >= startMs ) { 
  24.     initializeClock('clockdiv', endDate); 
  25.   } 
  26. }); 

现在,您可以提前安排时钟,而无需手动更新。您可以根据需要缩短代码。为了便于阅读,我让我变得冗长。

从用户到达起将计时器设置为10分钟

用户到达或开始特定任务后,有必要在给定的时间内设置倒计时。我们将在此处将计时器设置为10分钟,但是您可以使用任意时间。

我们需要做的就是deadline用这个替换变量:

 

  1. const timeInMinutes = 10; 
  2. const currentTime = Date.parse(new Date()); 
  3. const deadline = new Date(currentTime + timeInMinutes*60*1000); 

该代码将花费当前时间,并增加十分钟。这些值将转换为毫秒,因此可以将它们加在一起并变成新的截止日期。

现在,我们有了一个时钟,可以从用户到达时开始倒数十分钟。随意玩耍,尝试不同的时间长度。

跨页面保持时钟进度

有时,有必要将时钟状态保留的时间不仅限于当前页面。如果我们想在整个网站上设置10分钟的计时器,则我们不希望在用户转到其他页面时将其重置。

一种解决方案是将时钟的结束时间保存在cookie中。这样,导航到新页面不会将结束时间重置为现在的十分钟。

这是逻辑:

如果Cookie中记录了截止日期,请使用该截止日期。

如果不存在该cookie,则设置一个新的截止日期并将其存储在cookie中。

要实现这一点,请用deadline以下内容替换变量:

 

  1. let deadline; 
  2.  
  3. // if there's a cookie with the name myClock, use that value as the deadline 
  4. if(document.cookie && document.cookie.match('myClock')){ 
  5.   // get deadline value from cookie 
  6.   deadline = document.cookie.match(/(^|;)myClock=([^;]+)/)[2]; 
  7. else { 
  8.   // otherwise, set a deadline 10 minutes from now and  
  9.   // save it in a cookie with that name 
  10.  
  11.   // create deadline 10 minutes from now 
  12.   const timeInMinutes = 10; 
  13.   const currentTime = Date.parse(new Date()); 
  14.   deadline = new Date(currentTime + timeInMinutes*60*1000); 
  15.  
  16.   // store deadline in cookie for future reference 
  17.   document.cookie = 'myClock=' + deadline + '; path=/; domain=.yourdomain.com'

这段代码利用了cookie和正则表达式,它们本身就是单独的主题。因此,我在这里不再赘述。需要注意的一件事是,您需要更改.yourdomain.com为实际域。

有关客户端事件的重要警告

JavaScript日期和时间是从用户计算机中获取的。这意味着用户可以通过更改计算机上的时间来影响JavaScript时钟。在大多数情况下,这无关紧要。但是,在某些超级敏感的情况下,有必要从服务器获取时间。可以使用一些PHP或Ajax来完成,这两者都超出了本教程的范围。

从服务器获取时间后,我们可以使用本教程中的相同技术来使用它。

加起来

阅读完本文中的示例之后,您现在知道如何仅用几行原始JavaScript代码创建自己的倒数计时器!我们已经研究了如何制作基本的倒数时钟并有效显示它。我们还介绍了添加一些有用的附加功能,包括计划,绝对时间和相对时间,以及使用Cookie保留页面和站点访问之间的状态。

完整代码

  1.  
  2. "zh"
  3.  
  4. "UTF-8" /> 
  5. name="viewport" content="width=device-width, initial-scale=1.0" /> 
  6. "X-UA-Compatible" content="ie=edge" /> 
  7. Countdown Clock 
  8. "text/css"
  9.   body{ 
  10.     text-align: center; 
  11.     background: #00ECB9; 
  12.   font-family: sans-serif; 
  13.   font-weight: 100; 
  14.  
  15. h1{ 
  16.   color: #396; 
  17.   font-weight: 100; 
  18.   font-size: 40px; 
  19.   margin: 40px 0px 20px; 
  20.  
  21. #clockdiv{ 
  22.     font-family: sans-serif; 
  23.     color: #fff; 
  24.     display: inline-block; 
  25.     font-weight: 100; 
  26.     text-align: center; 
  27.     font-size: 30px; 
  28.  
  29. #clockdiv > div{ 
  30.     padding: 10px; 
  31.     border-radius: 3px; 
  32.     background: #00BF96; 
  33.     display: inline-block; 
  34.  
  35. #clockdiv div > span{ 
  36.     padding: 15px; 
  37.     border-radius: 3px; 
  38.     background: #00816A; 
  39.     display: inline-block; 
  40.  
  41. .smalltext{ 
  42.     padding-top: 5px; 
  43.     font-size: 16px; 
  44.    
  45.  
  46.  
  47.      
  48. "clockdiv"
  49.   
     
  50.     "days"> 
  51.     "smalltext">Days
 
  •    
  •   
     
  •     "hours"> 
  •     "smalltext">Hours 
  •    
  •   
     
  •     "minutes"> 
  •     "smalltext">Minutes 
  •    
  •   
     
  •     "seconds"> 
  •     "smalltext">Seconds 
  •    
  •  
  • "text/javascript"
  •   function getTimeRemaining(endtime) { 
  •   const total = Date.parse(endtime) - Date.parse(new Date()); 
  •   const seconds = Math.floor((total / 1000) % 60); 
  •   const minutes = Math.floor((total / 1000 / 60) % 60); 
  •   const hours = Math.floor((total / (1000 * 60 * 60)) % 24); 
  •   const days = Math.floor(total / (1000 * 60 * 60 * 24)); 
  •    
  •   return { 
  •     total, 
  •     days, 
  •     hours, 
  •     minutes, 
  •     seconds 
  •   }; 
  •  
  • function initializeClock(id, endtime) { 
  •   const clock = document.getElementById(id); 
  •   const daysSpan = clock.querySelector('.days'); 
  •   const hoursSpan = clock.querySelector('.hours'); 
  •   const minutesSpan = clock.querySelector('.minutes'); 
  •   const secondsSpan = clock.querySelector('.seconds'); 
  •  
  •   function updateClock() { 
  •     const t = getTimeRemaining(endtime); 
  •  
  •     daysSpan.innerHTML = t.days; 
  •     hoursSpan.innerHTML = ('0' + t.hours).slice(-2); 
  •     minutesSpan.innerHTML = ('0' + t.minutes).slice(-2); 
  •     secondsSpan.innerHTML = ('0' + t.seconds).slice(-2); 
  •  
  •     if (t.total <= 0) { 
  •       clearInterval(timeinterval); 
  •     } 
  •   } 
  •  
  •   updateClock(); 
  •   const timeinterval = setInterval(updateClock, 1000); 
  •  
  • const deadline = new Date(Date.parse(new Date()) + 15 * 24 * 60 * 60 * 1000); 
  • initializeClock('clockdiv', deadline); 
  •  
  •  
  •  
  •  

    来源:今日头条内容投诉

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    软考中级精品资料免费领

    • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

      难度     813人已做
      查看
    • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

      难度     354人已做
      查看
    • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

      难度     318人已做
      查看
    • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

      难度     435人已做
      查看
    • 2024年上半年系统架构设计师考试综合知识真题

      难度     224人已做
      查看

    相关文章

    发现更多好内容

    猜你喜欢

    AI推送时光机
    位置:首页-资讯-后端开发
    咦!没有更多了?去看看其它编程学习网 内容吧
    首页课程
    资料下载
    问答资讯