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 相关文章推荐
兼容多浏览器的字幕特效Marquee的通用js类
Jul 20 Javascript
基于JavaScript 下namespace 功能的简单分析
Jul 05 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
Feb 16 Javascript
简单理解vue中track-by属性
Oct 26 Javascript
Vue自定义指令介绍(2)
Dec 08 Javascript
javascript数据类型详解
Feb 07 Javascript
详解Vue中过度动画效果应用
May 25 Javascript
JS中Safari浏览器中的Date
Jul 17 Javascript
JS实现按钮颜色切换效果
Sep 05 Javascript
基于Vue渲染与插件的加载顺序的问题详解
Mar 05 Javascript
JavaScript中七种流行的开源机器学习框架
Oct 11 Javascript
react 中父组件与子组件双向绑定问题
May 20 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 设计模式之 工厂模式
2008/12/19 PHP
php静态文件生成类实例分析
2015/01/03 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
完整显示当前日期和时间的JS代码
2007/09/17 Javascript
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
JavaScript Sort 表格排序
2009/10/31 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
javascript 单例/单体模式(Singleton)
2011/04/07 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
javascript 正则表达式去空行方法
2017/01/24 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
python实现文件分组复制到不同目录的例子
2014/06/04 Python
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
高中考试作弊检讨书
2014/01/14 职场文书
《金子》教学反思
2014/04/13 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
python之基数排序的实现
2021/07/26 Python