JavaScript html5 canvas绘制时钟效果


Posted in Javascript onMarch 01, 2016

本文实例讲述了JavaScript+html5 canvas绘制时钟效果。分享给大家供大家参考,具体如下:

 HTML部分:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
 <title>canvas绘图</title>
</head>
<body onload="init()">
<canvas id="canvas" width="200px" height="200px"></canvas>
</body>
</html>

JavaScript部分:

function init(){
 var canvas = document.getElementById("canvas"),
  context = canvas.getContext("2d");

 setInterval(function(){draw(canvas, context)},1000);
}
function draw(canvas, context){
 var x = canvas.width,
  y = canvas.height,
  r = Math.min(x/2, y/2);

 context.clearRect(0, 0, x, y); //清除绘画历史
 //绘画钟框
 context.fillStyle = "#f1f1f1";
 drawCircle(context, x, y, r);
 //绘画文字
 var tx = x/2,ty = y/2,tr = 0.8*r;
 context.font = "bold 12px 微软雅黑";
 context.fillStyle = "#000";
 drawText(context, "1", tx + 0.5*tr,ty - 0.866*tr);
 drawText(context, "2", tx + 0.866*tr, ty - 0.5*tr);
 drawText(context, "3", tx + tr, ty);
 drawText(context, "4", tx + 0.866*tr, ty + 0.5*tr);
 drawText(context, "5", tx + 0.5*tr, ty + 0.866*tr);
 drawText(context, "6", tx, ty + tr);
 drawText(context, "7", tx - 0.5*tr, ty + 0.866*tr);
 drawText(context, "8", tx - 0.866*tr, ty + 0.5*tr);
 drawText(context, "9", tx - tr, ty);
 drawText(context, "10", tx - 0.866*tr, ty - 0.5*tr);
 drawText(context, "11", tx - 0.5*tr, ty - 0.866*tr);
 drawText(context, "12", tx, ty - tr);
 //获取当前时间
 var date = new Date(),
  h = date.getHours(),
  m = date.getMinutes(),
  s = date.getSeconds(),
  angleH = (360/12)*Math.PI/180,
  angleM = (360/60)*Math.PI/180
 context.strokeSyle = "#000";
  //绘制时刻度
  drawScale(context, x, y, r, angleH, -0.88*r, -0.96*r, 3);
  //绘制分刻度
  drawScale(context, x, y, r, angleM, -0.93*r, -0.96*r, 1);
 //绘画时分秒针
 drawCircle(context, x, y, 3);
 drawNeedle(context, x, y, r, h*angleH + m*angleM/12, -0.5*r);
 drawNeedle(context, x, y, r, m*angleM + s*angleM/60, -0.6*r);
 drawNeedle(context, x, y, r, s*angleM, -0.75*r);

}
//绘画圆
function drawCircle(context, x, y, r){
 context.save();
 context.beginPath();
 context.arc(x/2, y/2, r, 0, Math.PI*2, 0);
 context.fill();
 context.closePath();
 context.restore();
}
//绘画文字方法
function drawText(context, text, x, y){
 context.save();
 x -= (context.measureText(text).width/2);
 y += 4;
 context.translate(x, y);
 context.fillText(text, 0, 0);
 context.restore();
}
//绘制刻度方法
function drawScale(context, x, y, r, rotate, start, end, lineWidth){
 context.save();
 context.beginPath();
 context.translate(x/2,y/2);
 context.lineWidth = lineWidth;
 for (var i = 0; i < 60; i++) { 
  context.rotate(rotate);
  context.moveTo(0, start); 
  context.lineTo(0, end);
 }
 context.closePath();
 context.stroke();
 context.restore();
}
//绘画时分秒针方法
function drawNeedle(context, x, y, r, rotate, line){
 context.save();
 context.translate(x/2,y/2);
 context.beginPath();
 context.rotate(rotate);
 context.moveTo(0, 0.1*r);
 context.lineTo(0, line);
 context.closePath();
 context.stroke();
 context.restore();
}

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript判断机器是否联网的2种方法
Aug 09 Javascript
JQuery插件开发示例代码
Nov 06 Javascript
Jquery实现遮罩层的方法
Jun 08 Javascript
JavaScript里 ==与===区别详解
Aug 16 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
Jan 04 Javascript
创建一般js对象的几种方式
Jan 19 Javascript
深入理解 JavaScript 中的 JSON
Apr 06 Javascript
Three.js的使用及绘制基础3D图形详解
Apr 27 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
Jul 18 jQuery
浅谈Koa2框架利用CORS完成跨域ajax请求
Mar 06 Javascript
React如何实现浏览器打印部分内容详析
May 19 Javascript
微信小程序实现拍照和相册选取图片
May 09 Javascript
javascript使用Promise对象实现异步编程
Mar 01 #Javascript
javascript html5实现表单验证
Mar 01 #Javascript
javascript中FOREACH数组方法使用示例
Mar 01 #Javascript
JS实现Select的option上下移动的方法
Mar 01 #Javascript
angular2使用简单介绍
Mar 01 #Javascript
JS实现的在线调色板实例(附demo源码下载)
Mar 01 #Javascript
Bootstrap每天必学之导航条(二)
Mar 01 #Javascript
You might like
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
php MYSQL 数据备份类
2009/06/19 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
php常用数组函数实例小结
2016/12/29 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
javascript写的一个链表实现代码
2009/10/25 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
python中xrange和range的区别
2014/05/13 Python
python显示生日是星期几的方法
2015/05/27 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
Python实现购物车购物小程序
2018/04/18 Python
python读写csv文件实例代码
2019/07/05 Python
django Admin文档生成器使用详解
2019/07/22 Python
python中对_init_的理解及实例解析
2019/10/11 Python
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
旅游管理毕业生自荐信
2013/11/05 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
超市工作总结范文2014
2014/12/19 职场文书
高中16字霸气押韵班级口号集锦!
2019/06/27 职场文书
MySQL创建管理HASH分区
2022/04/13 MySQL