Canvas 炫丽的倒计时

转自:http://www.w3cfuns.com/blog-5452775-5401650.html


<!DOCTYPE html>

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<script>
    digit =
            [
                [
                    [0,0,1,1,1,0,0],
                    [0,1,1,0,1,1,0],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [0,1,1,0,1,1,0],
                    [0,0,1,1,1,0,0]
                ],//0
                [
                    [0,0,0,1,1,0,0],
                    [0,1,1,1,1,0,0],
                    [0,0,0,1,1,0,0],
                    [0,0,0,1,1,0,0],
                    [0,0,0,1,1,0,0],
                    [0,0,0,1,1,0,0],
                    [0,0,0,1,1,0,0],
                    [0,0,0,1,1,0,0],
                    [0,0,0,1,1,0,0],
                    [1,1,1,1,1,1,1]
                ],//1
                [
                    [0,1,1,1,1,1,0],
                    [1,1,0,0,0,1,1],
                    [0,0,0,0,0,1,1],
                    [0,0,0,0,1,1,0],
                    [0,0,0,1,1,0,0],
                    [0,0,1,1,0,0,0],
                    [0,1,1,0,0,0,0],
                    [1,1,0,0,0,0,0],
                    [1,1,0,0,0,1,1],
                    [1,1,1,1,1,1,1]
                ],//2
                [
                    [1,1,1,1,1,1,1],
                    [0,0,0,0,0,1,1],
                    [0,0,0,0,1,1,0],
                    [0,0,0,1,1,0,0],
                    [0,0,1,1,1,0,0],
                    [0,0,0,0,1,1,0],
                    [0,0,0,0,0,1,1],
                    [0,0,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [0,1,1,1,1,1,0]
                ],//3
                [
                    [0,0,0,0,1,1,0],
                    [0,0,0,1,1,1,0],
                    [0,0,1,1,1,1,0],
                    [0,1,1,0,1,1,0],
                    [1,1,0,0,1,1,0],
                    [1,1,1,1,1,1,1],
                    [0,0,0,0,1,1,0],
                    [0,0,0,0,1,1,0],
                    [0,0,0,0,1,1,0],
                    [0,0,0,1,1,1,1]
                ],//4
                [
                    [1,1,1,1,1,1,1],
                    [1,1,0,0,0,0,0],
                    [1,1,0,0,0,0,0],
                    [1,1,1,1,1,1,0],
                    [0,0,0,0,0,1,1],
                    [0,0,0,0,0,1,1],
                    [0,0,0,0,0,1,1],
                    [0,0,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [0,1,1,1,1,1,0]
                ],//5
                [
                    [0,0,0,0,1,1,0],
                    [0,0,1,1,0,0,0],
                    [0,1,1,0,0,0,0],
                    [1,1,0,0,0,0,0],
                    [1,1,0,1,1,1,0],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [0,1,1,1,1,1,0]
                ],//6
                [
                    [1,1,1,1,1,1,1],
                    [1,1,0,0,0,1,1],
                    [0,0,0,0,1,1,0],
                    [0,0,0,0,1,1,0],
                    [0,0,0,1,1,0,0],
                    [0,0,0,1,1,0,0],
                    [0,0,1,1,0,0,0],
                    [0,0,1,1,0,0,0],
                    [0,0,1,1,0,0,0],
                    [0,0,1,1,0,0,0]
                ],//7
                [
                    [0,1,1,1,1,1,0],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [0,1,1,1,1,1,0],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [0,1,1,1,1,1,0]
                ],//8
                [
                    [0,1,1,1,1,1,0],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [1,1,0,0,0,1,1],
                    [0,1,1,1,0,1,1],
                    [0,0,0,0,0,1,1],
                    [0,0,0,0,0,1,1],
                    [0,0,0,0,1,1,0],
                    [0,0,0,1,1,0,0],
                    [0,1,1,0,0,0,0]
                ],//9
                [
                    [0,0,0,0],
                    [0,0,0,0],
                    [0,1,1,0],
                    [0,1,1,0],
                    [0,0,0,0],
                    [0,0,0,0],
                    [0,1,1,0],
                    [0,1,1,0],
                    [0,0,0,0],
                    [0,0,0,0]
                ]//:
            ];
    /**
     * Created by Administrator on 2014/10/25 0025.
     */
    var WINDOW_WIDTH=1124;
    var WINDOW_HEIGHT=500;
    var RADIUS=8;
    var MARGIN_TOP=60;
    var MARGIN_LEFT=30;

    //const  endTime=new Date(2014,10,1,18,24,56);
    var   endTime=new Date();
    endTime=endTime.getTime()+8976356;
    var curShowTimeSeconds=0;

    var balls=[];
    var colors=["#33B5E5","#0099CC","#AA66CC","#99CC00","#669900","#FFBB33","#FF8800","#FF4444","#CC0000","#9933CC"];
    window.οnlοad=function(){
        WINDOW_HEIGHT=document.documentElement.clientHeight||document.body.clientHeight ;
        //要前台的body撑起来,否则取不到值,为解决ff兼容性的问题,最好把document.documentElement.clientHeight写在前面
        WINDOW_WIDTH=document.body.clientWidth||document.documentElement.clientWidth;
        MARGIN_LEFT=Math.round(WINDOW_WIDTH/10);
        RADIUS=Math.round(WINDOW_WIDTH*4/5/108)-1;//还记得108怎么得来的吗?
        MARGIN_TOP=Math.round(WINDOW_HEIGHT/5);

        var convas=document.getElementById("canvas");
        var context=canvas.getContext("2d");
        convas.width=WINDOW_WIDTH;
        convas.height=WINDOW_HEIGHT;

        curShowTimeSeconds=getCurrentShowTimeSeconds();

        setInterval(
                function(){
                    render(context);
                    update();
                } ,
                50
        );


    }
    function update(){
        var nextShowTimeSeconds=getCurrentShowTimeSeconds();

        var nextHours=parseInt(nextShowTimeSeconds/3600);
        var nextMinutes=parseInt((nextShowTimeSeconds-nextHours*3600)/60);
        var nextSeconds=nextShowTimeSeconds%60;

        var curHours=parseInt(curShowTimeSeconds/3600);
        var curMinutes=parseInt((curShowTimeSeconds-curHours*3600)/60);
        var curSeconds=curShowTimeSeconds%60;

        if(nextSeconds!=curSeconds){
            if(nextHours!=curHours){
                addBalls(MARGIN_LEFT+0,MARGIN_TOP,parseInt(curHours/10));
            }
            if(nextHours%10!=curHours%10){
                addBalls(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(curHours%10));
            }

            if(nextMinutes!=curMinutes){
                addBalls(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(curMinutes/10));
            }
            if(nextMinutes%10!=curMinutes%10){
                addBalls(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(curMinutes%10));
            }

            if(nextSeconds!=curSeconds){
                addBalls(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(curSeconds/10));
            }
            if(nextSeconds%10!=curSeconds%10){
                addBalls(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(curSeconds%10));
            }

            curShowTimeSeconds=nextShowTimeSeconds;
        }
        updateBalls();
        //console.log(balls.length);
    }
    function updateBalls(){
        for(var i=0;i<balls.length;i++){
            balls[i].x+=balls[i].vx;
            balls[i].y+=balls[i].vy;
            balls[i].vy+=balls[i].g;
            if(balls[i].y>=WINDOW_HEIGHT-RADIUS){
                balls[i].y=WINDOW_HEIGHT-RADIUS;
                balls[i].vy=-balls[i].vy*0.75;
            }
        }
        var cnt=0;
        for(var i=0;i<balls.length;i++){
            if(balls[i].x+RADIUS>0 && balls[i].x-RADIUS<WINDOW_WIDTH){
                balls[cnt++]=balls[i];
            }
        }

        while(balls.length>Math.min(400,cnt)){
            balls.pop();//删除数组末尾的值
        }
    }

    function addBalls(x,y,num){
        for(var i=0;i<digit[num].length;i++){
            for(var j=0;j<digit[num][i].length;j++){
                if(digit[num][i][j]==1){
                    var aBall={
                        x:x+j*2*(RADIUS+1)+(RADIUS+1),
                        y:y+i*2*(RADIUS+1)+(RADIUS+1),
                        g:1.5+Math.random(),
                        vx:Math.pow(-1,Math.ceil((Math.random()*1000)))*4,
                        vy:-5,
                        color:colors[Math.floor(Math.random()*colors.length)]
                    }
                    balls.push(aBall);
                }
            }
        }
    }
    function getCurrentShowTimeSeconds(){
        var curTime=new Date();
        var ret=endTime-curTime.getTime();
        ret=Math.round(ret/1000);
        return ret>=0 ? ret : 0;
    }

    function render(txt){
        txt.clearRect(0,0,WINDOW_WIDTH,WINDOW_HEIGHT);//对矩形空间的动画进行一次刷新

        var hours=parseInt(curShowTimeSeconds/3600);
        var minutes=parseInt((curShowTimeSeconds-hours*3600)/60);
        var seconds=curShowTimeSeconds%60;

        renderDigit(MARGIN_LEFT,MARGIN_TOP,parseInt(hours/10),txt);
        renderDigit(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(hours%10),txt);
        renderDigit(MARGIN_LEFT+30*(RADIUS+1),MARGIN_TOP,10,txt);

        renderDigit(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(minutes/10),txt);
        renderDigit(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(minutes%10),txt);
        renderDigit(MARGIN_LEFT+69*(RADIUS+1),MARGIN_TOP,10,txt);

        renderDigit(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(seconds/10),txt);
        renderDigit(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(seconds%10),txt);

        for(var i=0;i<balls.length;i++){
            txt.beginPath();
            txt.arc(balls[i].x,balls[i].y,RADIUS,0,2*Math.PI,true);
            txt.closePath();
            txt.fillStyle=balls[i].color;
            txt.fill();
        }

    }
    function renderDigit(x,y,num,txt){
        txt.fillStyle="rgb(0,120,153)";
        for(var i=0;i<digit[num].length;i++){
            for(var j=0;j<digit[num][i].length;j++){
                if(digit[num][i][j]==1){
                    txt.beginPath();
                    txt.arc(x+j*2*(RADIUS+1)+(RADIUS+1),y+i*2*(RADIUS+1)+(RADIUS+1),RADIUS,0,2*Math.PI);
                    txt.closePath();

                    txt.fill();
                }
            }
        }
    }

</script>
<body style="height: 100%;">
    <canvas id="canvas" style="height: 100%;">
        当前浏览器不支持Canvas,请更换其他浏览器再试!
    </canvas>


</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值