首先来看看效果

思路

利用计时器实时完成页面数据更新,计时器间隔为1000毫秒也就是1s的时间,同时利用

canvas.width = canvas.width 来删除之前的画布数据从而达到秒针不停走的动画效果。

步骤

1.进行画布设置(准备工作,同时deg表示角度换算,在后面运算在直接输入角度即可)

bin里面的东西是时钟的位置以及半径

<style>canvas {display: block;margin: 0 auto;border: 1px solid red;}</style><canvas></canvas><script>let canvas = document.querySelector("canvas")canvas.height = 550;canvas.width = 800;let ctx = canvas.getContext("2d");let deg = Math.PI / 180let bin = {x: 400,y: 300,r: 200,}

设置画布的大体轮廓

2.进行时钟轮廓绘制

//轮廓ctx.beginPath();ctx.arc(400, 300, 200, 0, 360 * deg, false);ctx.stroke();

3.完成大刻度绘制并添加数字

通过for循环将数组arr中的数逐个放入表盘中(12个刻度瓜分圆,所以每个刻度间隔为30度)

qs.为什么第一个数为3而不是1?

是因为圆的绘制是从大概3点钟的位置开始的(如果想数组从1开始的话可以在划线的每个角度基础上减去90度)

//大刻度let arr = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2]for (let i = 0; i < 12; i++) {ctx.beginPath();ctx.moveTo(bin.x + (bin.r - 20) * Math.cos(30 * i * deg), bin.y + (bin.r - 20) * Math.sin(30 * i * deg));ctx.lineTo(bin.x + bin.r * Math.cos(30 * i * deg), bin.y + bin.r * Math.sin(30 * i * deg));ctx.fillText(arr[i], bin.x + (bin.r - 30) * Math.cos(30 * i * deg), bin.y + (bin.r - 30) * Math.sin(30 * i * deg))//数字部分ctx.stroke();}

4.小刻度绘制

同样利用for循环 完成(60个刻度瓜分圆,所以每个刻度间隔为6度)

 for (let i = 0; i < 60; i++) {ctx.beginPath();ctx.moveTo(bin.x + (bin.r - 10) * Math.cos(6 * i * deg), bin.y + (bin.r - 10) * Math.sin(6 * i * deg));ctx.lineTo(bin.x + bin.r * Math.cos(6 * i * deg), bin.y + bin.r * Math.sin(6 * i * deg));ctx.stroke();

5.绘制时针,分针,秒针,

 let hourL = 100;let minL = 120;let secL = 150;

6.通过本地时间获取当前的时间(不换算,直接拿来用就行了)

 //从系统获取时间time = new Date();hour = time.getHours();min = time.getMinutes();sec = time.getSeconds();

7.把时间数据换算成角度导入(时针由于12个刻度,每个刻度间隔30度;分针、秒针由于60个刻度,每个刻度间隔6度)

//秒(每次6度,因为有60个刻度分360度)ctx.beginPath();//这个可加可不加ctx.moveTo(bin.x, bin.y);ctx.lineTo(bin.x + secL * Math.cos(270 * deg + 6 * sec * deg), bin.y + secL * Math.sin(270 * deg + 6 * sec * deg));ctx.stroke();//分(每次6度,因为有60个刻度分360度)ctx.beginPath();ctx.moveTo(bin.x, bin.y);ctx.lineTo(bin.x + minL * Math.cos(270 * deg + 6 * min * deg), bin.y + minL * Math.sin(270 * deg + 6 * min * deg));ctx.stroke();//时(每次30度)ctx.beginPath();ctx.moveTo(bin.x, bin.y);ctx.lineTo(bin.x + hourL * Math.cos(270 * deg + 6 * hour * deg), bin.y + hourL * Math.sin(270 * deg + 30 * hour * deg));ctx.stroke();

8.别忘了清理画布和设置1000毫秒全局定时器(如果不设定时器挂钟不会走,如果不清理画布所有图像会随时间无限叠加)

canvas.width = canvas.width

代码完整版

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>canvas {display: block;margin: 0 auto;border: 1px solid red;}</style>
</head><body><canvas></canvas><script>let canvas = document.querySelector("canvas")canvas.height = 550;canvas.width = 800;let ctx = canvas.getContext("2d");let deg = Math.PI / 180let bin = {x: 400,y: 300,r: 200,}setInterval(() => {canvas.width = canvas.width//轮廓ctx.beginPath();ctx.arc(400, 300, 200, 0, 360 * deg, false);ctx.stroke();//刻度ctx.beginPath();//大刻度let arr = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2]for (let i = 0; i < 12; i++) {ctx.beginPath();ctx.moveTo(bin.x + (bin.r - 20) * Math.cos(30 * i * deg), bin.y + (bin.r - 20) * Math.sin(30 * i * deg));ctx.lineTo(bin.x + bin.r * Math.cos(30 * i * deg), bin.y + bin.r * Math.sin(30 * i * deg));ctx.fillText(arr[i], bin.x + (bin.r - 30) * Math.cos(30 * i * deg), bin.y + (bin.r - 30) * Math.sin(30 * i * deg))//数字部分ctx.stroke();}//小刻度for (let i = 0; i < 60; i++) {ctx.beginPath();ctx.moveTo(bin.x + (bin.r - 10) * Math.cos(6 * i * deg), bin.y + (bin.r - 10) * Math.sin(6 * i * deg));ctx.lineTo(bin.x + bin.r * Math.cos(6 * i * deg), bin.y + bin.r * Math.sin(6 * i * deg));ctx.stroke();}let hourL = 100;let minL = 120;let secL = 150;//从系统获取时间time = new Date();hour = time.getHours();min = time.getMinutes();sec = time.getSeconds();//秒(每次6度,因为有60个刻度分360度)ctx.beginPath();//这个可加可不加ctx.moveTo(bin.x, bin.y);ctx.lineTo(bin.x + secL * Math.cos(270 * deg + 6 * sec * deg), bin.y + secL * Math.sin(270 * deg + 6 * sec * deg));ctx.stroke();//分(每次6度,因为有60个刻度分360度)ctx.beginPath();ctx.moveTo(bin.x, bin.y);ctx.lineTo(bin.x + minL * Math.cos(270 * deg + 6 * min * deg), bin.y + minL * Math.sin(270 * deg + 6 * min * deg));ctx.stroke();//时(每次30度)ctx.beginPath();ctx.moveTo(bin.x, bin.y);ctx.lineTo(bin.x + hourL * Math.cos(270 * deg + 6 * hour * deg), bin.y + hourL * Math.sin(270 * deg + 30 * hour * deg));ctx.stroke();}, 1000)</script><script></script></body></html>

JS利用canvas画布功能画时钟相关推荐

  1. 利用canvas画布和rotate()方法让画的图形旋转起来

    上一篇讲了利用canvas画布画太极图,这一篇说的是让太极图旋转起来. **思路:**利用HTML DOM 的setInterval()方法,它会按照指定的周期来调用函数或计算表达式.再利用画布的ro ...

  2. s时钟画布 android,Canvas画布实现自定义时钟效果

    标题 *{margin:0; padding:0; list-style:none;} .box{ width: 420px; height: 420px; margin: 50px auto 0; ...

  3. 前端|利用canvas画布制作地球轨道

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 一.什么是<canvas> <canvas& ...

  4. 教你如何利用canvas画布绘制哆啦A梦

    教你如何利用canvas画布绘制哆啦A梦 最近一直在练习使用canvas画布标签,今天教大家如何使用canvas画布绘制哆啦A梦.如图: HTML代码: <canvas id="my_ ...

  5. vue.js 利用canvas绘制仪表盘圆环进度条-带动画

    vue.js 利用canvas绘制简易仪表盘进度条 html代码 因为动画效果比较消耗性能,所以进度条单独canvas绘制 <template><div class="ci ...

  6. Chart.js清空canvas画布 clearRect()等canvas方法擦除失败(附完整代码)

    Chart.js清空canvas画布 clearRect等canvas方法擦除失败 一.直接移除DOM对象方式 原因 方法 二.完整代码 html javascript chart.js画图方法 三. ...

  7. LV2之-----canvas 画布实现 自转时钟 大转盘

    canvas 画布运用实例:1.系统时钟 <!DOCTYPE html> <html lang="en"><head><meta char ...

  8. html5 canvas图表,Chart.js基于Canvas画布的HTML5统计图表库 - 资源分享

    Chart.js 是一个简单.面向对象.为设计者和开发者准备的图表绘制工具库.可以绘制柱状图.热点图.曲线图等,使用HTML5中的Canvas画布,支持原生的和jQuery的调用方法. 特点 6种图表 ...

  9. js 利用canvas转换图片格式并下载图片

    1.利用canvas转换格式 思路很简单,就是在canvas上drawImage,然后再把canvas转换成想要的图片格式 convertImageToCanvas = (image) => { ...

  10. 利用canvas画布画哆啦A梦

    简易版哆啦A梦源代码: <!DOCTYPE html> <html><head><title>哆啦A梦</title><meta ch ...

最新文章

  1. android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键
  2. UML建模之活动图介绍
  3. java筑基期(9)----ajaxjson(1)
  4. 在linux下搭建jira+svn[原创]
  5. mobsdk线上崩溃事故报告_重大事故!IO问题引发线上20台机器同时崩溃
  6. rax+react hook 实现分页效果
  7. 【opencv学习】光流算法以及物体追踪算法(Lucas-Kanade算法)
  8. 2019年,北大毕业生都去哪儿了?
  9. IIC 差异电平传输 和 IIC 地址
  10. tensorflow 根据节点获取节点前的整张图
  11. 12505 java_Java jdbc Oracle error: ORA 12505
  12. 集合框架(数据结构之栈和队列)
  13. 台式计算机读取不了移动硬盘,电脑识别不了硬盘的原因
  14. 计算机网络第七版第一章答案
  15. noip2016海港(超级详细)
  16. 手机php文件怎么改后辍,手机百度云盘修改文件后缀名的方法
  17. LODOP打印控件使用问题总结
  18. eclipse SVN A conflict in the working copy obstructs the current operation
  19. 进行范围查找的折半查找法
  20. halcon中面到面的距离_halcon学习网

热门文章

  1. 模拟电子技术基础笔记
  2. 服务器dell/hp/ibm硬件检测工具
  3. 美图秀秀java代码,【Java】SpringMvc整合美图秀秀M4(头像编辑器)
  4. Python经典编程习题100例,供初学者学习
  5. 医院药品管理系统源码 HIS系统源码
  6. 清华计算机系超算团队,清华大学学生超算团队
  7. python敏感字替换_python实现敏感词过滤的几种方法
  8. eprime2.0 倒计时功能
  9. Goby内测版和AWVS14最新版联合教程详细说明
  10. 艾肯MICU声卡安装调试教程