javascript+HTML5 canvas绘制时钟功能示例


Posted in Javascript onMay 15, 2019

本文实例讲述了javascript+HTML5 canvas绘制时钟功能。分享给大家供大家参考,具体如下:

效果如下:

javascript+HTML5 canvas绘制时钟功能示例

代码:

<!DOCTYPE html>
<html>
<head lang="en">
 <meta charset="UTF-8">
 <title>3water.com canvas绘制时钟</title>
 <style>
  div{text-align:center;margin-top:250px;}
 </style>
</head>
<body>
<div>
 <canvas id="clock" width="300px" height="300px"></canvas>
</div>
<script>
 var dom=document.getElementById("clock");
 var ctx=dom.getContext("2d");
 var width=ctx.canvas.width;
 var height=ctx.canvas.height;
 var r=width/2;
 var rem=width/200;
 function drawBackground(){
  ctx.save();
  ctx.translate(r,r);//重新定义圆点到中心
  ctx.beginPath();
  ctx.lineWidth=10*rem;
  ctx.arc(0,0,r-5*rem,0,Math.PI*2,false);//圆点坐标,起始角0,结束角2π,顺时针
  ctx.stroke();
  var hourNum=[3,4,5,6,7,8,9,10,11,12,1,2];//数组存小时数
  ctx.font="18px Arial";
  ctx.textAlign="center";
  ctx.textBaseline="middle";
  hourNum.forEach(function (num,i) {
   var rad=2*Math.PI/12*i;//弧度
   var x=(r-30*rem)*Math.cos(rad);
   var y=(r-30*rem)*Math.sin(rad);
   ctx.fillText(num,x,y);
  });
  for(var i=0;i<60;i++){//画圆点
   var rad=2*Math.PI/60*i;
   var x=(r-18*rem)*Math.cos(rad);
   var y=(r-18*rem)*Math.sin(rad);
   ctx.beginPath();
   if(i%5==0){
    ctx.fillStyle="#000";
    ctx.arc(x,y,2,0,Math.PI*2,false);
   }
   else{
    ctx.fillStyle="#ccc";
    ctx.arc(x,y,2,0,Math.PI*2,false);
   }
   ctx.fill();
  }
  ctx.closePath();
 }
 function drawHour(hour,minute){//时针
  ctx.save();
  ctx.beginPath();
  var rad=2*Math.PI/12*hour;
  var mrad=2*Math.PI/12/60*minute;
  ctx.rotate(rad+mrad);
  ctx.lineWidth=6*rem;
  ctx.moveTo(0,10*rem);
  ctx.lineTo(0,-r/2);
  ctx.lineCap="round";
  ctx.stroke();
  ctx.restore();
 }
 function drawMinute(minute,second){//分针
  ctx.save();
  ctx.beginPath();
  var rad=2*Math.PI/60*minute;
  var srad=2*Math.PI/60/60*second;
  ctx.rotate(rad+srad);
  ctx.lineWidth=3*rem;
  ctx.moveTo(0,10*rem);
  ctx.lineTo(0,-r+30*rem);
  ctx.lineCap="round";
  ctx.stroke();
  ctx.restore();
 }
 function drawSecond(second){//秒针
  ctx.save();
  ctx.beginPath();
  ctx.fillStyle="#c14543";
  var rad=2*Math.PI/60*second;
  ctx.rotate(rad);
  ctx.moveTo(-2*rem,20*rem);
  ctx.lineTo(2*rem,20*rem);
  ctx.lineTo(1*rem,-r+18*rem);
  ctx.lineTo(-1*rem,-r+18*rem);
  ctx.fill();
  ctx.restore();
 }
 function drawDot(){//画中心圆圈
  ctx.beginPath();
  ctx.fillStyle="#fff";
  ctx.arc(0,0,3*rem,0,2*Math.PI,false);
  ctx.fill();
 }
 function draw(){
  ctx.clearRect(0,0,width,height);
  var now=new Date();
  var hour=now.getHours();
  var minute=now.getMinutes();
  var second=now.getSeconds();
  drawBackground();//背景
  drawHour(hour,minute);//小时
  drawMinute(minute,second);//分钟
  drawSecond(second);//秒钟
  drawDot();//中心圆点
  ctx.restore();
 }
 setInterval(draw,1000);
</script>
</body>
</html>

其中的rem值是为了使canvas画布大小变化时时钟的样式能够保持

感兴趣的朋友可使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试一下运行效果。

Javascript 相关文章推荐
javascript实现的动态添加表单元素input,button等(appendChild)
Nov 24 Javascript
JavaScript的作用域和块级作用域概念理解
Sep 21 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
Jan 22 Javascript
BootStrap CSS全局样式和表格样式源码解析
Jan 20 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
Jul 06 Javascript
基于js 字符串indexof与search方法的区别(详解)
Dec 04 Javascript
vue toggle做一个点击切换class(实例讲解)
Mar 13 Javascript
jQuery的Ajax接收java返回数据方法
Aug 11 jQuery
浅谈Vue组件及组件的注册方法
Aug 24 Javascript
在微信小程序中使用vant的方法
Jun 07 Javascript
JS实现简单省市二级联动
Nov 27 Javascript
浅谈JS的二进制家族
May 09 Javascript
详解小程序用户登录状态检查与更新实例
May 15 #Javascript
基于vue如何发布一个npm包的方法步骤
May 15 #Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
May 15 #Javascript
JavaScript页面倒计时功能完整示例
May 15 #Javascript
vue组件间通信六种方式(总结篇)
May 15 #Javascript
JS正则表达式封装与使用操作示例
May 15 #Javascript
微信小程序实现授权登录
May 15 #Javascript
You might like
GreyBox技术总结(转)
2010/11/23 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
node.js中的favicon.ico请求问题处理
2014/12/15 Javascript
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
jQuery Position方法使用和兼容性
2017/08/23 jQuery
简单实现jQuery弹窗效果
2017/10/30 jQuery
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
Flask之flask-session的具体使用
2018/07/26 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
python根据文本生成词云图代码实例
2019/11/15 Python
Python多线程获取返回值代码实例
2020/02/17 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
介绍一些UNIX常用简单命令
2014/11/11 面试题
户外拓展活动方案
2014/02/11 职场文书
青春寄语大全
2014/04/09 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
小学科学教学计划
2015/01/21 职场文书
综合办公室岗位职责
2015/04/11 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
跑吧孩子观后感
2015/06/10 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang
Python实现猜拳与猜数字游戏的方法详解
2022/04/06 Python
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android