网上会看到很多绘制的时钟,看代码也是云里雾里,自学了下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. @@IDENTITY与SCOPE_IDENTITY的用法

    SCOPE_IDENTITY   和   @@IDENTITY   的作用都是取得返回在当前会话中的任何表内所生成的最后一个标识值,简单的说就是在执行一条插入语句之后使用@@IDENTITY的全局变量 ...

  2. [原创]Android秒杀倒计时自定义TextView

    自定义TextView控件TimeTextView代码: import android.content.Context; import android.content.res.TypedArray; ...

  3. ECshop数据库的访问统计和管理员日志的清空

    ECshop是个不错的系统,但是它有一定漏洞,若是访问量巨大的话,大量的访问统计代码会存入数据库的ecs_stats表中,甚至几天就可以达到几百兆,严重的网站直接就崩溃了.数据备份的时候也有很多不便, ...

  4. hadoop安装与WordCount例子

    1.JDK安装 下载网址: http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u29-download-513648.html  ...

  5. Icon specified in the Info.plist not found under the top level app wrapper: Icon.png

    For some reason the (possibly when adding multiple icons and changing the file?) the item gets moved ...

  6. 0703-APP-Notification-statue-bar

    1.展示显示textTicker和仅仅有icon的两种情况:当參数showTicker为true时显示否则不显示 // In this sample, we'll use the same text ...

  7. LVS NAT模型

    1,环境 VMWare10, CentOS6.3 2,LVS NAT网络规划 可以看到Director机器有2个IP,也就是说需要2张网卡:Real Server只需要一个网卡. VIP: 虚拟IP, ...

  8. paip.输入法编程---词频顺序order by py

    paip.输入法编程---词频顺序order by py 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn ...

  9. Android 多点手势识别详解

    google 提供的API中,有个类,大家都很熟悉,GestureDetector.使用它,我们可以识别用户通常会用的手势.但是,这个类不支持多点触摸(可能 google认为没有人会在几个手指都在屏幕 ...

  10. Android_menu_SubMenu

    menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- ...