canvas实现一个经典时钟

效果如下
在这里插入图片描述

代码:

<html>
<head>
    <meta charset="utf8">
    <style>

    </style>
</head>
<body>
<div id="app">
    <canvas id="board" width="200"></canvas>
</div>
<script>
    function drawShell(b) {
        var board = document.getElementById('board');
        if (!board) {
            document.querySelector('#app').innerHTML = `<canvas id="board" width="200"></canvas>`;
            board = document.getElementById('board');
        } else {
            board.parentElement.removeChild(board);
            document.querySelector('#app').innerHTML = `<canvas id="board" width="200"></canvas>`;
            board = document.getElementById('board');
        }
        board.width = board.width * b;
        board.height = board.width;

        var context = board.getContext('2d');
        context.beginPath();
        var r = board.width / 2 - 5 * b;
        context.arc(board.width / 2, board.height / 2, r, 0, 2 * Math.PI, false);

        context.translate(board.width / 2, board.height / 2);
        context.stroke();

        var base = 2 * Math.PI / 60;
        for (var n = 0; n < 60; n++) {
            context.beginPath();
            var start_x = (r - 5 * b) * Math.cos(base * n);
            var start_y = (r - 5 * b) * Math.sin(base * n);
            context.moveTo(start_x, start_y);

            if (n == 0 || n % 5 == 0) {
                context.lineWidth = 2 * b;
                var number;
                if (n == 0 || n < 45 || n == 45) {
                    number = (n / 5) + 3;
                } else {
                    number = (n - 50) / 5 + 1;
                }
                context.textBaseline = 'middle';
                context.textAlign = 'center';
                var on_x = (r - 3 * 5 * b) * Math.cos(base * n);
                var on_y = (r - 3 * 5 * b) * Math.sin(base * n);
                context.fillText(number, on_x, on_y);
            } else {
                context.lineWidth = 1 * b;
            }
            var end_x = (r - 2 * 5 * b) * Math.cos(base * n);
            var end_y = (r - 2 * 5 * b) * Math.sin(base * n);
            context.lineTo(end_x, end_y);
            context.stroke();
        }

        var date = new Date();
        var t = date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds();
        context.textAlign = 'center';
        context.textBaseline = 'middle';
        context.font = 10 * b + 'px 宋体';
        context.fillText(t, 0, board.height / 4);


    }

    function drawNeedle(b) {
        var board = document.getElementById('board');
        var context = board.getContext('2d');
        var r = board.width / 2 - 5 * b;
        var base = 2 * Math.PI / 60;

        var time = new Date();
        var hours = time.getHours();
        var min = time.getMinutes();
        var sec = time.getSeconds();
        drawHourNeedle();
        drawMinNeedle();
        drawSeconNeedle();

        function drawHourNeedle() {
            var x = (r - 5 * 5 * b) * Math.cos(base * ((hours - 3) * 5 + min / 12));
            var y = (r - 5 * 5 * b) * Math.sin(base * ((hours - 3) * 5 + min / 12));
            context.beginPath();
            context.moveTo(0, 0);
            context.lineWidth = 3;
            context.lineTo(x, y);
            context.stroke();
        }

        function drawMinNeedle() {
            var x = (r - 4 * 5 * b) * Math.cos(base * ((min - 15) + (sec / 60)));
            var y = (r - 4 * 5 * b) * Math.sin(base * ((min - 15) + (sec / 60)));
            context.beginPath();
            context.moveTo(0, 0);
            context.lineWidth = 2;
            context.lineTo(x, y);
            context.stroke();
        }

        function drawSeconNeedle() {
            var x = (r - 3 * 5 * b) * Math.cos(base * (sec - 15));
            var y = (r - 3 * 5 * b) * Math.sin(base * (sec - 15));
            context.beginPath();
            context.moveTo(0, 0);
            context.lineWidth = 3;
            context.lineTo(x, y);
            context.stroke();
        }
    }

    function drawClock(b) {
        drawShell(b);
        drawNeedle(b);
    }

    setInterval(function () {
        drawClock(1);
    }, 1000)
</script>
</body>
</html>

看不懂请联系作者 ----出门要带伞
QQ 2330701461

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值