文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何用HTML5制作数字时钟

2024-04-02 19:55

关注

本篇内容主要讲解“如何用HTML5制作数字时钟”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用HTML5制作数字时钟”吧!

复制代码

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

var numData = [   

            "1111/1001/1001/1001/1001/1001/1111", //0   

            "0001/0001/0001/0001/0001/0001/0001", //1   

            "1111/0001/0001/1111/1000/1000/1111", //2   

            "1111/0001/0001/1111/0001/0001/1111", //3   

            "1010/1010/1010/1111/0010/0010/0010", //4   

            "1111/1000/1000/1111/0001/0001/1111", //5   

            "1111/1000/1000/1111/1001/1001/1111", //6   

            "1111/0001/0001/0001/0001/0001/0001", //7   

            "1111/1001/1001/1111/1001/1001/1111", //8   

            "1111/1001/1001/1111/0001/0001/1111", //9   

            "0000/0000/0010/0000/0010/0000/0000", //:   

        ]  

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

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

        1  1  1  1   

  1  0  0  1   

  1  0  0  1   

  1  0  0  1   

  1  0  0  1   

  1  0  0  1   

  1  1  1  1     

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

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

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

var P_radius = 8,Gravity = 9.8;   

        var Particle = function(){   

            this.x = 0;   

            this.y = 0;   

            this.vx = 0;   

            this.vy = 0;   

            this.color = "";   

            this.visible = false;   

            this.drop = false;   

        }   

        Particle.prototype = {   

            constructors:Particle,   

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

                ctx.fillStyle = this.color;   

                ctx.beginPath();   

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

                ctx.fill();   

            },   

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

                this.x = x;   

                this.y = y;   

                this.vx = 0;   

                this.vy = 0;   

                this.color = color;   

                this.visible = true;   

                this.drop = false;   

            },   

            isDrop:function(){        //落下   

                this.drop = true;   

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

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

            },   

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

                if(this.drop){   

                    this.x += this.vx*time;   

                    this.y += this.vy*time;   

                    var vy = this.vy+Gravity*time;   

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

                        this.y = canvas.height-P_radius   

                        vy = -vy*0.7;   

                    }   

                    this.vy = vy;   

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

                        this.visible = false;   

                    }   

                }   

            }   

        }     

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

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

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

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

function drawBg(){   

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

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

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

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

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

                    if(tt==="/"){   

                        ty+=yjg;   

                    }else {   

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

                            y = ty;   

                        bgctx.fillStyle = "#FFF";   

                        bgctx.beginPath();   

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

                        bgctx.fill();   

                    }   

                }   

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

            }   

        }   

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

2015511172757389.png (1282&times;350)

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

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

function setTime(time){   

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

                m = time.getMinutes()+"",   

                s = time.getSeconds()+"";   

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

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

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

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

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

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

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

                    text = numData[n];   

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

                switch(i){   

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

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

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

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

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

                }   

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

                    var tt = text.charAt(j);   

                    if(tt==="/"){   

                        ty+=yjg;   

                    }else{   

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

                            y = ty,   

                            pp = null,   

                            usefullp = null;   

                        particles.forEach(function(p){   

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

                                ppp = p;   

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

                                usefullp = p;   

                            }   

                        });   

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

                            pp.isDrop();   

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

                            usefullp.reset(x , y , color);   

                        }   

                    }   

                }   

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

            }   

        }  

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

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

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

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

        function initAnimate(){   

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

                var p = new Particle();   

                particles.push(p);   

            }   

            timeCount_0 = new Date();   

            timeCount_1 = new Date();   

            drawBg();   

            setTime(timeCount_0)   

            animate();   

        }   

        function animate(){   

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

            ctx.drawImage(bgcanvas,0,0);   

            var timeCount_2 = new Date();   

            if(timeCount_1-timeCount_0>=1000){   

                setTime(timeCount_1);   

                timeCount_0 = timeCount_1;   

            }   

            particles.forEach(function(p){   

                if(p.visible){   

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

                    p.paint();   

                }   

            });   

            timeCount_1 = timeCount_2;   

            RAF(animate)   

        }  

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

  animate中的逻辑也很简单了,获取时间戳,如果两个时间戳之间的时间差大于或等于1秒,就进行setTime。而再下面的就是对粒子容器里的所有可视化的粒子进行遍历循环重绘了。

到此,相信大家对“如何用HTML5制作数字时钟”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯