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 迁移目录
Dec 18 Javascript
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
Jan 11 Javascript
JavaScript获得表单target属性的方法
Apr 02 Javascript
jquery简单插件制作(fn.extend)完整实例
May 24 Javascript
js实现点击图片自动提交action的简单方法
Oct 16 Javascript
angularJs中datatable实现代码
Jun 03 Javascript
vue 1.0 结合animate.css定义动画效果
Jul 11 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
Oct 12 Javascript
layui type2 通过url给iframe子页面传值的例子
Sep 06 Javascript
vue实现在线翻译功能
Sep 27 Javascript
vue el-table实现行内编辑功能
Dec 11 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
May 10 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
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
php轻松实现文件上传功能
2016/03/03 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
[46:23]OG vs EG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
Python异常处理知识点总结
2019/02/18 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
python config文件的读写操作示例
2019/09/27 Python
python2 对excel表格操作完整示例
2020/02/23 Python
python退出循环的方法
2020/06/18 Python
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
MaBelle玛贝尔香港官网:香港钻饰连锁店
2019/09/09 全球购物
大队委竞选演讲稿
2014/04/28 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
优秀党员申报材料
2014/12/18 职场文书
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers