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 相关文章推荐
ExtJS Store的数据访问与更新问题
Apr 28 Javascript
解决Extjs上传图片无法预览的解决方法
Mar 22 Javascript
js实现广告漂浮效果的小例子
Jul 02 Javascript
offsetHeight在OnLoad中获取为0的现象
Jul 22 Javascript
将文本输入框内容加入表中的js代码
Aug 18 Javascript
jQuery固定元素插件scrolltofixed使用指南
Apr 21 Javascript
详解js实现线段交点的三种算法
Aug 09 Javascript
关于jquery form表单序列化的注意事项详解
Aug 01 jQuery
Vue实现web分页组件详解
Nov 28 Javascript
Vue中&quot;This dependency was not found&quot;问题的解决方法
Jun 19 Javascript
对angularJs中2种自定义服务的实例讲解
Sep 30 Javascript
javascript将扁平的数据转为树形结构的高效率算法
Feb 27 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
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
JQuery动画和停止动画实例代码
2013/03/01 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
JS实现简易留言板增删功能
2020/02/08 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
python创建和删除目录的方法
2015/04/29 Python
Python3模拟登录操作实例分析
2019/03/12 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
python实现图片转字符画
2021/02/19 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
大学生暑假实习总结
2015/07/13 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
课题研究阶段性总结
2015/08/13 职场文书
开学随笔
2015/08/15 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
一小时学会TensorFlow2之基本操作2实例代码
2021/09/04 Python
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫