HTML5 Canvas 绘制时钟
网上会看到很多绘制的时钟,看代码也是云里雾里,自学了下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 绘制时钟的更多相关文章
- html5 Canvas绘制时钟以及绘制运动的圆
1.绘制时钟 <!-- js代码 --> <script type="text/javascript"> window.onload=function(){ ...
- 使用canvas绘制时钟
使用canvas绘制时钟 什么使canvas呢?HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图 ...
- 使用html5 canvas绘制圆形或弧线
注意:本文属于<html5 Canvas绘制图形入门详解>系列文章中的一部分.如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解canvas,甚至无法顺畅地通读本文.请点击上述链 ...
- 学习笔记:HTML5 Canvas绘制简单图形
HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...
- 使用 HTML5 Canvas 绘制出惊艳的水滴效果
HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...
- 使用html5 canvas绘制图片
注意:本文属于<html5 Canvas绘制图形入门详解>系列文章中的一部分.如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解canvas,甚至无法顺畅地通读本文.请点击上述链 ...
- html5 Canvas绘制图形入门详解
html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...
- [ZZ+CH] Html5 canvas+js 时钟
总之新Blog入驻以后,又开始老习惯,到处折腾自定义的空间,放些东西. 想起以前大一的时候做过一个Javascript的时间显示器,现在想做一个时钟,当然现在老奸巨猾,会先去看一看有前辈写过没. 前辈 ...
- 解决html5 canvas 绘制字体、图片与图形模糊问题
html5 canvas 绘制字体.图片与图形模糊问题 发生情况 多出现在高dpi设备,这意味着每平方英寸有更多的像素,如手机,平板电脑.当然很多高端台式电脑也有高分辨率高dpi的显示器. canva ...
随机推荐
- 本地或者是koala软件编译less文件为css
背景: 事情的起因是这般的,平时工作是在线上办公,样式是使用less来写,于是乎,这样我从线上download下来的less文件无法直接在自己的本地环境运行.有一个问题就是我要把less文件先编译成c ...
- 多边形背景生成工具推荐-Trianglify
前端开发whqet,csdn,王海庆,whqet,前端开发专家 low poly低多边形(相似于折纸的效果),多边形风格的设计应用越来越多,今天我们就来看一个利用d3.js写成的生成器Triangli ...
- ArrowDrawable
https://github.com/wly2014/ArrowDrawable https://github.com/ChrisRenke/DrawerArrowDrawable
- 优麒麟(UbuntuKylin)不是国产Linux操作系统
2014年5月10日,CCTV新闻频道"新闻直播间"栏目播报了"谁来替代Windows XP,工信部希望用户使用国产操作系统"报道.同一时候,央视也报道了眼下包 ...
- qss 实践
*{ font-size:13px; color:white; font-family:"宋体"; } CallWidget QLineEdit#telEdt { font-siz ...
- PHP中$_POST,$_GET,$_REQUEST,$_FILES全局变量的全局指什么
我一直担心,同一个表单,同时提交2次会发生什么事?在服务器端表单变量会不会彼此覆盖呢?也就是说假如我们在PHP中用$_REQUEST["name"]访问某个表单变量,会不会因为别人 ...
- Languages
Languages A language class exists inside the system/Core folder, this class have 2 methods: load - L ...
- Java 之 调用.Net的 WebService 整理
最近做一个 java 调用 .net 服务的项目,其中 .net做了一个WebService,需要java来调用. 最开始.net的Service代码如下: using System; using S ...
- Android 断点续传
断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部 ...
- C语言创建并使用dll
利用C语言创建 利用 C++使用: 参见前面 利用C语言创建并使用lib 如法炮制创建 showDll Dll代码 __declspec(dllexport) double myDivision(i ...