s實現動態倒計時效果的步驟:首先是獲取到用戶輸入的目標時間,在獲取當前時間,用目標時間減去當前時間,獲得時間差;然后,將得到的時間差傳化為天數、小時、分鐘、秒鐘;最后,動態的輸出這些剩余時間。
下面我們就來一步一步的實現動態倒計時:
1、建立顯示的樣式
html代碼:
<form>目的日期:<br><br>
<input type="text" id="year"><span>年</span>
<input type="text" id="month"><span>月</span>
<input type="text" id="day"><span>日</span><br><br>
<input type="text" id="hour"><span>時</span>
<input type="text" id="minute"><span>分</span>
<input type="text" id="second"><span>秒</span><br><br>
<input type="button" value="確定" onclick="show()">
</form><br><br>
<div class="time1">還剩時間:<br><br>
<span id="_d"></span>天
<span id="_h"></span>時
<span id="_m"></span>分
<span id="_s"></span>秒
</div>
css代碼:
input{width:50px;height: 20px;border:1px solid black;}
.time1 span{display:inline-block;width:40px;height: 20px;}
效果圖:
2、實現動態倒計時--js代碼
第一步:首先是要獲取到目標時間,當我們在頁面輸入目標日期,點擊確認后,得到目標時間。
function show(){
//獲取目的日期
var myyear=document.getElementById("year").value;
var mymonth=document.getElementById("month").value-1;
var myday=document.getElementById("day").value;
var myhour=document.getElementById("hour").value;
var myminute=document.getElementById("minute").value;
var mysecond=document.getElementById("second").value;
var time=Number(new Date(myyear,mymonth,myday,myhour,myminute,mysecond));
}
第二步:獲取當前時間、然后用目標時間減去當前時間,得到剩余時間,即時間差。
//獲取當前時間
var nowTime=Date.now();
//獲取時間差
var timediff=Math.round((time-nowTime)/1000);
第三步:將得到的時間差傳化為天數、時、分、秒
//獲取還剩多少天
var day=parseInt(timediff/3600/24);
//獲取還剩多少小時
var hour=parseInt(timediff/3600%24);
//獲取還剩多少分鐘
var minute=parseInt(timediff/60%60);
//獲取還剩多少秒
var second=timediff%60;
第四步:輸出剩余時間
//輸出還剩多少時間
document.getElementById("_d").innerHTML=day;
document.getElementById("_h").innerHTML=hour;
document.getElementById("_m").innerHTML=minute;
document.getElementById("_s").innerHTML=second;
效果圖:
此時還不是動態的輸出,還需要我們手動的不斷刷新,在輸入目標日期。
第五步:使用定時器setTimeout(),動態輸出時間
setTimeout(show,1000);
if(timediff==0){return 0;}
當時間差為0時,返回0,停止輸出。也可以使用clearInterval()方法停止定時器,不在繼續動態輸出時間:
var set=setTimeout(show,1000);
if(timediff==0){clearInterval(set);}
當時間差為0時,使用clearInterval()方法停止setTimeout()定時器,不在輸出時間。
動態效果圖:
說明:
setInterval() :定義一個間隔性觸發計時器,會按照指定的周期(以毫秒計)來調用函數或計算表達式。該方法會不停地調用函數,直到 調用clearInterval()方法來停止setInterval()計時器或窗口被關閉。
總結:以上就是本篇文章的全部內容,希望能對大家的學習有所幫助。
以上就是js如何實現動態倒計時效果的詳細內容,更多請關注其它相關文章!
更多技巧請《轉發 + 關注》哦!
css3的animation想必大家都知道吧,那 steps 逐幀動畫你知道嗎?對于我來說,實際工作及練習中也很少用到這種跳躍式變化的動畫,而它start和end的解釋又比較“不說人話”,以前用到steps動畫的時候,常常是靠調試,來回設置start和end,主打的就是瞎貓碰上死耗子。雖然之前也看過關于他們區別的文章,但都是半知半解,過兩天就剩零知零解了。最近忙里偷閑,我終于打算一探究竟了,我倒要看看start和end到底有什么區別! 順便寫幾個小demo造福一方~
animation的工作原理是通過將元素的CSS樣式從一個狀態改變為另一個狀態時(我們稱為線性變化),瀏覽器會在每個關鍵幀之間插入補間動畫,所以動畫效果是連貫性的,這也就是我們常用的 補間動畫。
而steps()逐幀動畫則是跳躍式變化,如果說補間動畫是一個滑坡式的變化,那么逐幀動畫就是階梯式變化,它的變化沒有中間過程。補間動畫就像你看的普通動畫片,而逐幀動畫就像是那種定格動畫。
語法:
animation-timing-function: steps(number, [end | start])
參數說明:
什么叫在間隔的起點或終點發生變化呢?光看文字十有八九看不懂,下面就用示例代碼來說明。
上圖是我ps的一張圖,尺寸為200*750,共5個色塊,每個色塊高度150。 在示例代碼中我將以這張圖為背景,每一幀將背景上升一個色塊的高度。關鍵代碼如下:
animation: ani 5s 2s steps(5,start) infinite backwards;
@keyframes ani{
100%{
background-position:0px -750px;
}
}
在設置動畫前的初始狀態:
再直接來看看動畫末態的情況: 一個色塊150px,所以動畫末態是背景圖片向上移動750px。
為了完整的看到動畫效果,我設置了2秒的動畫延遲
我們設置的steps的第一個參數number為 5 ,也就是把整個動畫過程切割成5個片段,如下圖:
在實驗之前先來分析一下,既然是片段,那必然有片段的起點和終點,可以把補間動畫看作點,而逐幀動畫則是面。那么這五個片段的起點終點是哪呢,如下圖:
你會發現,動畫是由6個點切成段五段,帶著這個思路開始下面的實驗。
先來看一下設置 start 的效果:
你會發現色塊1怎么不顯示了,甚至在動畫沒開始前,也就是延時階段直接就顯示了【2】,變化過程為: 2 - 3 - 4 - 5 - 空
分析一下就可以想到,start是在間隔的起點發生階越變化,即開始直接就發生變化了,第一段直接階越到了第一段結束的位置。
再來看下設置 end 的效果:
你發現動畫變正常了,動畫過程是從【1】到【5】。 再分析一下,因為end是在間隔終點發生階越變化,即每一段都會在其開始階段進行停留,這一段結束后才會發生變化直接階越到下一段的開始狀態。
總結:
可以將補間動畫和 steps 逐幀動畫類比于點和線的區別,steps切割開的每個動畫片段就是一條樣式不變的線,而線都有首尾兩個點。
設置 start 的 steps 的動畫總是在開始發生變化,即逐幀顯示每一段的終點;
而設置 end 的 steps 的動畫總是在結束發生變化,即逐幀顯示每一段的起點;
其實很簡單的道理,為什么總是記不住呢,因為他和人的慣性思維恰好相反。設置start總覺得是顯示每一段的開頭,可它恰好相反,start是開頭發生變化,顯示的都是每一段的結尾。
另一種理解思路:
steps(number, [end | start]) 是將動畫分為number段,共有number + 1幀畫面。start就是拋棄第一幀畫面執行動畫,end就是拋棄最后一幀畫面執行動畫。
注意: 第二個參數還有兩個內置值,step-start等同于steps(1,start),動畫分成1步,2個節點,拋棄第一個節點,即顯示結尾節點的狀態;同理step-end等同于steps(1,end)。
jump-start:在每個時間間隔開始的時候跳1步到下一狀態位置; jump-end:在每個時間間隔結束的時候跳1步到下一狀態位置; jump-both:在每個時間間隔開始和結束的時候跳1步到下一狀態位置,跳步次數會比預設的多一次; jump-none:在每個狀態位置停留夠一個時間間隔才跳到下一位置,跳步次數會比與預設的少一次
上面我只設置了動畫100%時的狀態,那如果我設置了多個關鍵幀的狀態呢,那還是以整個動畫過程切割成number段嗎?
我們再來做幾個實驗:
我們將動畫時間由5秒改成10秒(為了方便觀察,我們設置steps第二個參數為end,放棄第一幀畫面),然后將原先的動畫末態改到50%,并在動畫100%時增加邊框。·
animation: ani 10s 2s steps(5,end) infinite backwards;
@keyframes ani{
50%{
background-position:0px -750px;
}
100%{
border: 100px solid red;
}
結果如下圖:
觀察后發現,在10秒的完整動畫期間:background-position的變化過程是圖像顯示由1到5,再由5到1,共變化了 【10】 次,而我設置的steps的number參數是 【5】,這就打破了上面我說的以整個動畫過程切割成number段的假說。
同時可以觀察到,border的變化過程共進行了5次,因為我們只在100%的時候設置了border。
得出結論: steps的number參數并不是將整個動畫過程切割成number段,而是對于某個css樣式來說,每一段關鍵幀的變化切割成number段。
假想:上面我們只在動畫100%的時候設置了100px的boder,如果我們在50%的時候也設置border,并且狀態恰好是100%的一半,這樣對于動畫0%到100%是一個流暢的線性變化。請問這時候動畫還會被切成5段嗎?
觀察發現,動畫被切成了10段。
得出結論: 即使將幾個關鍵幀的css變化設置的具有規律性,但是steps仍然會將每段關鍵幀的變化切割成number段,即只要在這個關鍵幀里設置了某個css,那么對于這個css來說,這個關鍵幀就會被視為steps動畫的端點。
那既然每段關鍵幀都會被steps切割成number段,那每段的steps動畫執行的時間怎么劃分呢?其實想想就能想到,應該是按照關鍵幀占整個動畫過程的比例分割整個動畫時間。
如下圖設置boder:【0%-50%】寬度由0到100,【50%-75%】寬度由100到0,【75%-100%】寬度由0到100
很明顯可以觀察到,border寬度變化的時間為 2:1:1,即驗證了我上面的推論。
下面我舉幾個steps() 動畫的使用場景。
用一張人物動作關鍵幀的長圖,和上面的案例一樣,通過修改背景圖片位置,實現動物或人物的動作變化。作為一名蒸愛粉,我給哥哥做了一個跳舞的動畫:
打字機的原理是用一個和文字總寬度一樣的div覆蓋文字,并用這個div的邊框設置steps()動畫實現光標效果,然后減小div寬度(每一幀減小一個文字的寬度),讓下面文字漏出來就好了~\
點擊運行查看效果~
我這里提供了兩種實現方案,準確來說是三種:
方案1: var() css變量 + counter-reset計數器 + @property規則 + steps()逐幀動畫
使用css變量和counter-reset計數器來實現倒計時的數字,只要設置動畫,在5秒內將變量由5變為0即可實現倒計時,但是變量的變化是不會被瀏覽器添加補間動畫的,即只會在5秒后直接變成0,而不會有中間,5-4-3-2-1-0的過程,這時我們再利用@property關鍵字為這個變量配置規則,實現數字變化的動態過程!
而最后出現的 "Go" 可以利用step-end逐幀動畫,在5秒后將文字修改成 "Go",或者利用@counter-style關鍵字自定義計數器規則,在變量變化到0的時候,定義一個symbols符號。
如果你不了解counter-reset、@property和@counter-style,可以查看以下兩篇文章:
CSS counter-reset 屬性
mdn 關于@property API 說明 mdn 關于@counter-style 說明
點擊運行查看效果~
方案2: 只用steps()逐幀動畫
其實這個就很簡單了,所有的數字和最后的 "GO" 都在html里寫死并設置等高,然后就可以向上面移動圖片位置一樣移動這些數字進行顯示了。
點擊運行查看效果~
平常工作中可以用到steps()逐幀動畫的場景也有很多:
原文鏈接:https://juejin.cn/post/7242145254056214583
5年前的今天,即1964年10月16日,我國第一顆原子彈爆炸成功。這一成就集中代表我國科學技術當時所能達到的新水平,有力地打破了超級大國的核壟斷和核訛詐,提高了我國的國際地位。那么,關于這第一顆原子彈爆炸前后的故事你了解多少呢?由奚啟新編著的《朱光亞傳》(中國青年出版社)便提到了諸多歷史細節。比如為了保密,在張愛萍親自主持下,有關人員著手編制了暗語:正式爆炸的原子彈密語為“邱小姐”,原子彈裝配為“穿衣”,原子彈裝配車間,密碼為“住下房”,吊到塔架上的工作平臺為“住上房”,原子彈插火工品,密碼為“梳辮子”,氣象的密碼為“血壓”,起爆時間為“零時”。
1964年9月29日,原子彈從青海金銀灘起運。朱光亞通過專線向北京報告:“‘邱小姐’已上轎。”
在這之前,9月23日下午,周恩來在中央軍委辦公廳會議室,召集賀龍、陳毅、羅瑞卿、張愛萍、劉杰、劉西堯開了一個絕密會議。周恩來首先傳達了毛澤東的指示,然后非常嚴肅地說:既然決定早試,那就按10月份早試的方案進行。張愛萍、劉西堯趕赴試驗現場組織指揮;劉杰留在北京主持二機部、國防科委組成的聯合辦公室,負責北京與試驗場的聯絡,并負責組織有關核工廠的關鍵技術資料、儀器設備的安全轉移,防止敵人轟炸把我們的家底都毀了;陳毅組織外交部做好對外宣傳工作的準備。如果敵人襲擊,一定要保護好我們的專家、核研制基地、重要的核工廠。保密問題,尤為重要。我保密柜的鑰匙都是我親自保管。給毛主席的信,信皮都是我親自寫,不要人代,已成習慣了。希望你們對家里人也不說,不要一高興就說出去。對誰都不能講。
周恩來率先垂范,據鄧穎超在紀念周恩來90誕辰時回憶說:“我國第一顆原子彈爆炸前,他也向我保密,事先我一點也不知情。”
會議結束時,周恩來指示:為了確保核試驗場與北京之間的聯絡保密,應規定出一些暗語和密碼來,今晚就制定出來。在張愛萍親自主持下,有關人員立即著手編制暗語。參加編制暗語的總參作戰部參謀兼首次核試驗委員會辦公室主任的李旭閣回憶說:我與二機部辦公廳主任張漢周,二機部部長劉杰的秘書李鷹翔,國防科委的高建民處長一起編暗語。因為首次核試驗的原子彈是圓形,大家同意,將原子彈取名為“邱小姐”,將裝原子彈的平臺叫“梳妝臺”,連接火工品的電纜像頭發一樣長,叫“梳辮子”。我寫完后,當天晚上便送給了張愛萍,密碼對照表上規定:正式爆炸的原子彈密語為“邱小姐”,原子彈裝配為“穿衣”,原子彈裝配車間,密碼為“住下房”,吊到塔架上的工作平臺為“住上房”,原子彈插火工品,密碼為“梳辮子”,氣象的密碼為“血壓”,起爆時間為“零時”。
有關領導也有相應的代號。張副總長看了后連聲說:“旭閣,你們編得好,既形象生動又隱秘難猜。”原子彈分兩部分裝運。大部分部件由專列火車運抵烏魯木齊,最關鍵的兩個部件——鈾球和點火中子源,則由另一專列運至西寧后,再由經過保溫改裝的伊爾14運輸機運往核試驗基地。根據周恩來的指示,裝運原子彈的專列被定為一級專列,享受國家最高元首的警衛規格。
1964年10月14日,張愛萍召開首次核試驗委員會會議,進行“氣象會商”,以確定第一顆原子彈具體爆炸時間。國家氣象局、總參氣象局和核試驗基地氣象專家經過認真討論,認為10月15日、16日為“好天氣”,可以試爆。按照毛澤東確定的“早響”原則,大多數同志傾向于15日,但有一位列席會議的核試驗基地氣象預報員朱品德提供了一個情況:14日晚上有可能起大風,陣風可達每秒14至16米。眾人大吃一驚。北京來的氣象專家解釋道,朱品德此前提出過這個意見,但大家分析后認為“可能性很小”。張愛萍表情嚴肅了起來,說:“朱品德同志的意見提得好!第一,在科學技術面前,不適用‘少數服從多數’原則,只服從真理!第二,提出不同意見,可以打開大家視野,把事情辦得更好。”朱品德是基層氣象預報員,搜集了近幾年來試驗場區周邊氣象站(臺)的氣象資料,有著豐富的實際經驗。他詳細匯報了自己的看法。張愛萍沉思片刻,說:這樣吧,下午再進行一次氣象會商,現在各氣象部門回去認真研究。”下午4時,張愛萍再次召開首次核試驗黨委常委會,最后確定10月16日進行正式核試驗。會議一結束,張愛萍就給留守北京協調指揮的劉杰打電話:“‘邱小姐’16日出嫁。”
巨響震驚世界沖鋒號吹響,中國第一顆原子彈起爆進入倒計時。
原子彈順利坐落到了鐵塔上。張愛萍再次向北京報告:“‘邱小姐’已經坐在梳妝臺前。”站在鐵塔下,注視著那顆凝聚著千萬人心血的原子彈,大家心潮澎湃。忽然間,刮起了大風,經測量,風速達每秒16米。朱品德的預報被證實了。10月15日下午2點,風速減小到了每秒6米以下,符合核爆條件。張愛萍、劉西堯等人最后商量決定:16日15時為核爆“零時”,并報告了北京,得到了周總理的批準。
10月16日凌晨4時,李覺代表第九作業隊向首次核試驗委員會呈上報告,請求批準于6時30分開始給原子彈插接雷管。首次試驗委員會批復:同意。張愛萍、劉西堯、成鈞、朱光亞、朱卿云、張震寰、張蘊鈺都鄭重地在報告上簽下了自己的名字。插接雷管是原子彈試爆前最后一道工序。這里所說的插接雷管,不同于往炸藥里插雷管。它是將多路雷管的導線,平行地垂向地面插入導管。由于它形似姑娘的辮子,故插接雷管的密語就是“梳辮子”。同時,張愛萍即向北京報告:16日6時30分‘邱小姐’開始梳辮子。”給原子彈插接雷管時,張愛萍、劉西堯、張蘊鈺又一起親臨現場。張愛萍親切地望著李覺、吳際霖、朱光亞三人,說:“開始吧!”接著又問:“三把鑰匙都帶上了沒有?”張愛萍問的“三把鑰匙”,一把是起爆臺的鑰匙,另外兩把是變電房和變壓器控制站的鑰匙。分別由陳能寬、李覺、張蘊鈺掌管。當時,核武器研究院有個規定,就是插雷管時,必須要帶上起爆臺的鑰匙。因為有鑰匙在身邊,插雷管時就不可能啟動起爆臺裝置,這也是為了確保安全。張蘊鈺拿著起爆臺鑰匙,和李覺一起,陪同插雷管人員上了鐵塔。上塔插接雷管人員共有6名作業隊人員。其中,3人負責將雷管安裝在原子彈上;1人負責傳送雷管和檢查編號,并做好記錄;2人負責導通。雖然平時操練了多時,但真正要給原子彈插雷管,操作人員不免還是很緊張。李覺就安慰他們說:“不要緊張,我們與你們在一起。你們看,總指揮張(愛萍)副總長、朱(光亞)副部長也在塔下陪著你們呢!”李覺回憶說:插雷管時,一方面要自行檢查,另外還要交互檢查,完了以后都得簽字。之后,對整個系統進行導通。插雷管的過程一共用了差不多4個小時,每插一個都要檢查,看是否插到底了。如果插不到底,就很可能產生不了一個比較好的球形內聚波,破壞這個球面波的對稱性。彭恒武在青海基地時就對負責插雷管的技術人員說過,如果這次要不響的話,是你們雷管沒插好。因為理論部的計算證明是沒有問題的。596出廠前夜做過冷試驗,出中子出得很好,證明整個核裝置的理論設計、裝配、加工等都是不錯的。那么,從理論到試驗都沒有問題,試驗如果真失敗了,雷管沒插好是最大的可能。
16日10時30分,首次核試驗進入清場程序。
張蘊鈺在回憶文章里寫道:當我們來到指揮觀察所的時候,離“零時”已不到20分鐘了。張愛萍對我說:“K1指令已經發出。”這時,炊事員送來了當午飯的包子,老遠就聞到了香味,但吃到嘴里一點感覺也沒有。大家的表情都異常嚴肅。“K3”指令發出后,儀器設備進入自動化程序。9、8、7、6 ……讀秒的聲音讓我感到了一種無法形容的感動。我屏住呼吸,戴著防護眼鏡的頭低著,等待著最后時刻的降臨。那種可怕的寂靜,一直延續到讀秒的“零時”過后,隨即被一道強烈的閃電打破了。緊接著傳來了一陣我從未聽到過的轟鳴聲。專家們根據閃光、火球和蘑菇煙云的景象,判定是核爆炸。最初的歡呼聲來自西側參觀的人群。他們激動地呼喊著,跳躍著,灑著淚擁抱在一起,把帽子拋向了天空。
走過萬水千山
我依然眷念您
歡迎訂閱2019年《讀者報》
郵發代號:61—98
訂閱方式
1. 拔打11185或到當地郵政所訂閱
2. 關注“讀者報官方微信”,進入微店下單訂報
3.淘寶店鋪:https://shop269196912.taobao.com
4.《讀者報》微店地址:https://weidian.com/?userid=357720529&wfr=wx_profile_wxh5&share_relation=fe55d9279dc1de63_791158084_2
5.《看熊貓》雜志微店地址:https://weidian.com/item.html?itemID=2244146540
*請認真填寫需求信息,我們會在24小時內與您取得聯系。