日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
僅用18行JavaScript實(shí)現(xiàn)一個(gè)倒數(shù)計(jì)時(shí)器

前言

創(chuàng)新互聯(lián)建站專注于上杭網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供上杭營(yíng)銷型網(wǎng)站建設(shè),上杭網(wǎng)站制作、上杭網(wǎng)頁(yè)設(shè)計(jì)、上杭網(wǎng)站官網(wǎng)定制、微信小程序開(kāi)發(fā)服務(wù),打造上杭網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供上杭網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

有時(shí),您將需要構(gòu)建一個(gè)JavaScript倒數(shù)時(shí)鐘。您可能有活動(dòng),銷售,促銷或游戲。您可以使用原始JavaScript構(gòu)建時(shí)鐘,而不用尋找最近的插件。雖然有很多很棒的時(shí)鐘插件,但是使用原始JavaScript可以帶來(lái)以下好處:

  • 您的代碼將是輕量級(jí)的,因?yàn)樗鼘⒕哂辛阋蕾囆浴?/li>
  • 您的網(wǎng)站將表現(xiàn)更好。您無(wú)需加載外部腳本和樣式表。
  • 您將擁有更多控制權(quán)。您將構(gòu)建時(shí)鐘,使其行為完全符合您希望的方式(而不是嘗試將插件彎曲到您的意愿)。

因此,事不宜遲,這里介紹了如何僅用18行JavaScript來(lái)制作自己的倒計(jì)時(shí)時(shí)鐘

基本時(shí)鐘:倒數(shù)到特定的日期或時(shí)間

以下是創(chuàng)建基本時(shí)鐘所涉及步驟的快速概述:

  • 設(shè)置有效的結(jié)束日期。
  • 計(jì)算剩余時(shí)間。
  • 將時(shí)間轉(zhuǎn)換為可用格式。
  • 將時(shí)鐘數(shù)據(jù)輸出為可重復(fù)使用的對(duì)象。
  • 在頁(yè)面上顯示時(shí)鐘,并在時(shí)鐘為零時(shí)停止時(shí)鐘。

設(shè)定有效的結(jié)束日期

首先,您需要設(shè)置一個(gè)有效的結(jié)束日期。這應(yīng)該是JavaScript的Date.parse()方法可以理解的任何格式的字符串。例如:

在ISO 8601格式:

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

簡(jiǎn)短格式:

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

或者,長(zhǎng)格式:

 
 
 
  1. const deadline = 'December 31 2015'; 

這些格式中的每一種都允許您指定確切的時(shí)間和時(shí)區(qū)(對(duì)于ISO日期,則為UTC的偏移量)。例如:

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

您可以在本文中閱讀有關(guān)JavaScript中日期格式的更多信息。

計(jì)算剩余時(shí)間

下一步是計(jì)算剩余時(shí)間。我們需要編寫一個(gè)函數(shù),該函數(shù)需要一個(gè)表示給定結(jié)束時(shí)間的字符串(如上所述)。然后,我們計(jì)算該時(shí)間與當(dāng)前時(shí)間之間的時(shí)差??雌饋?lái)像這樣:

 
 
 
  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.   }; 

首先,我們創(chuàng)建一個(gè)變量total,以保留剩余時(shí)間直到截止日期。該Date.parse()函數(shù)將時(shí)間字符串轉(zhuǎn)換為毫秒值。這使我們可以相減兩次,并獲得兩者之間的時(shí)間量。

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

將時(shí)間轉(zhuǎn)換為可用格式

現(xiàn)在,我們要將毫秒轉(zhuǎn)換為天,小時(shí),分鐘和秒。讓我們以秒為例:

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

讓我們分解一下這里發(fā)生的事情。

  1. 將毫秒除以1000可轉(zhuǎn)換為秒: (t/1000)
  2. 將總秒數(shù)除以60,然后取余數(shù)。您不希望所有的秒數(shù),僅需要計(jì)算分鐘數(shù)之后剩下的秒數(shù):(t/1000) % 60
  3. 四舍五入到最接近的整數(shù)。這是因?yàn)槟枰暾拿霐?shù),而不是幾分之一秒:Math.floor( (t/1000) % 60 )

重復(fù)此邏輯,將毫秒轉(zhuǎn)換為分鐘,小時(shí)和天。

輸出時(shí)鐘數(shù)據(jù)作為可重用對(duì)象

準(zhǔn)備好幾天,幾小時(shí),幾分鐘和幾秒鐘之后,我們現(xiàn)在可以將數(shù)據(jù)作為可重用的對(duì)象返回:

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

該對(duì)象允許您調(diào)用函數(shù)并獲取任何計(jì)算值。這是如何獲取剩余時(shí)間的示例:

 
 
 
  1. getTimeRemaining(deadline).minutes 

方便吧?

顯示時(shí)鐘并在達(dá)到零時(shí)停止

現(xiàn)在,我們有了一個(gè)可以花費(fèi)剩余的天,小時(shí),分鐘和秒的功能,我們可以構(gòu)建時(shí)鐘了。首先,我們將創(chuàng)建以下HTML元素來(lái)保存時(shí)鐘:

 

然后,我們將編寫一個(gè)在新div中輸出時(shí)鐘數(shù)據(jù)的函數(shù):

 
 
 
  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); 

該函數(shù)有兩個(gè)參數(shù)。這些是包含我們時(shí)鐘的元素的ID,以及倒計(jì)時(shí)的結(jié)束時(shí)間。在函數(shù)內(nèi)部,我們將聲明一個(gè)clock變量并將其用于存儲(chǔ)對(duì)我們的時(shí)鐘容器div的引用。這意味著我們不必繼續(xù)查詢DOM。

接下來(lái),我們將使用setInterval每秒執(zhí)行一個(gè)匿名函數(shù)。此功能將執(zhí)行以下操作:

  • 計(jì)算剩余時(shí)間。
  • 將剩余時(shí)間輸出到我們的div。
  • 如果剩余時(shí)間為零,請(qǐng)停止計(jì)時(shí)。
  • 此時(shí),剩下的唯一步驟是像這樣運(yùn)行時(shí)鐘:
 
 
 
  1. initializeClock('clockdiv', deadline); 

恭喜你!現(xiàn)在,您僅用18行JavaScript就擁有了一個(gè)基本時(shí)鐘。

準(zhǔn)備顯示時(shí)鐘

在設(shè)置時(shí)鐘樣式之前,我們需要進(jìn)行一些細(xì)化。

  • 消除初始延遲,使您的時(shí)鐘立即顯示。
  • 提高時(shí)鐘腳本的效率,以免持續(xù)重建整個(gè)時(shí)鐘。
  • 根據(jù)需要添加前導(dǎo)零。

消除初始延遲

在時(shí)鐘中,我們習(xí)慣于setInterval每秒更新一次顯示。多數(shù)情況下,這很好,除非在開(kāi)始時(shí)會(huì)有一秒鐘的延遲。要消除此延遲,我們必須在間隔開(kāi)始之前更新一次時(shí)鐘。

讓我們將要傳遞給setInterval它的匿名函數(shù)移到其自己的獨(dú)立函數(shù)中。我們可以命名這個(gè)函數(shù)updateClock。在updateClock外部調(diào)用該函數(shù)setInterval,然后在內(nèi)部再次調(diào)用setInterval。這樣,時(shí)鐘顯示就沒(méi)有延遲了。

在您的JavaScript中,替換為:

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

有了這個(gè):

 
 
 
  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); 

避免持續(xù)重建時(shí)鐘

我們需要使時(shí)鐘腳本更高效。我們只想更新時(shí)鐘中的數(shù)字,而不是每秒重新構(gòu)建整個(gè)時(shí)鐘。實(shí)現(xiàn)此目的的一種方法是將每個(gè)數(shù)字放在span標(biāo)簽中,然后僅更新這些跨度的內(nèi)容。

這是HTML:

 

 
 
 
  1.  
  2.     Days: 
     
  3.     Hours: 
     
  4.     Minutes: 
     
  5.     Seconds:  
 

現(xiàn)在讓我們參考這些元素。在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'); 

接下來(lái),我們需要更改updateClock功能以及更新數(shù)字。新代碼如下所示:

 
 
 
  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.     ... 

添加前導(dǎo)零

現(xiàn)在時(shí)鐘不再每秒都在重建,我們還有另一件事要做:添加前導(dǎo)零。例如,不是讓時(shí)鐘顯示7秒,而是顯示07秒。一種簡(jiǎn)單的方法是在數(shù)字的開(kāi)頭添加字符串“ 0”,然后切掉最后兩位數(shù)字。

例如,要在“ seconds”值上添加前導(dǎo)零,您可以對(duì)此進(jìn)行更改:

 
 
 
  1. secondsSpan.innerHTML = t.seconds; 

對(duì)此:

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

如果需要,您也可以在分鐘和小時(shí)中添加前導(dǎo)零。如果您走了這么遠(yuǎn),恭喜!您的時(shí)鐘現(xiàn)在可以顯示了。

注意:您可能需要在CodePen中單擊“重新運(yùn)行”才能開(kāi)始倒計(jì)時(shí)。

更進(jìn)一步

下面的示例演示如何針對(duì)某些用例擴(kuò)展時(shí)鐘。它們都是基于上面看到的基本示例。

自動(dòng)安排時(shí)鐘

假設(shè)我們希望時(shí)鐘顯示在某些日子,而不是其他日子。例如,我們可能會(huì)發(fā)生一系列事件,并且不想每次都手動(dòng)更新時(shí)鐘。這是提前安排事情的方法。

通過(guò)在CSS中將其display屬性設(shè)置為隱藏時(shí)鐘none。然后將以下內(nèi)容添加到initializeClock函數(shù)中(以開(kāi)頭的行之后var clock)。一旦initializeClock調(diào)用此函數(shù),這將導(dǎo)致時(shí)鐘僅顯示:

 
 
 
  1. clock.style.display = 'block'; 

接下來(lái),我們可以指定顯示時(shí)鐘的日期。這將替換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數(shù)組中的每個(gè)元素代表一個(gè)開(kāi)始日期和一個(gè)結(jié)束日期。如上所述,可以包括時(shí)間和時(shí)區(qū),但是我在這里使用了簡(jiǎn)單的日期來(lái)保持代碼的可讀性。

最后,當(dāng)用戶加載頁(yè)面時(shí),我們需要檢查是否在指定的時(shí)間范圍內(nèi)。該代碼應(yīng)替換先前對(duì)該initializeClock函數(shù)的調(diào)用。

 
 
 
  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. }); 

現(xiàn)在,您可以提前安排時(shí)鐘,而無(wú)需手動(dòng)更新。您可以根據(jù)需要縮短代碼。為了便于閱讀,我讓我變得冗長(zhǎng)。

從用戶到達(dá)起將計(jì)時(shí)器設(shè)置為10分鐘

用戶到達(dá)或開(kāi)始特定任務(wù)后,有必要在給定的時(shí)間內(nèi)設(shè)置倒計(jì)時(shí)。我們將在此處將計(jì)時(shí)器設(shè)置為10分鐘,但是您可以使用任意時(shí)間。

我們需要做的就是deadline用這個(gè)替換變量:

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

該代碼將花費(fèi)當(dāng)前時(shí)間,并增加十分鐘。這些值將轉(zhuǎn)換為毫秒,因此可以將它們加在一起并變成新的截止日期。

現(xiàn)在,我們有了一個(gè)時(shí)鐘,可以從用戶到達(dá)時(shí)開(kāi)始倒數(shù)十分鐘。隨意玩耍,嘗試不同的時(shí)間長(zhǎng)度。

跨頁(yè)面保持時(shí)鐘進(jìn)度

有時(shí),有必要將時(shí)鐘狀態(tài)保留的時(shí)間不僅限于當(dāng)前頁(yè)面。如果我們想在整個(gè)網(wǎng)站上設(shè)置10分鐘的計(jì)時(shí)器,則我們不希望在用戶轉(zhuǎn)到其他頁(yè)面時(shí)將其重置。

一種解決方案是將時(shí)鐘的結(jié)束時(shí)間保存在cookie中。這樣,導(dǎo)航到新頁(yè)面不會(huì)將結(jié)束時(shí)間重置為現(xiàn)在的十分鐘。

這是邏輯:

如果Cookie中記錄了截止日期,請(qǐng)使用該截止日期。

如果不存在該cookie,則設(shè)置一個(gè)新的截止日期并將其存儲(chǔ)在cookie中。

要實(shí)現(xiàn)這一點(diǎn),請(qǐng)用deadline以下內(nèi)容替換變量:

 
 
 
  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和正則表達(dá)式,它們本身就是單獨(dú)的主題。因此,我在這里不再贅述。需要注意的一件事是,您需要更改.yourdomain.com為實(shí)際域。

有關(guān)客戶端事件的重要警告

JavaScript日期和時(shí)間是從用戶計(jì)算機(jī)中獲取的。這意味著用戶可以通過(guò)更改計(jì)算機(jī)上的時(shí)間來(lái)影響JavaScript時(shí)鐘。在大多數(shù)情況下,這無(wú)關(guān)緊要。但是,在某些超級(jí)敏感的情況下,有必要從服務(wù)器獲取時(shí)間。可以使用一些PHP或Ajax來(lái)完成,這兩者都超出了本教程的范圍。

從服務(wù)器獲取時(shí)間后,我們可以使用本教程中的相同技術(shù)來(lái)使用它。

加起來(lái)

閱讀完本文中的示例之后,您現(xiàn)在知道如何僅用幾行原始JavaScript代碼創(chuàng)建自己的倒數(shù)計(jì)時(shí)器!我們已經(jīng)研究了如何制作基本的倒數(shù)時(shí)鐘并有效顯示它。我們還介紹了添加一些有用的附加功能,包括計(jì)劃,絕對(duì)時(shí)間和相對(duì)時(shí)間,以及使用Cookie保留頁(yè)面和站點(diǎn)訪問(wèn)之間的狀態(tài)。

完整代碼

 
 
 
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Countdown Clock 
  8.  
  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.     

    Countdown Clock

     
  48.  
  49.   
     
  50.      
  51.     Days
 
  •   
  •  
  •   
     
  •      
  •     Hours
  •  
  •   
  •  
  •   
     
  •      
  •     Minutes
  •  
  •   
  •  
  •   
     
  •      
  •     Seconds
  •  
  •   
  •  
  •  
  •  
  •  
  •  

  • 標(biāo)題名稱:僅用18行JavaScript實(shí)現(xiàn)一個(gè)倒數(shù)計(jì)時(shí)器
    本文來(lái)源:http://m.5511xx.com/article/dhodgsd.html

    其他資訊