canvas 时钟

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>canvas-clock</title>
        
    </head>
    <body>
        <canvas id="myCanvas" class="canvas" width="150" height="150" style="border:1px solid #d3d3d3;margin: 0 auto;display: block;">

        </canvas>
        
        <script>
            var clock = function(){
                var canvas = document.querySelector("#myCanvas");
                if(canvas && canvas.getContext)
                {
                    var cxt = canvas.getContext("2d");
                    cxt.save();//保存状态
                    cxt.clearRect(0,0,150,150);//清理画布
                    cxt.translate(75,75);//以(75,75)为原点
                    cxt.scale(0.5,0.5);//缩放
                    cxt.rotate(-Math.PI/2);//逆转90°
                    //=======================================
                    //表盘
                    cxt.beginPath();
                    cxt.lineWidth= 30;
                    var gld = cxt.createLinearGradient(0,0,50,75);
                    gld.addColorStop(0,"#e0e3ec");
                    gld.addColorStop(1,"#9aa0a0");
                    cxt.strokeStyle = gld;
                    var grd = cxt.createRadialGradient(0,0,0,0,0,150);
                    grd.addColorStop(0,"#ccc");
                    grd.addColorStop(1,"#ccc");
                    cxt.fillStyle = grd;
                    cxt.arc(0,0,135,0,Math.PI*2,true);
                    cxt.stroke();
                    cxt.fill();
    
                    cxt.strokeStyle = "#969696";
                    cxt.lineCap = "square";
                    cxt.save();
                    cxt.lineWidth = 8;
                    cxt.beginPath();
                    for (var i = 0;i<12;i++) {
                        cxt.rotate(Math.PI/6);
                        cxt.moveTo(100,0);
                        cxt.lineTo(120,0);
                        cxt.stroke();
                    }
                    cxt.restore();
                    
                    //分钟刻度
                    cxt.save();
                    cxt.lineWidth = 5;
                    for(i=0;i<60;i++){
                        if (i%5!=0) {
                            cxt.beginPath();
                            cxt.moveTo(132,0);
                            cxt.lineTo(120,0);
                            cxt.stroke();
                        }
                        cxt.rotate(Math.PI/30);
                    }
                    cxt.restore();
                    
                    var now = new Date();
                    var sec = now.getSeconds();
                    var min = now.getMinutes();
                    var hr = now.getHours();
                    hr= hr>12?hr-12:hr;
                    //时针
                    cxt.save();
                    cxt.rotate(hr*(Math.PI/6)+(Math.PI/360)*min + (Math.PI/21600)*sec);
                    cxt.lineWidth = 9;
                    cxt.beginPath();
                    cxt.moveTo(-20,0);
                    cxt.lineTo(70,0);
                    cxt.stroke();
                    cxt.restore();
                    //分针
                    cxt.save();
                    cxt.rotate((Math.PI/30)*min+(Math.PI/1800)*sec);
                    cxt.lineWidth = 6;
                    cxt.beginPath();
                    cxt.moveTo(-28,0);
                    cxt.lineTo(90,0);
                    cxt.stroke();
                    cxt.restore();
                    //秒针
                    cxt.save();
                    cxt.rotate((Math.PI/30)*sec);
                    cxt.lineWidth = 3;
                    cxt.beginPath();
                    cxt.moveTo(-30,0);
                    cxt.lineTo(120,0);
                    cxt.stroke();
                    cxt.restore();
                    
                    //中心点
                    cxt.beginPath();
                    cxt.fillStyle = "#969696";
                    cxt.arc(0,0,8,0,Math.PI*2,true);
                    cxt.fill();
                    
                    cxt.restore();
                }
            }
            setInterval(clock,1000);

        </script>
    </body>
</html>
原文地址:https://www.cnblogs.com/acyy/p/4396051.html