通过Canvas + JS 实现简易时钟实战
最近通过各种渠道学习了下html5中的canvas元素,为了练练手就随手写了一个简易的时钟。时钟本身不复杂,没有使用图片进行美化,下面就与大家分享一下具体的代码:
这是最终实现的效果:

部分的启发点来自于 http://developer.51cto.com/art/201503/467645.htm
html代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Clock</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.canvas{
margin-left: 20px;
margin-top: 20px;
}
</style>
</head>
<body onload="main()">
<canvas class = "canvas" id="canvasId" width = '400' height = '400'></canvas>
</body>
js代码:
var Clockbox = function(obj,width,height){
this.o = {
'dates':[], //时间
'obj':obj, //canvas对象
'width':width, //canvas宽度
'height':height, //canvas高度
'obj2d':obj.getContext('2d'), //2d对象
'wcolor':'#000000', //线条颜色
'scalewidth':30, //刻度长度
'msradius':(1/30)*Math.PI, //分秒的弧度
'hsradius':(1/6)*Math.PI, //时的弧度
'hourHandLength' : (width/5), /*时针长度*/
'minHandLength':(width/6*1.8), /*分针长度*/
'secHandLength':(width/20*8), /*秒针长度*/
'fontsize':30 //数字大小
}
var _this = this;
this.infn();
setInterval(function(){
_this.o.obj2d.translate(-_this.o.width/2,-_this.o.height/2);
_this.o.obj2d.clearRect(0,0,_this.o.width,_this.o.height);
_this.infn();
},1000)
}
Clockbox.prototype = {
infn:function(){
//表盘
var obj2d = this.o.obj2d;
var dates = new Date();
this.o.dates = [dates.getHours(),dates.getMinutes(),dates.getSeconds()];
//绘制
obj2d.beginPath();
obj2d.arc(this.o.width/2,this.o.height/2,this.o.width/2,0,2*Math.PI,false);
obj2d.strokeStyle = this.o.wcolor;
obj2d.stroke();
//刻度
this.scalefn(obj2d);
//时针
this.hour(obj2d);
//分针
this.minute(obj2d);
//秒针
this.sec(obj2d);
},
//绘制刻度和指针
scalefn:function(obj2d){
obj2d.translate(this.o.width/2,this.o.height/2);
for(var i = 0;i<12;i++){
obj2d.moveTo(this.o.width/2-this.o.scalewidth, 0);
obj2d.lineTo(this.o.width/2, 0);
obj2d.rotate(this.o.hsradius);
}
obj2d.font = "bold "+this.o.fontsize+"px impack";
obj2d.textAlign = "center";
obj2d.fillStyle = "#ff9000";
obj2d.fillText("12",0,-((this.o.width/2)-(this.o.scalewidth*2+10)));
obj2d.fillText("3",((this.o.width/2)-(this.o.scalewidth*2)),this.o.fontsize/3);
obj2d.fillText("6",0,((this.o.width/2)-(this.o.scalewidth*2)));
obj2d.fillText("9",-((this.o.width/2)-(this.o.scalewidth*2)),this.o.fontsize/3);
obj2d.stroke();
obj2d.restore();
},
//时针
hour:function(obj2d){
obj2d.save();
obj2d.rotate(this.o.hsradius*Number(this.o.dates[0]));
obj2d.moveTo(0,0);
obj2d.lineTo(0,-this.o.hourHandLength);
obj2d.stroke();
obj2d.restore();
},
//分针
minute:function(obj2d){
obj2d.save();
obj2d.rotate(this.o.msradius*Number(this.o.dates[1]));
obj2d.beginPath();
obj2d.moveTo(0,0);
obj2d.lineTo(0,-this.o.minHandLength);
obj2d.stroke();
obj2d.restore();
},
//秒针
sec:function(obj2d){
obj2d.save();
obj2d.rotate(this.o.msradius*Number(this.o.dates[2]));
obj2d.beginPath();
obj2d.moveTo(0,0);
obj2d.lineTo(0,-this.o.secHandLength);
obj2d.stroke();
obj2d.restore();
}
}
function main(){
var can = document.getElementById('canvasId');
var Clock = new Clockbox(can,400,400);
}
js代码详解:
1.首先这里使用了面向对象的形式
2.这里为了方便更改大小,传入了3个参数 obj,width,height,分别表示canvas元素 以及它的宽度和高度,表盘的半径是宽的二分之一
3. 因为1小时有60分钟 所以每一个分钟单元格应该有的弧度就是(1/(60/2))*Math.PI,小时同理
4. 依据现在的时间 用 .rotate()方法对指针做角度控制 12点的时针的弧度就是 一个小时的弧度*12
5.最后每秒不断的清除画布 重构 就形成了一个动态的时钟
遇到的问题:
translate() 在画完之后 canvas的原点并不在左上角了 ..... 最后在定时器重新设定解决了这个问题
通过Canvas + JS 实现简易时钟实战的更多相关文章
- 用canvas绘制一个简易时钟
在见识了html5中canvas的强大,笔者准备制作一个简易时钟. 下面就是成果啦,制作之前我们先分析一下,绘制一个时钟需要做哪些准备. 一 . 1.首先这个时钟分为表盘,指针(时针,分针,秒针)和数 ...
- [ZZ+CH] Html5 canvas+js 时钟
总之新Blog入驻以后,又开始老习惯,到处折腾自定义的空间,放些东西. 想起以前大一的时候做过一个Javascript的时间显示器,现在想做一个时钟,当然现在老奸巨猾,会先去看一看有前辈写过没. 前辈 ...
- canvas.js | CLiPS
canvas.js | CLiPS canvas.js The canvas.js module is a simple and robust JavaScript API for the HTML5 ...
- [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab)
前言 [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab) 在上一篇中,中间的tab 区块无法自动伸展的原因一句话说就是: 使用contentEL的方式,相关HTML元素不会参与组 ...
- html5 canvas+js实现ps钢笔抠图
html5 canvas+js实现ps钢笔抠图 1. 项目要求需要用js实现photoshop中钢笔抠图功能,就用了近三四天的时间去解决它,最终还是基本上把他实现了. 做的过程中走了不少弯路,最终一同 ...
- 使用Node.js实现简易MVC框架
在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...
- js动态数字时钟
js动态数字时钟 主要用到知识点: 主要是通过数组的一些方法,如:Array.from() Array.reduce() Array.find() 时间的处理和渲染 js用到面向对象的写法 实现的功能 ...
- [转] 使用Node.js实现简易MVC框架
在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...
- 原生JS实现简易轮播图
原生JS实现简易轮播图(渐变?) 最近做网页总是会用到轮播图,我就把之前写的轮播图单独拿出来吧,如果有...如果真的有人也需要也可以复制去用用啊..哈~.. window.onload = funct ...
随机推荐
- 简单明了区分escape、encodeURI和encodeURIComponent
一.前言 讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种 ...
- 多线程中的锁系统(二)-volatile、Interlocked、ReaderWriterLockSlim
上章主要讲排他锁的直接使用方式.但实际当中全部都用锁又太浪费了,或者排他锁粒度太大了,本篇主要介绍下升级锁和原子操作. 阅读目录 volatile Interlocked ReaderWriterLo ...
- 配置NHibernate将枚举保存为Oracle数据库中的字符串
假设有这样一个枚举: /// <summary> /// 字典项类型 /// </summary> public enum DicItemType { [EnumDescrip ...
- 如何使用Worktile进行敏捷项目开发管理
Worktile在任务管理上采用了看板视图,非常适合进行敏捷项目开发管理.事实上,在开发Worktile的过程中,我们也是自产自销,使用Worktile管理Worktile本身的开发过程,在本文中跟大 ...
- JavaScript学习笔记之Object
对象(object)是JavaScript的核心概念,也是最重要的数据类型.JavaScript的所有数据都可以被视为对象. 简单说,所谓对象,就是一种无序的数据集合,由若干个“键值对”(key-va ...
- 每天一个linux命令(23):Linux 目录结构
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
- 《第一本docker书》—— 读后总结
关于docker 这本书其实并没有读完,只不过最近工作比较繁忙,也无心再看这些用不到的书.以后要是工作需要,再仔细学习吧. 这次的阅读算是达到目的了,对docker有了一定的了解.它的作用.意义以及大 ...
- java IO流 之 字符流
字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...
- react9 生命周期
<body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ...
- 【WP开发】加密篇:单向加密
单向加密,简单地说就是对数据进行哈希处理,平时我们见得较多的有MD5.SHA1等,都属于单向加密.上一篇文章中,老周跟大家扯了有关双向加密的事,本文咱们就扯一下单向加密吧. 要对数据进行哈希处理也不是 ...