使用H5 canvas绘制时钟

423 阅读1分钟
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>绘制时钟</title>
    <style>
        div {
            text-align: center;
        }
    </style>
    <script>
        window.onload = function () {
            // 获取画布
            var canvas = document.querySelector('canvas');
            // 获取上下文-->获取画笔
            var context = canvas.getContext('2d');
            function clock() {
                // 绘制圆盘
                context.beginPath();  //开始路径
                // Math.PI--180度
                /*参数设置
                圆心x轴坐标, 圆心y轴坐标, 圆半径, 开始弧度, 结束弧度
                */
                context.arc(3003002000Math.PI * 2);
                //设置画笔样式
                context.fillStyle = 'tomato';
                context.fill();
                context.closePath();  //结束路径
                // 绘制时刻度
                for (i = 0; i < 12; i++) {
                    context.save();  //设置环境
                    context.lineWidth = 4;
                    context.beginPath();
                    //将原点平移
                    context.translate(300300);
                    context.rotate(i * (Math.PI / 6));
                    context.moveTo(0, -180);  // 画线 从(0,-180)开始
                    context.lineTo(0, -200);  //到(0,-200)结束
                    // 绘制轮廓
                    context.stroke();
                    context.fillStyle = 'black';
                    context.font = '28px bold';
                    context.rotate(Math.PI / 6);
                    //使数字出现在钟的四周,没有这句代码也行
                    context.fillText(i + 1, -10, -220);
                    context.closePath();
                    context.restore();  // 将绘制后的元素放回画布
                }
                // 绘制分刻度
                for (i = 0; i < 60; i++) {
                    context.save();
                    context.translate(300300);
                    context.rotate(i * Math.PI / 30);  //设置旋转角度
                    context.beginPath();
                    context.moveTo(0, -190);
                    context.lineTo(0, -200);
                    context.stroke();
                    context.closePath();
                    context.restore();
                }
                // 获取当前时间
                var today = new Date();
                var hour = today.getHours();
                var min = today.getMinutes();
                var sec = today.getSeconds();
                hour = hour + min / 60;
                // 绘制时针
                context.save();
                context.lineWidth = 3;
                context.translate(300300);
                context.rotate(hour * Math.PI / 6);
                context.beginPath();
                context.moveTo(010);
                context.lineTo(0, -80);
                context.stroke();
                context.closePath();
                context.restore();
                // 绘制分针
                context.save();
                context.lineWidth = 2;
                context.translate(300300);
                context.rotate(min * Math.PI / 30);
                context.beginPath();
                context.moveTo(010);
                context.lineTo(0, -100);
                context.stroke();
                context.closePath();
                context.restore();
                // 绘制秒针
                context.save();
                context.lineWidth = 1;
                context.translate(300300);
                context.rotate(sec * Math.PI / 30);
                context.strokeStyle = 'red';
                context.beginPath();
                context.moveTo(015);
                context.lineTo(0, -120);
                context.stroke();
                context.closePath();
                context.restore();
                // 绘制秒针交叉处
                context.save();
                context.translate(300300);
                context.beginPath();
                context.arc(0050Math.PI * 2);
                context.fillStyle = '#ccc';
                context.strokeStyle = 'red';
                context.fill();
                context.stroke();
                context.closePath();
                context.restore();
                setTimeout(clock, 1000);  //超时模拟间歇
            }
           clock();
        }
    </script>
</head>
<body>
    <div>
        <canvas width="600px" height="600px"></canvas>
    </div>
</body>
</html>

效果:

时钟.png