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 For Beginners(转载)
Jan 05 Javascript
js动态给table添加/删除tr的方法
Aug 02 Javascript
jquery组件使用中遇到的问题整理及解决
Feb 21 Javascript
根据当前时间在jsp页面上显示上午或下午
Aug 18 Javascript
解决jquery实现的radio重新选中的问题
Jul 03 Javascript
浅析Bootstrap组件之面板组件
May 04 Javascript
Bootstrap carousel轮转图的使用实例详解
May 17 Javascript
JS访问DOM节点方法详解
Nov 29 Javascript
vue微信分享到朋友圈 vue微信发送给好友
Nov 28 Javascript
JS实现前端动态分页码代码实例
Jun 02 Javascript
JS实现canvas简单小画板功能
Jun 23 Javascript
基于javascript canvas实现五子棋游戏
Jul 08 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 用sock技术发送邮件的函数
2007/07/21 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
js tab效果的实现代码
2009/12/26 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
python之信息加密题目详解
2019/06/26 Python
详解python中eval函数的作用
2019/10/22 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
python 下载文件的几种方法汇总
2021/01/06 Python
Python实现疫情地图可视化
2021/02/05 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
教师学期末个人总结
2015/02/13 职场文书
公司奖励通知
2015/04/21 职场文书
基石观后感
2015/06/12 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书