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 相关文章推荐
jQuery中nextAll()方法用法实例
Jan 07 Javascript
jquery ui resize 中border-box的bug修正
Apr 26 Javascript
js+canvas简单绘制圆圈的方法
Jan 28 Javascript
AngularJS中的过滤器filter用法完全解析
Apr 22 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
Jun 20 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
Mar 25 Javascript
JavaScript基础进阶之数组方法总结(推荐)
Sep 04 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
Mar 25 jQuery
基于vue-element组件实现音乐播放器功能
May 06 Javascript
用node开发并发布一个cli工具的方法步骤
Jan 03 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
Feb 27 Javascript
小程序分享链接onShareAppMessage的具体用法
May 22 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
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
smarty简单应用实例
2015/11/03 PHP
PHP进程通信基础之信号
2017/02/19 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
小程序实现密码输入框
2020/11/16 Javascript
Python中的Descriptor描述符学习教程
2016/06/02 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
SpringBoot首页设置解析(推荐)
2021/02/11 Python
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
国际商务专业学生个人的自我评价
2013/09/28 职场文书
求职者应聘的自我评价
2013/10/16 职场文书
业务副厂长岗位职责
2014/01/03 职场文书
协议书样本
2014/04/23 职场文书
岗位职责说明书
2014/05/07 职场文书
大学生党员承诺书
2014/05/20 职场文书
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
Python字符串的转义字符
2022/04/07 Python