canvas实现钟表

canvas实现钟表效果,代码附在文章最后。


第一步当然是创建一个canvas画布,我这里写的是居中的画布,所以css样式需要做一下修改

然后通过js获取到canvas元素以及画笔。

  我这里写的是一个函数,把所有的逻辑都写在了这个函数内,然后通过定时器,实现动画效果,函数每次进来时都会去清空画布。


重要的地方来了。既然是写钟表,那么肯定少不了获取时间对象了,毕竟想让钟表动起来的关键就在于它。


  需要注意的是,时针取得不能是整数,取整数会造成时针只会在某个小时哪里保持不动。像下面图片这样,明明是3.44分,时针却一直指向3。


  我们需要的效果是这样的,时针会跟随分针移动。


  表盘部分


  标注小时时间


  画小时刻度。这里需要注意的是translate和rotate。它们分别是移动和旋转。因为我的圆心位置是在(250,250),所以想把线段移动到外圈就需要进行移动。至于旋转可以这样想,每个时针的刻度为30度,所以通过j*30*Math.PI/180得到的就是每个刻度的具体位置。


  画分针刻度,这里的旋转可以理解为每个分针刻度的读数为6度


  画时针


  画分针


  画秒针


  画中心位置


现在所有的逻辑都已经走完了,我们需要的就只是一个定时器,来让我们的钟表实现动画效果


  完整代码如下:



```

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>Document</title>

    <style>

        * {

            margin: 0;

            padding: 0;

        }

        canvas {

            border: 1px solid #ccc;

            position: absolute;

            left: 0;

            right: 0;

            top: 0;

            bottom: 0;

            margin: 100px auto;

        }

    </style>

</head>

<body>

    <canvas width="500" height="500"></canvas>

    <script>

        var canvas = document.getElementsByTagName('canvas')[0];

        var ctx = canvas.getContext('2d');

        function zhongBiao() {

            ctx.clearRect(0, 0, canvas.width, canvas.height)

            var now = new Date();

            var hour = now.getHours();

            var minute = now.getMinutes();

            var second = now.getSeconds();

            hour = hour + minute / 60                                 

            hour = hour > 12 ? hour - 12 : hour;

            ctx.beginPath();

            ctx.lineWidth = '5';

            ctx.arc(250, 250, 200, 0, 2 * Math.PI);

            ctx.strokeStyle = 'rgba(16, 214, 204, 0.664)';

            ctx.stroke();

            ctx.closePath();

            ctx.font = '30px 微软雅黑';

            ctx.fillStyle = '#000';

            ctx.fillText('12', 235, 105);

            ctx.fillText('11', 160, 130);

            ctx.fillText('10', 100, 180);

            ctx.fillText('9', 80, 260);

            ctx.fillText('8', 105, 340);

            ctx.fillText('7', 170, 400);

            ctx.fillText('6', 240, 420);

            ctx.fillText('5', 320, 400);

            ctx.fillText('4', 375, 340);

            ctx.fillText('3', 400, 260);

            ctx.fillText('2', 380, 180);

            ctx.fillText('1', 320, 130);

            for (var j = 0; j < 12; j++) {

                ctx.save();

                ctx.beginPath();

                ctx.lineWidth = '6';

                ctx.strokeStyle = 'rgba(219, 74, 16, 0.863)';

                ctx.translate(250, 250);

                ctx.rotate(j * 30 * Math.PI / 180);

                ctx.moveTo(0, -200);

                ctx.lineTo(0, -180);

                ctx.stroke();

                ctx.closePath();

                ctx.restore();

            }

            for (var i = 0; i < 60; i++) {

                if (i % 5 != 0) {

                    ctx.save();

                    ctx.lineWidth = 5;

                    ctx.strokeStyle = "crimson";

                    ctx.translate(250, 250);

                    ctx.rotate(i * 6 * Math.PI / 180);

                    ctx.beginPath();

                    ctx.moveTo(0, -200);

                    ctx.lineTo(0, -190);

                    ctx.stroke();

                    ctx.closePath();

                    ctx.restore();

                }

            }

            ctx.save();

            ctx.lineWidth = 10;

            ctx.strokeStyle = "#ccc";

            ctx.translate(250, 250);

            ctx.rotate(hour * 30 * Math.PI / 180);

            ctx.beginPath();

            ctx.moveTo(0, -175);

            ctx.lineTo(0, 20);

            ctx.stroke();

            ctx.closePath();

            ctx.restore();

            ctx.save();

            ctx.lineWidth = 5;

            ctx.strokeStyle = "red";

            ctx.translate(250, 250);

            ctx.rotate(minute * 6 * Math.PI / 180);

            ctx.beginPath();

            ctx.moveTo(0, -155);

            ctx.lineTo(0, 20);

            ctx.stroke();

            ctx.closePath();

            ctx.restore();

            ctx.save();

            ctx.lineWidth = 5;

            ctx.strokeStyle = "pink";

            ctx.translate(250, 250);

            ctx.rotate(second * 6 * Math.PI / 180);

            ctx.beginPath();

            ctx.moveTo(0, -135);

            ctx.lineTo(0, 20);

            ctx.stroke();

            ctx.closePath();

            ctx.restore();

            ctx.beginPath();

            ctx.arc(250, 250, 10, 0, 2 * Math.PI);

            ctx.fillStyle = 'blue'

            ctx.fill();

            ctx.closePath();

        }

        setInterval(function () {

            zhongBiao()

        }, 1000)

        zhongBiao()

    </script>

</body>

</html>

```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容