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 相关文章推荐
js资料toString 方法
Mar 13 Javascript
浏览器解析js生成的html出现样式问题的解决方法
Apr 16 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
Feb 05 Javascript
jquery预加载图片的方法
May 27 Javascript
javascript实现状态栏中文字动态显示的方法
Oct 20 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
Mar 03 Javascript
详解AngularJS 模态对话框
Apr 07 Javascript
AngularJs Dependency Injection(DI,依赖注入)
Sep 02 Javascript
JS实现的数字格式化功能示例
Feb 10 Javascript
JavaScript函数表达式详解及实例
May 05 Javascript
js中int和string数据类型互相转化实例
Jan 16 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
Aug 18 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
php smarty的预保留变量总结
2008/12/04 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
jquery validate demo 基础
2015/10/29 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
angular5 httpclient的示例实战
2018/03/12 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
python flask实现分页的示例代码
2018/08/02 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
英国医生在线预约:Top Doctors
2019/10/30 全球购物
水污染治理工程专业自荐信
2014/06/21 职场文书
信用卡工资证明范本
2014/10/17 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
大学生个人学习总结
2015/02/15 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
Python序列化模块JSON与Pickle
2022/06/05 Python
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js