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小时内与您取得联系。