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实现二分查找法实现代码
Nov 12 Javascript
Exjs 入门篇
Apr 07 Javascript
最佳JS代码编写的14条技巧
Jan 09 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
Nov 05 Javascript
解析jquery获取父窗口的元素
Jun 26 Javascript
freemarker判断对象是否为空的方法
Aug 13 Javascript
jQuery Dialog对话框事件用法实例分析
May 10 Javascript
JS动态给对象添加事件的简单方法
Jul 19 Javascript
Sortable.js拖拽排序使用方法解析
Nov 04 Javascript
AngularJS之自定义服务详解(factory、service、provider)
Apr 14 Javascript
vue数据响应式原理知识点总结
Feb 16 Javascript
vue Element-ui表格实现树形结构表格
Jun 07 Vue.js
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
PHP编程与应用
2006/10/09 PHP
微信支付开发维权通知实例
2016/07/12 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
Angular进行简单单元测试的实现方法实例
2020/08/16 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
Python运算符重载详解及实例代码
2017/03/07 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
python matplotlib拟合直线的实现
2019/11/19 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
苹果Mac升级:MacSales.com
2017/11/20 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
自我鉴定怎么写
2013/12/05 职场文书
企业文化标语口号
2014/06/09 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
六一活动主持词
2015/06/30 职场文书
病假条格式范文
2015/08/17 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
Javascript设计模式之原型模式详细
2021/10/05 Javascript
关于JavaScript轮播图的实现
2021/11/20 Javascript