经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
js实现电子时钟功能
来源:jb51  时间:2022/6/20 8:40:44  对本文有异议

电子时钟是网上常见的功能,在学习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:0;
  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();

本实例中,动画在数字变为0时的幅度会有点大,读者有空的话可以想想换种思路来实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号