网上会看到很多绘制的时钟,看代码也是云里雾里,自学了下Canvas,觉得不难,就自己做了一个。

先看一下截图:

比较简陋,但是该有的都有了,样式只加了个阴影。

html代码就不贴了,就一个canvas。

<canvas id="clock" width="300" height="300"></canvas>

下面是JS实现:

1、取得上下文:

var clock = document.getElementById('clock'),
      context = clock.getContext('2d');

2、为了方便,先把绘制上下文做一下变换。

移动之前原点在左上角,现在把他移动到中心处,这里我们画上钟表中心。

平移之后,0度在下午三点钟方向,我们把他旋转到12点钟方向,这样时间和角度就是统一的了。

context.translate(150, 150);
context.rotate(-Math.PI / 2);

3、首先绘制个大圆,作为钟表的外轮廓。

因为在上面做了平移,所以圆心就是(0,0),然后最后一个参数是false,表示按顺时针方向绘制,因为旋转过,所以就是从12点方向,顺时针方向绘制了个圆,正好和表的走法是一致的,

这样后面处理起来就方便的多。

        context.beginPath();
        context.arc(0, 0, 130, 0, Math.PI * 2, false);
        context.closePath();
        context.stroke();

4、绘制中心的点

        context.beginPath();
        context.arc(0, 0, 5, 0, Math.PI * 2, false);
        context.closePath();
        context.fill();

5、绘制小时刻度,12个,角度间隔是30度,这里需要弧度。

x和y的确定需要画图看一下,其实不难。

x也就是半径的sin值,y是cos值。

       var angle = 0;       for(var i = 0; i < 12; i++) {
            angle += Math.PI / 6;
            context.beginPath();
            var x = radius * Math.cos(angle),
                y = radius * Math.sin(angle);
            var dx = 10 * Math.cos(angle);
                dy = 10 * Math.sin(angle);
            context.moveTo(x, y);
            context.lineTo(x - dx, y - dy);
            context.stroke();
            context.closePath();
        }

6、绘制分秒的刻度,60个,和上面一样。

         var angle = 0;
         for(var i = 0; i < 60; i++) {
            angle += Math.PI / 30;
            context.beginPath();
            var x = radius * Math.cos(angle),
                y = radius * Math.sin(angle);
            var dx = 3 * Math.cos(angle);
                dy = 3 * Math.sin(angle);
            context.moveTo(x, y);
            context.lineTo(x - dx, y - dy);
            context.stroke();
            context.closePath();
        }

7、接下来就是三根针了,首先获得当前的时间。

小时如果大于12了,我们要减掉12,同时我们会发现,时针不是一下子跳跃的,他也是慢慢的移动到下一个小时的,所以要取得他的准确小时数。

        var now = new Date(),
            hour = now.getHours(),
            minute = now.getMinutes(),
            second = now.getSeconds();

        hour = hour >= 12 ? hour - 12 : hour;         hour += minute / 60;

8、绘制秒针,可以像上面那样的画个图看看。110是长度,时针和分针的绘制方法是一样的。

    var xS = 110 * Math.cos(Math.PI / 30 * second),
        yS = 110 * Math.sin(Math.PI / 30 * second);
        context.beginPath();
        context.moveTo(0, 0);
        context.lineTo(xS, yS);
        context.stroke();

9、动画

动画就是不停的擦除更新,首先在最开始就擦除。

context.clearRect(-150, -150, 300, 300);

然后使用setTimeout。假设之前的都放在drawClock函数里,那么就可以每个一秒就调用自身。

        setTimeout(function() {
            drawClock();
        }, 1000);

这样基本就可以了,然后可以简单的把重复的地方封装一下。

js文件在:http://files.cnblogs.com/zjzhome/clock.js

HTML5 Canvas 绘制时钟的更多相关文章

  1. html5 Canvas绘制时钟以及绘制运动的圆

    1.绘制时钟 <!-- js代码 --> <script type="text/javascript"> window.onload=function(){ ...

  2. 使用canvas绘制时钟

    使用canvas绘制时钟  什么使canvas呢?HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图 ...

  3. 使用html5 canvas绘制圆形或弧线

    注意:本文属于<html5 Canvas绘制图形入门详解>系列文章中的一部分.如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解canvas,甚至无法顺畅地通读本文.请点击上述链 ...

  4. 学习笔记:HTML5 Canvas绘制简单图形

    HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...

  5. 使用 HTML5 Canvas 绘制出惊艳的水滴效果

    HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...

  6. 使用html5 canvas绘制图片

    注意:本文属于<html5 Canvas绘制图形入门详解>系列文章中的一部分.如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解canvas,甚至无法顺畅地通读本文.请点击上述链 ...

  7. html5 Canvas绘制图形入门详解

    html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...

  8. [ZZ+CH] Html5 canvas+js 时钟

    总之新Blog入驻以后,又开始老习惯,到处折腾自定义的空间,放些东西. 想起以前大一的时候做过一个Javascript的时间显示器,现在想做一个时钟,当然现在老奸巨猾,会先去看一看有前辈写过没. 前辈 ...

  9. 解决html5 canvas 绘制字体、图片与图形模糊问题

    html5 canvas 绘制字体.图片与图形模糊问题 发生情况 多出现在高dpi设备,这意味着每平方英寸有更多的像素,如手机,平板电脑.当然很多高端台式电脑也有高分辨率高dpi的显示器. canva ...

随机推荐

  1. [二]Json-lib的用法

    1.Json字符串 PrintWriter out=response.getWriter(); // String resultJson="{\"name\":\&quo ...

  2. other

    1.http://handlebarsjs.com/ 2.grunt

  3. C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类

    类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. //单继承的定义 class B:public A { ...

  4. 【32】确定你的public继承塑模出Is-A关系

    1.public继承表示Is-A关系,也就是满足里氏代换.与之相对应的,private继承表示根据某物实现出,不满足里氏代换.子类对象初始化父类引用,编译通不过. 2.考虑下面的需求,企鹅继承鸟,Bi ...

  5. Project Management - 2) Estimate Your Work

    1. Delphi估算 1) 项目经理召集小组成员,就项目有关事宜向大家进行阐述. 2)大家提出各种问题,然后进行分配任务. 每个人写下自己的任务列表和时间估算. 3)项目经理收集好任务之后进行复查, ...

  6. OpenCV快速遍历矩阵元素方法

    OpenCV中Mat矩阵data数据的存储方式和二维数组不一致,二维数组按照行优先的顺序依次存储,而Mat中还有一个标示行步进的变量Step.使用Mat.ptr<DataTyte>(row ...

  7. windows8 认识及使用

    windows8的一次技术分享. 利用国庆宅家的几天,在跑不动XP的老笔记本上装了win8,嘿,跑的溜溜的,一高兴做个ppt给公司的同事们介绍介绍,随意之作,勿较真抬杠,呵呵. 文件地址:http:/ ...

  8. iOS开发——MVC详解&Swift+OC

    MVC 设计模式 这两天认真研究了一下MVC设计模式,在iOS开发中这个算是重点中的重点了,如果对MVC模式不理解或者说不会用,那么你iOS肯定学不好,或者写不出好的东西,当然本人目前也在学习中,不过 ...

  9. VC depends使用说明

    Depends用来显示与一个可执行文件(exe或者dll)相关的依赖项(动态链接库dll),以及该exe或dll引用了这些dll中的哪些接口,同时也可以看到每个被依赖的dll中的所有导出的函数接口. ...

  10. [Effective C++ --018]让接口容易被正确使用,不易被误用

    □第一节 什么是接口?什么是接口?百度百科的解释:两个不同系统(或子程序)交接并通过它彼此作用的部分.接口的概念贯穿于整个软件开发过程中,本文讨论的接口概念仅局限于以C++实现的class,funct ...