纯js时钟特效详细代码分析实例教程
电子时钟是网上常见的功能,在学习date对象和定时器功能时,来完成一个电子时钟的制作是不错的选择。学习本教程之前,读者需要具备html和css技能,同时需要有简单的javascript基础。
先准备一个html元素,用来放置时钟。新建一个div元素,它的id命名为clock,如下所示:
- <div id="clock" class="clock_con"></div><!--基础时钟元素-->
本实例电子时钟的格式设定为 (yyyy-MM-dd hh:mm:ss) ,用js来组合一个简单的时钟字符串放到clock元素中。
本实例把时钟功能封装到函数中,所以先创建一个creatClock函数,在creatClock中再来编写具体代码。
建议在完成某一个前端功能时,应先分析功能的具体操作。再根据具体操作把实现功能的方法分成多个步骤,接下来一个步骤一个步骤去完成它。来看一下用js组合这样一串字符,需要哪些步骤:
1 调用date对象,获取计算机的本地时间
1.1 调用date对象
1.2 获取当前年份
1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
1.4 获取当前日期
1.5 获取当前小时
1.6 获取分钟
1.7 获取秒数
2. 格式化获取到的时间数据
2.1 单数字前添加字符串0,用以符合时钟格式
2.2 组合时间数据为字符串
3. 在clock元素中实时显示时间
3.1 获取clock元素
3.2 修改clock元素中的时间
3.3 使用定时器实时更新时间
具体代码如下:
- function fnCreatClock(){
- //声明时间相关变量
- var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;
- //1 获取计算机本地时间
- function fnGetDate(){
- //1.1 调用date对象
- dLocal = new Date();
- //1.2 获取当前年份
- nYear = dLocal.getFullYear();
- //1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
- nMonth = dLocal.getMonth() + 1;
- //1.4 获取当前日期
- nDate = dLocal.getDate();
- //1.5 获取当前小时
- nHours = dLocal.getHours();
- //1.6 获取分钟
- nMinutes = dLocal.getMinutes();
- //1.7 获取秒数
- nSeconds = dLocal.getSeconds();
- }
- //2.1 封装一个函数,用于把单数字前添加字符串0,例如1改为01
- function fnToDouble(num){
- //声明一个返回结果
- var sResult = '';
- if(num<10){
- //判断数字小于10则是单数字,需要在前面添加字符串0
- sResult = '0' + num;
- }else{
- //数字为10以上转换为字符串
- sResult = '' + num;
- }
- //返回格式化后的字符串
- return sResult;
- }
- function fnFormatDate(){
- //2.2 组合时间数据为字符串。本实例主要针对初学者,所以这里用的是最简单的格式化方式,即把所有数据用+号相连
- return nYear + '-' + fnToDouble(nMonth) + '-' + fnToDouble(nDate) +
- ' ' + fnToDouble(nHours) + ':' + fnToDouble(nMinutes) + ':' + fnToDouble(nSeconds);
- }
- //3.1 获取clock元素
- var eClock = document.getElementById('clock');
- //获取时间
- fnGetDate();
- //3.2 修改clock元素中的时间
- eClock.innerHTML = fnFormatDate();
- //使用定时器实时更新时间
- setInterval(function(){
- //3.3 每秒更新时间
- fnGetDate();
- //3.3 修改clock元素中的时间
- eClock.innerHTML = fnFormatDate();
- },1000);
- }
- fnCreatClock();
此时的效果如图所示:
现在做出来的时钟看起来感觉有点简陋,也可以尝试把数字换成图片,这样所呈现效果就会好很多。这里暂时忽略日期部分,只为时间部分添加图片效果,还是先看一下需要哪些html元素,代码如下:
- <div id="imgClock" class="clock_container"><!--图片时钟元素-->
- <div id="imgHours" class="img_box">
- <span class="img_0"></span>
- <span class="img_0"></span>
- </div>
- <div class="img_point"></div>
- <div id="imgMinutes" class="img_box">
- <span class="img_0"></span>
- <span class="img_0"></span>
- </div>
- <div class="img_point"></div>
- <div id="imgSeconds" class="img_box">
- <span class="img_0"></span>
- <span class="img_0"></span>
- </div>
- </div>
还需要准备0-9共10张图片,可以自己制作类似效果的数字图片。css代码可以自己根据需要编写,也可以复制以下代码使用:
- .clock_container{
- margin-top:60px;
- font-size:;
- text-align:center;
- }
- .clock_container div{
- display:inline-block;
- }
- .clock_container .img_box span{
- display:inline-block;
- width:80px;
- height:100px;
- margin:0 2px;
- border-radius:8px;
- background-color:#77a6b6;
- }
- .clock_container .img_0{
- background:url(img/img_0.png) no-repeat;
- }
- .clock_container .img_1{
- background:url(img/img_1.png) no-repeat;
- }
- .clock_container .img_2{
- background:url(img/img_2.png) no-repeat;
- }
- .clock_container .img_3{
- background:url(img/img_3.png) no-repeat;
- }
- .clock_container .img_4{
- background:url(img/img_4.png) no-repeat;
- }
- .clock_container .img_5{
- background:url(img/img_5.png) no-repeat;
- }
- .clock_container .img_6{
- background:url(img/img_6.png) no-repeat;
- }
- .clock_container .img_7{
- background:url(img/img_7.png) no-repeat;
- }
- .clock_container .img_8{
- background:url(img/img_8.png) no-repeat;
- }
- .clock_container .img_9{
- background:url(img/img_9.png) no-repeat;
- }
- .clock_container .img_point{
- width:60px;
- height:100px;
- background:url(img/img_point.png) no-repeat center;
- }
按照惯例,完成功能前先整理步骤。这里再多添加一个步骤,在imgClock元素中来完成图片美化后的时钟效果,步骤如下:
4. 在imgClock元素中,用图片作为背景实时修改时间
4.1 分别获取时(imgHours)、分(imgMinutes)、秒(imgSeconds)元素
4.2 根据时间修改时、分、秒元素的class,用来改变背景样式
4.3 使用定时器更新元素背景
修改后的代码如下:
- function fnCreatClock(){
- //声明时间相关变量
- var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;
- //1 获取计算机本地时间
- function fnGetDate(){
- //1.1 调用date对象
- dLocal = new Date();
- //1.2 获取当前年份
- nYear = dLocal.getFullYear();
- //1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
- nMonth = dLocal.getMonth() + 1;
- //1.4 获取当前日期
- nDate = dLocal.getDate();
- //1.5 获取当前小时
- nHours = dLocal.getHours();
- //1.6 获取分钟
- nMinutes = dLocal.getMinutes();
- //1.7 获取秒数
- nSeconds = dLocal.getSeconds();
- }
- //2.1 封装一个函数,用于把单数字前添加字符串0,例如1改为01
- function fnToDouble(num){
- //声明一个返回结果
- var sResult = '';
- if(num<10){
- //判断数字小于10则是单数字,需要在前面添加字符串0
- sResult = '0' + num;
- }else{
- //数字为10以上转换为字符串
- sResult = '' + num;
- }
- //返回格式化后的字符串
- return sResult;
- }
- //获取时间
- fnGetDate();
- //4.1 获取图片背景的小时元素
- var eImgHours = document.getElementById('imgHours');
- //获取小时的第一个元素
- var eHours1 = eImgHours.getElementsByTagName('span')[0];
- //获取小时的第二个元素
- var eHours2 = eImgHours.getElementsByTagName('span')[1];
- //4.1 获取图片背景的分钟元素
- var eImgMinutes = document.getElementById('imgMinutes');
- //获取分钟的第一个元素
- var eMinutes1 = eImgMinutes.getElementsByTagName('span')[0];
- //获取分钟的第二个元素
- var eMinutes2 = eImgMinutes.getElementsByTagName('span')[1];
- //4.1 获取图片背景的秒元素
- var eImgSeconds = document.getElementById('imgSeconds');
- //获取秒的第一个元素
- var eSeconds1 = eImgSeconds.getElementsByTagName('span')[0];
- //获取秒的第二个元素
- var eSeconds2 = eImgSeconds.getElementsByTagName('span')[1];
- // 4.2 根据时间修改时、分、秒元素的class,用来改变背景样式
- function fnChangeImgBg(){
- eHours1.className = 'img_' + fnGetImgNum(nHours,0);
- eHours2.className = 'img_' + fnGetImgNum(nHours,1);
- eMinutes1.className = 'img_' + fnGetImgNum(nMinutes,0);
- eMinutes2.className = 'img_' + fnGetImgNum(nMinutes,1);
- eSeconds1.className = 'img_' + fnGetImgNum(nSeconds,0);
- eSeconds2.className = 'img_' + fnGetImgNum(nSeconds,1);
- }
- //此函数用来计算根据当前时间的数字
- function fnGetImgNum(num,bit){
- //声明一个返回结果
- var nResult = 0;
- //判断是个位还是十位,0代表十位,1代表个位
- if(bit===0){
- //使用Math.floor可以向下取整,即不管是0.1还是0.9,都是取整数0。此方法用来获取时间的十位
- nResult = Math.floor(num/10);
- }else{
- //通过fnToDouble函数把时间格式化双字符串,再取后面一个字符获取个位,前面的+号用于转换为数字
- nResult = +fnToDouble(num).slice(1);
- }
- return nResult;
- }
- fnChangeImgBg();
- //使用定时器实时更新时间
- setInterval(function(){
- //3.3 每秒更新时间
- fnGetDate();
- fnChangeImgBg(); //4.3 使用定时器更新元素背景
- },1000);
- }
- fnCreatClock();
此时的效果比单独的文字还是会增色不少,如图所示:
我想要求效果再漂亮一点,让图片不是很突兀的改变,而是有一个滚动的动画。要实现这样的效果,图片需要改成一张0-9的竖形排列图,每个数字的高度要和时钟元素高度一致。再通过修改元素背景图片的位置,即可产生滚动的动画效果。
此效果需要的html元素如下所示:
- <div id="animationClock" class="clock_container"><!--动画时钟元素-->
- <div id="animationHours" class="animation_box">
- <span></span>
- <span></span>
- </div>
- <div class="img_point"></div>
- <div id="animationMinutes" class="animation_box">
- <span></span>
- <span></span>
- </div>
- <div class="img_point"></div>
- <div id="animationSeconds" class="animation_box">
- <span></span>
- <span></span>
- </div>
- </div>
在css里面给每一个元素加上同一个背景图片,需要加上transition过渡样式用来产生动画效果,如下所示:
- .clock_container .animation_box span{
- display:inline-block;
- width:80px;
- height:100px;
- margin:0 2px;
- border-radius:8px;
- background-color:#77a6b6;
- background-image:url(img/img_all.png);
- background-repeat:no-repeat;
- transition:.2s;
- }
再随着时间改变给每一个时间元素修改背景图片的位置,即修改background-repeat-y的样式即可。按照惯例,还是先列步骤:
5. 在animationClock元素中,滚动动画显示时钟的实时变化
5.1 分别获取时(imgHours)、分(imgMinutes)、秒(imgSeconds)元素
5.2 根据时间修改时、分、秒元素的背景图片位置
5.3 使用定时器更新元素背景图片位置
修改后的代码如下:
- function fnCreatClock(){
- //声明时间相关变量
- var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;
- //1 获取计算机本地时间
- function fnGetDate(){
- //1.1 调用date对象
- dLocal = new Date();
- //1.2 获取当前年份
- nYear = dLocal.getFullYear();
- //1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
- nMonth = dLocal.getMonth() + 1;
- //1.4 获取当前日期
- nDate = dLocal.getDate();
- //1.5 获取当前小时
- nHours = dLocal.getHours();
- //1.6 获取分钟
- nMinutes = dLocal.getMinutes();
- //1.7 获取秒数
- nSeconds = dLocal.getSeconds();
- }
- //2.1 封装一个函数,用于把单数字前添加字符串0,例如1改为01
- function fnToDouble(num){
- //声明一个返回结果
- var sResult = '';
- if(num<10){
- //判断数字小于10则是单数字,需要在前面添加字符串0
- sResult = '0' + num;
- }else{
- //数字为10以上转换为字符串
- sResult = '' + num;
- }
- //返回格式化后的字符串
- return sResult;
- }
- //获取时间
- fnGetDate();
- //此函数用来计算根据当前时间的数字
- function fnGetImgNum(num,bit){
- //声明一个返回结果
- var nResult = 0;
- //判断是个位还是十位,0代表十位,1代表个位
- if(bit===0){
- //使用Math.floor可以向下取整,即不管是0.1还是0.9,都是取整数0。此方法用来获取时间的十位
- nResult = Math.floor(num/10);
- }else{
- //通过fnToDouble函数把时间格式化双字符串,再取后面一个字符获取个位,前面的+号用于转换为数字
- nResult = +fnToDouble(num).slice(1);
- }
- return nResult;
- }
- //5.1 获取动画时钟的小时元素
- var eAnimationHours = document.getElementById('animationHours');
- //获取小时的第一个元素
- var eHours3 = eAnimationHours.getElementsByTagName('span')[0];
- //获取小时的第二个元素
- var eHours4 = eAnimationHours.getElementsByTagName('span')[1];
- //5.1 获取动画时钟的分钟元素
- var eAnimationMinutes = document.getElementById('animationMinutes');
- //获取分钟的第一个元素
- var eMinutes3 = eAnimationMinutes.getElementsByTagName('span')[0];
- //获取分钟的第二个元素
- var eMinutes4 = eAnimationMinutes.getElementsByTagName('span')[1];
- //5.1 获取动画时钟的秒元素
- var eAnimationSeconds = document.getElementById('animationSeconds');
- //获取秒的第一个元素
- var eSeconds3 = eAnimationSeconds.getElementsByTagName('span')[0];
- //获取秒的第二个元素
- var eSeconds4 = eAnimationSeconds.getElementsByTagName('span')[1];
- // 5.2 根据时间修改时、分、秒元素的背景图片位置
- function fnAnimationBg(){
- eHours3.style.backgroundPositionY = -fnGetImgNum(nHours,0) * 100 + 'px';
- eHours4.style.backgroundPositionY = -fnGetImgNum(nHours,1) * 100 + 'px';
- eMinutes3.style.backgroundPositionY = -fnGetImgNum(nMinutes,0) * 100 + 'px';
- eMinutes4.style.backgroundPositionY = -fnGetImgNum(nMinutes,1) * 100 + 'px';
- eSeconds3.style.backgroundPositionY = -fnGetImgNum(nSeconds,0) * 100 + 'px';
- eSeconds4.style.backgroundPositionY = -fnGetImgNum(nSeconds,1) * 100 + 'px';
- }
- fnAnimationBg();
- //使用定时器实时更新时间
- setInterval(function(){
- //3.3 每秒更新时间
- fnGetDate();
- //5.3 使用定时器更新元素背景图片位置
- fnAnimationBg();
- },1000);
- }
- fnCreatClock();
纯js时钟特效详细代码分析实例教程的更多相关文章
- js 时钟特效
时钟特效 CreateTime--2018年2月24日15:11:23 Author:Marydon 实现方式:都是基于HTML5的canvas标签实现的 款式一 借助jQuery插件实现 < ...
- cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(6)
今天我们要讲三个类,这三个类应该算比較简单的 HelpLayer类 NumberLayer类 GetLocalScore类 HelpLayer类,主要放了两个图形精灵上去,一个是游戏的名字,一个是提示 ...
- JS日期级联组件代码分析及demo
最近研究下JS日期级联效果 感觉还不错,然后看了下kissy也正好有这么一个组件,也看了下源码,写的还不错,通过google最早是在2011年 淘宝的虎牙(花名)用原审JS写了一个(貌似据说是从YUI ...
- cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(7)
今天我们介绍最后两个类 GameOverLayer类 GameLayer类 GameLayer类是整个游戏中最重要的类,由于是整个游戏的中央系统,控制着各个类(层)之间的交互,这个类中实现了猪脚小鸟和 ...
- js获取IP地址多种方法实例教程
js获取IP地址方法总结 js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338. ...
- 纯js分页代码(简洁实用)
纯js写的分页代码. 复制代码代码如下: //每页显示字数 PageSize=5000; //分页模式 flag=2;//1:根据字数自动分页 2:根据[NextPage]分页 //默认页 start ...
- 虚拟机创建流程中neutron代码分析(三)
前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...
- Three.js粒子特效,shader渲染初探(一篇非常详细的介绍)
Three.js粒子特效,shader渲染初探 转载来源:https://juejin.im/post/5b0ace63f265da0db479270a 这大概是个序 关于Three.js,网上有不多 ...
- 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)
微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...
随机推荐
- Jocke的IOT之路--raspberrypi更换国内镜像
一.编辑sources.list文件 sudo nano /etc/apt/sources.list 使用#将文件内容全部注释调,更改位 deb http://mirrors.tuna.tsinghu ...
- Spark在Windows环境下的配置
1.下载 下载地址:http://spark.apache.org/downloads.html. 选择下面版本下载. 2.操作流程:https://blog.csdn.net/nxw_tsp/art ...
- 原 c++中map与unordered_map的区别
c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...
- 关于利用python进行验证码识别的一些想法
转载:@小五义http://www.cnblogs.com/xiaowuyi 用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章.我大体看了一下,主要方法有几类: ...
- 《闲扯Redis三》Redis五种数据类型之List型
一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...
- 【Ubuntu】常用命令汇总,整理ing
Ubuntu 常用命令(在此页面中Ctrl+F即可快速查找) 在Ubuntu系统使用过程中,会不断地接触到命令行操作,下面对一些常用的命令进行汇总,方便查找. 1.文件操作 1.1 文件复制拷贝 cp ...
- while与until
一.格式: while 条件测试 :do 循环体 done 二.条件测试 条件测试是指满足条件则会一直执行下去. 比如: let i =0 while i < 100;do echo $i i ...
- 解决Python pip安装第三方包慢的问题
解决Python pip安装第三方包慢的问题 主要是修改源,国内的源有几个 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi ...
- HBase 监控 | HBase Metrics 初探(一)
前言:对于任意一个系统而言,做好监控都是非常重要的,HBase也不例外.经常,我们会从JMX中获取相关指标来做展示.对HBase进行监控,那这些指标是怎么生成的呢?如果你想自定义自己的监控指标又该怎么 ...
- 【故障公告】部署在 k8s 上的博客后台昨天与今天在访问高峰多次出现 502
非常抱歉,从昨天上午开始,部署在 k8s 集群上的博客后台(基于 .NET Core 3.1 + Angular 8.2 实现)出现奇怪问题,一到访问高峰就多次出现 502 ,有时能自动恢复,有时需要 ...