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 相关文章推荐
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
Apr 07 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
Sep 14 Javascript
js data日期初始化的5种方法
Dec 29 Javascript
jQuery中:focus选择器用法实例
Dec 30 Javascript
jquery动感漂浮导航菜单代码分享
Apr 15 Javascript
jquery点击缩略图切换视频播放特效代码分享
Sep 15 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
Aug 08 Javascript
JavaScript动态绑定详解
Sep 14 Javascript
vue的常用组件操作方法应用分析
Apr 13 Javascript
学习React中ref的两个demo示例
Aug 14 Javascript
js校验开始时间和结束时间
May 26 Javascript
Vue点击切换Class变化,实现Active当前样式操作
Jul 17 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中数值计算的注意事项
2016/08/14 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
js中的布尔运算符使用介绍
2013/11/20 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
2016/11/25 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
Django的信号机制详解
2017/05/05 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
python批量爬取下载抖音视频
2019/06/17 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
幼儿园庆六一游园活动方案
2014/01/29 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
立志成才演讲稿
2014/09/04 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
数学教师个人工作总结
2015/02/06 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏