我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么用HTML5制作数字时钟

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么用HTML5制作数字时钟

这篇文章主要介绍“怎么用HTML5制作数字时钟”,在日常操作中,相信很多人在怎么用HTML5制作数字时钟问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用HTML5制作数字时钟”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

怎么用HTML5制作数字时钟

就是这个数字时钟,当时觉得这个创意不错,但是也没去折腾。直到昨天同事又在网上看到这个案例,他觉得很酷炫,就跑过来问我,这个是怎么实现的,然后我大概想了一下实现方法后也来了点兴趣,就花了一点时间模仿做出来了一个。不同的是,岑安用的是div来做的。而我就是用canvas来实现的。用canvas来做性能方面会更好,因为就单单操控每个点的运动,用js控制dom的style属性跟用js控制canvas绘图相比性能方面肯定是有所欠缺的。

  先上个我做的DEMO吧,然后再简述一下做这个的方法:   看DEMO请戳我 。

  做这个思路很简单,就是通过字符串保存各个数字的位置: 

XML/HTML Code复制内容到剪贴板

  1. var numData = [   

  2.             "1111/1001/1001/1001/1001/1001/1111", //0   

  3.             "0001/0001/0001/0001/0001/0001/0001", //1   

  4.             "1111/0001/0001/1111/1000/1000/1111", //2   

  5.             "1111/0001/0001/1111/0001/0001/1111", //3   

  6.             "1010/1010/1010/1111/0010/0010/0010", //4   

  7.             "1111/1000/1000/1111/0001/0001/1111", //5   

  8.             "1111/1000/1000/1111/1001/1001/1111", //6   

  9.             "1111/0001/0001/0001/0001/0001/0001", //7   

  10.             "1111/1001/1001/1111/1001/1001/1111", //8   

  11.             "1111/1001/1001/1111/0001/0001/1111", //9   

  12.             "0000/0000/0010/0000/0010/0000/0000", //:   

  13.         ]  

  0代表没像素,1代表有像素,/是为了更好看些,就是分行嘛,简单说起来:比如0就是:

XML/HTML Code复制内容到剪贴板

  1.         1  1  1  1   

  2.   

  3.   1  0  0  1   

  4.   

  5.   1  0  0  1   

  6.   

  7.   1  0  0  1   

  8.   

  9.   1  0  0  1   

  10.   

  11.   1  0  0  1   

  12.   

  13.   1  1  1  1     

这样就很清楚了吧。从0到9还有一个:号都用字符串表示好。

  然后就写个粒子对象,也就是像素点:

XML/HTML Code复制内容到剪贴板

  1. var P_radius = 8,Gravity = 9.8;   

  2.         var Particle = function(){   

  3.             this.x = 0;   

  4.             this.y = 0;   

  5.             this.vx = 0;   

  6.             this.vy = 0;   

  7.             this.color = "";   

  8.             this.visible = false;   

  9.             this.drop = false;   

  10.         }   

  11.         Particle.prototype = {   

  12.             constructors:Particle,   

  13.             paint:function(){        //绘制自身   

  14.                 ctx.fillStyle = this.color;   

  15.                 ctx.beginPath();   

  16.                 ctx.arc(this.x,this.y,P_radius,0,2*Math.PI);   

  17.                 ctx.fill();   

  18.             },   

  19.             reset:function(x,y,color){        //重置   

  20.                 this.x = x;   

  21.                 this.y = y;   

  22.                 this.vx = 0;   

  23.                 this.vy = 0;   

  24.                 this.color = color;   

  25.                 this.visible = true;   

  26.                 this.drop = false;   

  27.             },   

  28.             isDrop:function(){        //落下   

  29.                 this.drop = true;   

  30.                 var vx = Math.random()*20+15   

  31.                 this.vx = Math.random()>=0.5?-vx : vx;   

  32.             },   

  33.             update:function(time){        //每一帧的动作   

  34.                 if(this.drop){   

  35.                     this.x += this.vx*time;   

  36.                     this.y += this.vy*time;   

  37.   

  38.                     var vy = this.vy+Gravity*time;   

  39.   

  40.                     if(this.y>=canvas.height-P_radius){   

  41.                         this.y = canvas.height-P_radius   

  42.                         vy = -vy*0.7;   

  43.                     }   

  44.   

  45.                     this.vy = vy;   

  46.   

  47.                     if(this.x<-P_radius||this.x>canvas.width+P_radius||this.y<-P_radius||this.y>canvas.height+P_radius){   

  48.                         this.visible = false;   

  49.                     }   

  50.                 }   

  51.             }   

  52.         }     

  53.   

粒子对象的属性比较简单,就位置,速度,以及是否可视化。方法的话,paint是绘制方法,reset是重置(因为粒子要循环利用的,提升性能),isDrop是粒子落下方法,update就是每一帧更新粒子的动作,update中当粒子运动超出canvas的绘制区域时,就把它的可视化置为false,在粒子容器中保存起来等待下一次调用。

  写好粒子对象后,就要考虑如何让粒子按照位置画上去,同时当粒子不需要用时能够让他做自由落体的动画了。

  先画背景(也就是那没有像素的白点):

XML/HTML Code复制内容到剪贴板

  1. function drawBg(){   

  2.             var tx = (canvas.width-((P_radius*2+X_J)*4*8+7*xjg))/2;   

  3.             for(var i=0;i<8;i++){   

  4.                 var ty = (canvas.height-((P_radius+yjg)*6))/2;   

  5.                 for(var j=0;j<numData[0].length;j++){   

  6.                     var tt = numData[0].charAt(j);   

  7.                     if(tt==="/"){   

  8.                         ty+=yjg;   

  9.                     }else {   

  10.                         var x = tx+j%5*(P_radius*2+X_J),   

  11.                             y = ty;   

  12.                         bgctx.fillStyle = "#FFF";   

  13.                         bgctx.beginPath();   

  14.                         bgctx.arc(x,y,P_radius,0,2*Math.PI);   

  15.                         bgctx.fill();   

  16.                     }   

  17.                 }   

  18.                 tx+=xjg+4*(P_radius*2+X_J);   

  19.             }   

  20.         }   

  先把背景画到一个离屏canvas中缓存起来,接下来每一帧重画的时候就不需要逻辑计算了,直接把那个离屏canvas画上去就行了。上面的逻辑应该不难理解,就是通过两个循环,循环8个数字,然后再对每个数字一个点一个点进行绘制,当遇到“/”时,就说明要换行了,把绘制的ty加个换行间隔,再把tx重置,再进行绘制。就这样,点就可以都画出来了。效果图如下:
怎么用HTML5制作数字时钟

背景画好了,就开始根据每一秒的时间,画数字像素吧。方法主要是这个:

XML/HTML Code复制内容到剪贴板

  1. function setTime(time){   

  2.             var h = time.getHours()+"",   

  3.                 m = time.getMinutes()+"",   

  4.                 s = time.getSeconds()+"";   

  5.             hh = h.length===1?"0"+h:h;   

  6.             mm = m.length===1?"0"+m:m;   

  7.             ss = s.length===1?"0"+s:s;   

  8.   

  9.             var nowdate = h+":"+m+":"+s;   

  10.             var tx = (canvas.width-((P_radius*2+X_J)*4*8+7*xjg))/2,color = "";   

  11.             for(var i=0;i<nowdate.length;i++){   

  12.                 var n = nowdate.charAt(i)===":"?10:parseInt(nowdate.charAt(i)),   

  13.                     text = numData[n];   

  14.   

  15.                 var ty = (canvas.height-((P_radius+yjg)*6))/2;   

  16.   

  17.                 switch(i){   

  18.                     case 0:color = "#4DCB74";break;   

  19.                     case 2:color = "#4062E0";break;   

  20.                     case 3:color = "#D65050";break;   

  21.                     case 5:color = "#4062E0";break;   

  22.                     case 6:color = "#797C17";break;   

  23.                 }   

  24.   

  25.                 for(var j=0;j<text.length;j++){   

  26.                     var tt = text.charAt(j);   

  27.                     if(tt==="/"){   

  28.                         ty+=yjg;   

  29.                     }else{   

  30.                         var x = tx+j%5*(P_radius*2+X_J),   

  31.                             y = ty,   

  32.                             pp = null,   

  33.                             usefullp = null;   

  34.                         particles.forEach(function(p){   

  35.                             if(p.visible&p.x===x&p.y===y){   

  36.                                 ppp = p;   

  37.                             }else if(!p.visible&usefullp===null){   

  38.                                 usefullp = p;   

  39.                             }   

  40.                         });   

  41.                         if(pp!==null&tt==="0"){   

  42.                             pp.isDrop();   

  43.                         }else if(pp===null&tt==="1"){   

  44.                             usefullp.reset(x , y , color);   

  45.                         }   

  46.                     }   

  47.                 }   

  48.                 tx+=xjg+4*(P_radius*2+X_J);   

  49.             }   

  50.         }  

  原理也不难,也是跟上面画背景差不多,遍历所有点,然后根据当前时间的数字转换成的字符串来判断,当前点是否应该有像素,如果有像素就再判断当前这个点是否已经有粒子对象在了,如果已经有粒子对象在了,就直接跳出不处理,如果没有粒子对象在,就再粒子容器中找一个没有被使用的粒子reset到这个位置。还有一种情况,就是当前这个点是不应该有像素的,但是却有粒子,那就获取这个粒子,让这个粒子进行自由落体。

  时间设置也写好了,就可以写舞台更新的代码了:

XML/HTML Code复制内容到剪贴板

  1. var timeCount_0 = 0,timeCount_1 = 0,particles = [];   

  2.         function initAnimate(){   

  3.             for(var i=0;i<200;i++){   

  4.                 var p = new Particle();   

  5.                 particles.push(p);   

  6.             }   

  7.   

  8.             timeCount_0 = new Date();   

  9.             timeCount_1 = new Date();   

  10.             drawBg();   

  11.             setTime(timeCount_0)   

  12.             animate();   

  13.         }   

  14.   

  15.         function animate(){   

  16.             ctx.clearRect(0,0,canvas.width,canvas.height);   

  17.             ctx.drawImage(bgcanvas,0,0);   

  18.   

  19.             var timeCount_2 = new Date();   

  20.   

  21.             if(timeCount_1-timeCount_0>=1000){   

  22.                 setTime(timeCount_1);   

  23.                 timeCount_0 = timeCount_1;   

  24.             }   

  25.   

  26.             particles.forEach(function(p){   

  27.                 if(p.visible){   

  28.                     p.update((timeCount_2-timeCount_1)/70);   

  29.                     p.paint();   

  30.                 }   

  31.             });   

  32.   

  33.             timeCount_1 = timeCount_2;   

  34.   

  35.             RAF(animate)   

  36.         }  

  在initAnimate进行动画初始化,初始化也就是先实例化两百个粒子对象放到粒子容器中保存起来,再更新时间戳,缓存背景,设置当前时间,然后调用animate动画循环主体开始动画。

  animate中的逻辑也很简单了,获取时间戳,如果两个时间戳之间的时间差大于或等于1秒,就进行setTime。而再下面的就是对粒子容器里的所有可视化的粒子进行遍历循环重绘了。
然后就做好啦:
怎么用HTML5制作数字时钟

个效果还是有很多可以优化的地方的,因为时钟和分钟都是动的比较少的,所以可以把这两个缓存起来,当没有动作的时候就直接将缓存数据画上去就行了,这样就可以减少舞台每一帧的绘图API调用量,肯定是能提高性能的。不过现在毕竟粒子不多,两三百个粒子对象也就够用了,如果不去做优化,动画也还是能很流畅的运行的。所以楼主就偷个小懒啦。

  源码地址:https://github.com/whxaxes/canvas-test/blob/gh-pages/class="lazy" data-src/Funny-demo/coolClock/index.html

到此,关于“怎么用HTML5制作数字时钟”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么用HTML5制作数字时钟

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么制作漂亮精致的HTML时钟

本篇内容介绍了“怎么制作漂亮精致的HTML时钟”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先看图:涉及到的知识点有: CSS3动画、DOM
2023-06-04

Python怎么调用ChatGPT制作基于Tkinter的桌面时钟

本文小编为大家详细介绍“Python怎么调用ChatGPT制作基于Tkinter的桌面时钟”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python怎么调用ChatGPT制作基于Tkinter的桌面时钟”文章能帮助大家解决疑惑,下面跟着小
2023-07-05

Python中怎么用pyqt5制作指针钟表显示时间

这篇文章主要介绍“Python中怎么用pyqt5制作指针钟表显示时间”,在日常操作中,相信很多人在Python中怎么用pyqt5制作指针钟表显示时间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中
2023-06-29

使用css3怎么实现一个LED 数字时钟

使用css3怎么实现一个LED 数字时钟?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。css是什么意思css是一种用来表现HTML或XML等文件样式的计算机语言
2023-06-08

Java中怎么实现一个数字时钟

这期内容当中小编将会给大家带来有关Java中怎么实现一个数字时钟,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代码如下:package me.socketthread;import java.awt.Co
2023-05-31

怎么在Html5中使用canvas实现一个粒子时钟

这篇文章将为大家详细讲解有关怎么在Html5中使用canvas实现一个粒子时钟,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先要创建一个html文件并添加一个canvas画布,如下:
2023-06-09

怎么用HTML5的canvas实现一个炫酷时钟效果

小编给大家分享一下怎么用HTML5的canvas实现一个炫酷时钟效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!对于H5来说,canvas可以说是它最有特色的一
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录