电子时钟是网上常见的功能,在学习date对象和定时器功能时,来完成一个电子时钟的制作是不错的选择。学习本教程之前,读者需要具备html和css技能,同时需要有简单的javascript基础。

先准备一个html元素,用来放置时钟。新建一个div元素,它的id命名为clock,如下所示:

  1. <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 使用定时器实时更新时间

具体代码如下:

  1. function fnCreatClock(){
  2. //声明时间相关变量
  3. var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;
  4.  
  5. //1 获取计算机本地时间
  6. function fnGetDate(){
  7. //1.1 调用date对象
  8. dLocal = new Date();
  9. //1.2 获取当前年份
  10. nYear = dLocal.getFullYear();
  11. //1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
  12. nMonth = dLocal.getMonth() + 1;
  13. //1.4 获取当前日期
  14. nDate = dLocal.getDate();
  15. //1.5 获取当前小时
  16. nHours = dLocal.getHours();
  17. //1.6 获取分钟
  18. nMinutes = dLocal.getMinutes();
  19. //1.7 获取秒数
  20. nSeconds = dLocal.getSeconds();
  21. }
  22.  
  23. //2.1 封装一个函数,用于把单数字前添加字符串0,例如1改为01
  24. function fnToDouble(num){
  25. //声明一个返回结果
  26. var sResult = '';
  27. if(num<10){
  28. //判断数字小于10则是单数字,需要在前面添加字符串0
  29. sResult = '0' + num;
  30. }else{
  31. //数字为10以上转换为字符串
  32. sResult = '' + num;
  33. }
  34. //返回格式化后的字符串
  35. return sResult;
  36. }
  37.  
  38. function fnFormatDate(){
  39. //2.2 组合时间数据为字符串。本实例主要针对初学者,所以这里用的是最简单的格式化方式,即把所有数据用+号相连
  40. return nYear + '-' + fnToDouble(nMonth) + '-' + fnToDouble(nDate) +
  41. ' ' + fnToDouble(nHours) + ':' + fnToDouble(nMinutes) + ':' + fnToDouble(nSeconds);
  42. }
  43.  
  44. //3.1 获取clock元素
  45. var eClock = document.getElementById('clock');
  46. //获取时间
  47. fnGetDate();
  48. //3.2 修改clock元素中的时间
  49. eClock.innerHTML = fnFormatDate();
  50.  
  51. //使用定时器实时更新时间
  52. setInterval(function(){
  53. //3.3 每秒更新时间
  54. fnGetDate();
  55. //3.3 修改clock元素中的时间
  56. eClock.innerHTML = fnFormatDate();
  57. },1000);
  58. }
  59. fnCreatClock();

此时的效果如图所示:

现在做出来的时钟看起来感觉有点简陋,也可以尝试把数字换成图片,这样所呈现效果就会好很多。这里暂时忽略日期部分,只为时间部分添加图片效果,还是先看一下需要哪些html元素,代码如下:

  1. <div id="imgClock" class="clock_container"><!--图片时钟元素-->
  2. <div id="imgHours" class="img_box">
  3. <span class="img_0"></span>
  4. <span class="img_0"></span>
  5. </div>
  6. <div class="img_point"></div>
  7. <div id="imgMinutes" class="img_box">
  8. <span class="img_0"></span>
  9. <span class="img_0"></span>
  10. </div>
  11. <div class="img_point"></div>
  12. <div id="imgSeconds" class="img_box">
  13. <span class="img_0"></span>
  14. <span class="img_0"></span>
  15. </div>
  16. </div>

还需要准备0-9共10张图片,可以自己制作类似效果的数字图片。css代码可以自己根据需要编写,也可以复制以下代码使用:

  1. .clock_container{
  2. margin-top:60px;
  3. font-size:;
  4. text-align:center;
  5. }
  6. .clock_container div{
  7. display:inline-block;
  8. }
  9. .clock_container .img_box span{
  10. display:inline-block;
  11. width:80px;
  12. height:100px;
  13. margin:0 2px;
  14. border-radius:8px;
  15. background-color:#77a6b6;
  16. }
  17. .clock_container .img_0{
  18. background:url(img/img_0.png) no-repeat;
  19. }
  20. .clock_container .img_1{
  21. background:url(img/img_1.png) no-repeat;
  22. }
  23. .clock_container .img_2{
  24. background:url(img/img_2.png) no-repeat;
  25. }
  26. .clock_container .img_3{
  27. background:url(img/img_3.png) no-repeat;
  28. }
  29. .clock_container .img_4{
  30. background:url(img/img_4.png) no-repeat;
  31. }
  32. .clock_container .img_5{
  33. background:url(img/img_5.png) no-repeat;
  34. }
  35. .clock_container .img_6{
  36. background:url(img/img_6.png) no-repeat;
  37. }
  38. .clock_container .img_7{
  39. background:url(img/img_7.png) no-repeat;
  40. }
  41. .clock_container .img_8{
  42. background:url(img/img_8.png) no-repeat;
  43. }
  44. .clock_container .img_9{
  45. background:url(img/img_9.png) no-repeat;
  46. }
  47. .clock_container .img_point{
  48. width:60px;
  49. height:100px;
  50. background:url(img/img_point.png) no-repeat center;
  51. }

按照惯例,完成功能前先整理步骤。这里再多添加一个步骤,在imgClock元素中来完成图片美化后的时钟效果,步骤如下:

4. 在imgClock元素中,用图片作为背景实时修改时间
  4.1 分别获取时(imgHours)、分(imgMinutes)、秒(imgSeconds)元素
  4.2 根据时间修改时、分、秒元素的class,用来改变背景样式
  4.3 使用定时器更新元素背景

修改后的代码如下:

  1. function fnCreatClock(){
  2. //声明时间相关变量
  3. var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;
  4.  
  5. //1 获取计算机本地时间
  6. function fnGetDate(){
  7. //1.1 调用date对象
  8. dLocal = new Date();
  9. //1.2 获取当前年份
  10. nYear = dLocal.getFullYear();
  11. //1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
  12. nMonth = dLocal.getMonth() + 1;
  13. //1.4 获取当前日期
  14. nDate = dLocal.getDate();
  15. //1.5 获取当前小时
  16. nHours = dLocal.getHours();
  17. //1.6 获取分钟
  18. nMinutes = dLocal.getMinutes();
  19. //1.7 获取秒数
  20. nSeconds = dLocal.getSeconds();
  21. }
  22.  
  23. //2.1 封装一个函数,用于把单数字前添加字符串0,例如1改为01
  24. function fnToDouble(num){
  25. //声明一个返回结果
  26. var sResult = '';
  27. if(num<10){
  28. //判断数字小于10则是单数字,需要在前面添加字符串0
  29. sResult = '0' + num;
  30. }else{
  31. //数字为10以上转换为字符串
  32. sResult = '' + num;
  33. }
  34. //返回格式化后的字符串
  35. return sResult;
  36. }
  37.  
  38. //获取时间
  39. fnGetDate();
  40.  
  41. //4.1 获取图片背景的小时元素
  42. var eImgHours = document.getElementById('imgHours');
  43. //获取小时的第一个元素
  44. var eHours1 = eImgHours.getElementsByTagName('span')[0];
  45. //获取小时的第二个元素
  46. var eHours2 = eImgHours.getElementsByTagName('span')[1];
  47. //4.1 获取图片背景的分钟元素
  48. var eImgMinutes = document.getElementById('imgMinutes');
  49. //获取分钟的第一个元素
  50. var eMinutes1 = eImgMinutes.getElementsByTagName('span')[0];
  51. //获取分钟的第二个元素
  52. var eMinutes2 = eImgMinutes.getElementsByTagName('span')[1];
  53. //4.1 获取图片背景的秒元素
  54. var eImgSeconds = document.getElementById('imgSeconds');
  55. //获取秒的第一个元素
  56. var eSeconds1 = eImgSeconds.getElementsByTagName('span')[0];
  57. //获取秒的第二个元素
  58. var eSeconds2 = eImgSeconds.getElementsByTagName('span')[1];
  59.  
  60. // 4.2 根据时间修改时、分、秒元素的class,用来改变背景样式
  61. function fnChangeImgBg(){
  62. eHours1.className = 'img_' + fnGetImgNum(nHours,0);
  63. eHours2.className = 'img_' + fnGetImgNum(nHours,1);
  64. eMinutes1.className = 'img_' + fnGetImgNum(nMinutes,0);
  65. eMinutes2.className = 'img_' + fnGetImgNum(nMinutes,1);
  66. eSeconds1.className = 'img_' + fnGetImgNum(nSeconds,0);
  67. eSeconds2.className = 'img_' + fnGetImgNum(nSeconds,1);
  68. }
  69.  
  70. //此函数用来计算根据当前时间的数字
  71. function fnGetImgNum(num,bit){
  72. //声明一个返回结果
  73. var nResult = 0;
  74. //判断是个位还是十位,0代表十位,1代表个位
  75. if(bit===0){
  76. //使用Math.floor可以向下取整,即不管是0.1还是0.9,都是取整数0。此方法用来获取时间的十位
  77. nResult = Math.floor(num/10);
  78. }else{
  79. //通过fnToDouble函数把时间格式化双字符串,再取后面一个字符获取个位,前面的+号用于转换为数字
  80. nResult = +fnToDouble(num).slice(1);
  81. }
  82. return nResult;
  83. }
  84. fnChangeImgBg();
  85.  
  86. //使用定时器实时更新时间
  87. setInterval(function(){
  88. //3.3 每秒更新时间
  89. fnGetDate();
  90. fnChangeImgBg(); //4.3 使用定时器更新元素背景
  91. },1000);
  92. }
  93. fnCreatClock();

此时的效果比单独的文字还是会增色不少,如图所示:

我想要求效果再漂亮一点,让图片不是很突兀的改变,而是有一个滚动的动画。要实现这样的效果,图片需要改成一张0-9的竖形排列图,每个数字的高度要和时钟元素高度一致。再通过修改元素背景图片的位置,即可产生滚动的动画效果。

此效果需要的html元素如下所示:

  1. <div id="animationClock" class="clock_container"><!--动画时钟元素-->
  2. <div id="animationHours" class="animation_box">
  3. <span></span>
  4. <span></span>
  5. </div>
  6. <div class="img_point"></div>
  7. <div id="animationMinutes" class="animation_box">
  8. <span></span>
  9. <span></span>
  10. </div>
  11. <div class="img_point"></div>
  12. <div id="animationSeconds" class="animation_box">
  13. <span></span>
  14. <span></span>
  15. </div>
  16. </div>

在css里面给每一个元素加上同一个背景图片,需要加上transition过渡样式用来产生动画效果,如下所示:

  1. .clock_container .animation_box span{
  2. display:inline-block;
  3. width:80px;
  4. height:100px;
  5. margin:0 2px;
  6. border-radius:8px;
  7. background-color:#77a6b6;
  8. background-image:url(img/img_all.png);
  9. background-repeat:no-repeat;
  10. transition:.2s;
  11. }

再随着时间改变给每一个时间元素修改背景图片的位置,即修改background-repeat-y的样式即可。按照惯例,还是先列步骤:

5. 在animationClock元素中,滚动动画显示时钟的实时变化
  5.1 分别获取时(imgHours)、分(imgMinutes)、秒(imgSeconds)元素
  5.2 根据时间修改时、分、秒元素的背景图片位置
  5.3 使用定时器更新元素背景图片位置

修改后的代码如下:

  1. function fnCreatClock(){
  2. //声明时间相关变量
  3. var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;
  4.  
  5. //1 获取计算机本地时间
  6. function fnGetDate(){
  7. //1.1 调用date对象
  8. dLocal = new Date();
  9. //1.2 获取当前年份
  10. nYear = dLocal.getFullYear();
  11. //1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
  12. nMonth = dLocal.getMonth() + 1;
  13. //1.4 获取当前日期
  14. nDate = dLocal.getDate();
  15. //1.5 获取当前小时
  16. nHours = dLocal.getHours();
  17. //1.6 获取分钟
  18. nMinutes = dLocal.getMinutes();
  19. //1.7 获取秒数
  20. nSeconds = dLocal.getSeconds();
  21. }
  22.  
  23. //2.1 封装一个函数,用于把单数字前添加字符串0,例如1改为01
  24. function fnToDouble(num){
  25. //声明一个返回结果
  26. var sResult = '';
  27. if(num<10){
  28. //判断数字小于10则是单数字,需要在前面添加字符串0
  29. sResult = '0' + num;
  30. }else{
  31. //数字为10以上转换为字符串
  32. sResult = '' + num;
  33. }
  34. //返回格式化后的字符串
  35. return sResult;
  36. }
  37.  
  38. //获取时间
  39. fnGetDate();
  40.  
  41. //此函数用来计算根据当前时间的数字
  42. function fnGetImgNum(num,bit){
  43. //声明一个返回结果
  44. var nResult = 0;
  45. //判断是个位还是十位,0代表十位,1代表个位
  46. if(bit===0){
  47. //使用Math.floor可以向下取整,即不管是0.1还是0.9,都是取整数0。此方法用来获取时间的十位
  48. nResult = Math.floor(num/10);
  49. }else{
  50. //通过fnToDouble函数把时间格式化双字符串,再取后面一个字符获取个位,前面的+号用于转换为数字
  51. nResult = +fnToDouble(num).slice(1);
  52. }
  53. return nResult;
  54. }
  55.  
  56. //5.1 获取动画时钟的小时元素
  57. var eAnimationHours = document.getElementById('animationHours');
  58. //获取小时的第一个元素
  59. var eHours3 = eAnimationHours.getElementsByTagName('span')[0];
  60. //获取小时的第二个元素
  61. var eHours4 = eAnimationHours.getElementsByTagName('span')[1];
  62. //5.1 获取动画时钟的分钟元素
  63. var eAnimationMinutes = document.getElementById('animationMinutes');
  64. //获取分钟的第一个元素
  65. var eMinutes3 = eAnimationMinutes.getElementsByTagName('span')[0];
  66. //获取分钟的第二个元素
  67. var eMinutes4 = eAnimationMinutes.getElementsByTagName('span')[1];
  68. //5.1 获取动画时钟的秒元素
  69. var eAnimationSeconds = document.getElementById('animationSeconds');
  70. //获取秒的第一个元素
  71. var eSeconds3 = eAnimationSeconds.getElementsByTagName('span')[0];
  72. //获取秒的第二个元素
  73. var eSeconds4 = eAnimationSeconds.getElementsByTagName('span')[1];
  74.  
  75. // 5.2 根据时间修改时、分、秒元素的背景图片位置
  76. function fnAnimationBg(){
  77. eHours3.style.backgroundPositionY = -fnGetImgNum(nHours,0) * 100 + 'px';
  78. eHours4.style.backgroundPositionY = -fnGetImgNum(nHours,1) * 100 + 'px';
  79. eMinutes3.style.backgroundPositionY = -fnGetImgNum(nMinutes,0) * 100 + 'px';
  80. eMinutes4.style.backgroundPositionY = -fnGetImgNum(nMinutes,1) * 100 + 'px';
  81. eSeconds3.style.backgroundPositionY = -fnGetImgNum(nSeconds,0) * 100 + 'px';
  82. eSeconds4.style.backgroundPositionY = -fnGetImgNum(nSeconds,1) * 100 + 'px';
  83. }
  84. fnAnimationBg();
  85.  
  86. //使用定时器实时更新时间
  87. setInterval(function(){
  88. //3.3 每秒更新时间
  89. fnGetDate();
  90. //5.3 使用定时器更新元素背景图片位置
  91. fnAnimationBg();
  92. },1000);
  93. }
  94. fnCreatClock();

纯js时钟特效详细代码分析实例教程的更多相关文章

  1. js 时钟特效

      时钟特效 CreateTime--2018年2月24日15:11:23 Author:Marydon 实现方式:都是基于HTML5的canvas标签实现的 款式一 借助jQuery插件实现 < ...

  2. cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(6)

    今天我们要讲三个类,这三个类应该算比較简单的 HelpLayer类 NumberLayer类 GetLocalScore类 HelpLayer类,主要放了两个图形精灵上去,一个是游戏的名字,一个是提示 ...

  3. JS日期级联组件代码分析及demo

    最近研究下JS日期级联效果 感觉还不错,然后看了下kissy也正好有这么一个组件,也看了下源码,写的还不错,通过google最早是在2011年 淘宝的虎牙(花名)用原审JS写了一个(貌似据说是从YUI ...

  4. cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(7)

    今天我们介绍最后两个类 GameOverLayer类 GameLayer类 GameLayer类是整个游戏中最重要的类,由于是整个游戏的中央系统,控制着各个类(层)之间的交互,这个类中实现了猪脚小鸟和 ...

  5. js获取IP地址多种方法实例教程

    js获取IP地址方法总结   js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338. ...

  6. 纯js分页代码(简洁实用)

    纯js写的分页代码. 复制代码代码如下: //每页显示字数 PageSize=5000; //分页模式 flag=2;//1:根据字数自动分页 2:根据[NextPage]分页 //默认页 start ...

  7. 虚拟机创建流程中neutron代码分析(三)

    前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...

  8. Three.js粒子特效,shader渲染初探(一篇非常详细的介绍)

    Three.js粒子特效,shader渲染初探 转载来源:https://juejin.im/post/5b0ace63f265da0db479270a 这大概是个序 关于Three.js,网上有不多 ...

  9. 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)

    微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...

随机推荐

  1. Jocke的IOT之路--raspberrypi更换国内镜像

    一.编辑sources.list文件 sudo nano /etc/apt/sources.list 使用#将文件内容全部注释调,更改位 deb http://mirrors.tuna.tsinghu ...

  2. Spark在Windows环境下的配置

    1.下载 下载地址:http://spark.apache.org/downloads.html. 选择下面版本下载. 2.操作流程:https://blog.csdn.net/nxw_tsp/art ...

  3. 原 c++中map与unordered_map的区别

    c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...

  4. 关于利用python进行验证码识别的一些想法

    转载:@小五义http://www.cnblogs.com/xiaowuyi 用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章.我大体看了一下,主要方法有几类: ...

  5. 《闲扯Redis三》Redis五种数据类型之List型

    一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...

  6. 【Ubuntu】常用命令汇总,整理ing

    Ubuntu 常用命令(在此页面中Ctrl+F即可快速查找) 在Ubuntu系统使用过程中,会不断地接触到命令行操作,下面对一些常用的命令进行汇总,方便查找. 1.文件操作 1.1 文件复制拷贝 cp ...

  7. while与until

    一.格式: while  条件测试 :do 循环体 done 二.条件测试 条件测试是指满足条件则会一直执行下去. 比如: let i =0 while i < 100;do echo $i i ...

  8. 解决Python pip安装第三方包慢的问题

    解决Python pip安装第三方包慢的问题 主要是修改源,国内的源有几个 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi ...

  9. HBase 监控 | HBase Metrics 初探(一)

    前言:对于任意一个系统而言,做好监控都是非常重要的,HBase也不例外.经常,我们会从JMX中获取相关指标来做展示.对HBase进行监控,那这些指标是怎么生成的呢?如果你想自定义自己的监控指标又该怎么 ...

  10. 【故障公告】部署在 k8s 上的博客后台昨天与今天在访问高峰多次出现 502

    非常抱歉,从昨天上午开始,部署在 k8s 集群上的博客后台(基于 .NET Core 3.1 + Angular 8.2 实现)出现奇怪问题,一到访问高峰就多次出现 502 ,有时能自动恢复,有时需要 ...