html5:canvas实现炫酷时钟

目录

 实现如图的时钟

        知识点:

        具体思路:

     具体结构样式:

js代码(注释详解):

完整代码


 实现如图的时钟

        知识点:

                <canvas>标签,以及附带的方法、属性

        具体思路:

                  1.使用canvas的.arc()方法实现每毫秒时钟进度时分秒的绘制

                  2.通过定时器每一毫秒绘制一次时钟,实现时钟的动画效果

     具体结构样式:


<style>
        * {
            margin: 0;
            padding: 0;
            background-color: rgb(37, 57, 78);
        }
        div {
            margin: 100px auto;
            width: 800px;
            height: 800px;
        }
</style>
<body>
    <div>
        <canvas width="800" height="800" style="background-color: rgb(37, 57, 78);"></canvas>
    </div>
</body>

js代码(注释详解):

<script>
    //获取画板
    var myCanvas = document.getElementsByTagName("canvas")[0];
    // 获取画笔
    var draw = myCanvas.getContext("2d");
    function drawClock() {
        // 绘制前首先清除画布,否则会造成与之前绘制的图形重合导致模糊
        draw.clearRect(0, 0, myCanvas.width, myCanvas.height)
        // 取当前时间  时分秒毫秒
        var now = new Date();
        var miniSec = now.getMilliseconds();
        var seconds = now.getSeconds();
        var minutes = now.getMinutes();
        var hours = now.getHours();
        // 将获取到的时间字符串设置为标准的十分秒毫秒时间格式即00:00:00:000
        miniSec = miniSec < 10 ? "00" + miniSec : miniSec < 100 ? "0" + miniSec : miniSec;
        seconds = seconds < 10 ? "0" + seconds : seconds;
        minutes = minutes < 10 ? "0" + minutes : minutes;
        hours = hours < 10 ? "0" + hours : hours;
        // 获取当前 时/分/秒 各占表盘度数的比例
        var secondDeg = seconds * 6 + miniSec * 6 / 1000;
        var minuteDeg = minutes * 6 + seconds / 10;
        var hourDeg = hours % 12 * 30 + minutes / 2;
        // 通过截取字符串的方法获得我们所需的日期字符串
        var dayTime = now.toString().slice(0, 16);
        // 获取完整的时间显示字符串
        var clockTime = hours + ":" + minutes + ":" + seconds + ":" + miniSec;
        // 设置渐变色 以及线条样式
        var grad = draw.createLinearGradient(0, 0, 800, 800);
        grad.addColorStop(0, 'rgb(0,255,255)')
        grad.addColorStop(0.5, "rgb(173, 204, 230)")
        grad.addColorStop(1, "aliceblue")
        draw.lineWidth = 40;
        // 设置绘制的文本以及文本样式
        draw.textAlign = "center";
        draw.fillStyle = grad;
        draw.font = "bold 30px 微软雅黑";
        draw.fillText(dayTime, 400, 380);
        draw.fillText(clockTime, 400, 430);

        // 将时/分/秒 各占表盘度数的比例存在数组中
        var three = [secondDeg, minuteDeg, hourDeg];
        // 遍历使用数组,绘制时/分/秒的进度
        for (var i = 0; i < three.length; i++) {
            // 首先绘制灰色的路径
            draw.strokeStyle = "rgb(111, 112, 117)";
            draw.shadowBlur = 0;
            draw.beginPath();
            draw.arc(400, 400, 180 + i * 80, 0, Math.PI * 2);
            draw.stroke();
            draw.closePath();
            // 绘制进度,并且使用渐变色
            draw.shadowColor = "rgb(173, 204, 230)";
            draw.shadowBlur = 10;
            draw.beginPath();
            draw.strokeStyle = grad;
            draw.arc(400, 400, 180 + i * 80, -Math.PI / 2, Math.PI / 180 * three[i] - Math.PI / 2, false);
            draw.stroke();
            draw.closePath();
        }
    }
    // 初始化时钟样式
    drawClock();
    // 使用定时器实现时钟进度的变化
    setInterval(drawClock, 1)
</script>

完整代码

<!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>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            background-color: rgb(37, 57, 78);
        }
        div {
            margin: 100px auto;
            width: 800px;
            height: 800px;
        }
    </style>
</head>

<body>
    <div>
        <canvas width="800" height="800" style="background-color: rgb(37, 57, 78);"></canvas>
    </div>
</body>
<script>
    //获取画板
    var myCanvas = document.getElementsByTagName("canvas")[0];
    // 获取画笔
    var draw = myCanvas.getContext("2d");
    function drawClock() {
        // 绘制前首先清除画布,否则会造成与之前绘制的图形重合导致模糊
        draw.clearRect(0, 0, myCanvas.width, myCanvas.height)
        // 取当前时间  时分秒毫秒
        var now = new Date();
        var miniSec = now.getMilliseconds();
        var seconds = now.getSeconds();
        var minutes = now.getMinutes();
        var hours = now.getHours();
        // 将获取到的时间字符串设置为标准的十分秒毫秒时间格式即00:00:00:000
        miniSec = miniSec < 10 ? "00" + miniSec : miniSec < 100 ? "0" + miniSec : miniSec;
        seconds = seconds < 10 ? "0" + seconds : seconds;
        minutes = minutes < 10 ? "0" + minutes : minutes;
        hours = hours < 10 ? "0" + hours : hours;
        // 获取当前 时/分/秒 各占表盘度数的比例
        var secondDeg = seconds * 6 + miniSec * 6 / 1000;
        var minuteDeg = minutes * 6 + seconds / 10;
        var hourDeg = hours % 12 * 30 + minutes / 2;
        // 通过截取字符串的方法获得我们所需的日期字符串
        var dayTime = now.toString().slice(0, 16);
        // 获取完整的时间显示字符串
        var clockTime = hours + ":" + minutes + ":" + seconds + ":" + miniSec;
        // 设置渐变色 以及线条样式
        var grad = draw.createLinearGradient(0, 0, 800, 800);
        grad.addColorStop(0, 'rgb(0,255,255)')
        grad.addColorStop(0.5, "rgb(173, 204, 230)")
        grad.addColorStop(1, "aliceblue")
        draw.lineWidth = 40;
        // 设置绘制的文本以及文本样式
        draw.textAlign = "center";
        draw.fillStyle = grad;
        draw.font = "bold 30px 微软雅黑";
        draw.fillText(dayTime, 400, 380);
        draw.fillText(clockTime, 400, 430);

        // 将时/分/秒 各占表盘度数的比例存在数组中
        var three = [secondDeg, minuteDeg, hourDeg];
        // 遍历使用数组,绘制时/分/秒的进度
        for (var i = 0; i < three.length; i++) {
            // 首先绘制灰色的路径
            draw.strokeStyle = "rgb(111, 112, 117)";
            draw.shadowBlur = 0;
            draw.beginPath();
            draw.arc(400, 400, 180 + i * 80, 0, Math.PI * 2);
            draw.stroke();
            draw.closePath();
            // 绘制进度,并且使用渐变色
            draw.shadowColor = "rgb(173, 204, 230)";
            draw.shadowBlur = 10;
            draw.beginPath();
            draw.strokeStyle = grad;
            draw.arc(400, 400, 180 + i * 80, -Math.PI / 2, Math.PI / 180 * three[i] - Math.PI / 2, false);
            draw.stroke();
            draw.closePath();
        }
    }
    // 初始化时钟样式
    drawClock();
    // 使用定时器实现时钟进度的变化
    setInterval(drawClock, 1)
</script>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值