什么是canvas

canvas 是html5 新增的一个利用js脚本绘制位图的标签,canvas 标签作为画布,本身不具有绘图的能力,而是依赖其对应的上下文对象【利用getContext()方法取得,以下简称‘canvas对象’】的一组API来实现。

canvas的应用场景

canvas 对象常用于图标绘制,小游戏,活动页面,小特效等。

时钟特效

实现过程可以分为三个步骤:绘制钟面,绘制指针指向,利用setInterval()循环调用绘制方法.

1.绘制钟面 :通过moveTo()方法,指定路径的起点,再利用arc()方法分别绘制度数为6和30的弧,再循环绘制,绘制出钟面

2.绘制指针指向:创建一个时间对象,求出当前时间的时、分、秒,再利用moveTo与arc()方法绘制指针【注意:arc中当起始弧度与结束弧度相同时,可以绘制直线】

3.setInterval()循环调用:设置间隔时间为1秒,循环绘制图像

运行效果如下:

绘制的步骤如下所示:

1.创建一个canvas标签,此标签本身并没有绘图功能,但它是绘图的容器。代码如下所示:

<canvas id="clock" width="500" height="500"></canvas>

2.绘制代码:

我们的目标是,提供一个独立的时钟绘制功能,即提供一个Clock的类,通过new创建一个时钟实例,就可以绘制一个完整的时钟表盘。例如:

var clock = new Clock("clock", 200);  //"clock"是canvas的id, 200是整个表盘的大小,后面的指钟刻度均以此值自行调整
clock.start();  //开始绘制

Clock类的定义如下:

function Clock(canvasId, size) {var canvas = document.getElementById(canvasId); //获取canvas对象var imgData = null;    //用于保存绘制好的表盘刻度var context = null;    //保存context绘图对象var radius = size / 2; //钟表的半径this.start = function () {if (canvas.getContext) {  //测试是否支持绘图init();               //绘制表盘drawPointers();       //立刻绘制指针  setInterval(drawPointers, 10);  //每隔10毫秒绘制一次指针} else {console.log("浏览器不支持canvas绘图");}};//....其它方法
}

init方法,绘制表盘刻度,代码如下:

function init() {context = canvas.getContext("2d");//绘制60个刻度for (var i = 0; i < 60; i++) {var arc = i * 6 / 360 * 2 * Math.PI;var lineWidth = "1";var length = size * 0.01;if (i % 5 == 0) {  //其中每隔5个刻度,刻度线条要粗一个像素lineWidth = "2";length = size * 0.02;}context.beginPath();context.lineWidth = lineWidth;context.moveTo(Math.cos(arc) * (radius - length) + radius, Math.sin(arc) * (radius - length) + radius);context.lineTo(Math.cos(arc) * radius + radius, Math.sin(arc) * radius + radius);context.stroke();}//将绘制好的表盘保存起来imgData = context.getImageData(0, 0, size, size);
}

drawPointers方法,同时绘制时钟、分钟和秒针:

function drawPointers() {context.putImageData(imgData, 0, 0); //恢复表盘数据到当前canvas,即覆盖掉上一次绘制的指针var ms = getDateByMilliseconds();    //获取以毫秒为单位的当前时间var configs = [{ p: 60000, width: "1", style: "rgba(0,0,255)", length: radius * 0.8 },{ p: 60000 * 60, width: "2", style: "rgba(100,0,255)", length: radius * 0.6 },{ p: 1000 * 60 * 60 * 12, width: "4", style: "rgba(100,200,255)", length: radius * 0.5 },];configs.forEach(function (c) {var sArc = (ms / c.p) * 2 * Math.PI - Math.PI / 2;context.beginPath();context.lineWidth = c.width;context.moveTo(radius, radius);context.lineTo(Math.cos(sArc) * c.length + radius, Math.sin(sArc) * c.length + radius);context.strokeStyle = c.style;context.stroke();});
}

getDateByMilliseconds,返回以毫秒为单为的当前时间:

function getDateByMilliseconds() {var now = new Date();var hours = now.getHours() * 3600 * 1000;var minutes = now.getMinutes() * 60 * 1000;var seconds = now.getSeconds() * 1000;return hours + minutes + seconds + now.getMilliseconds();
}

最后附上完整的代码:

function Clock(canvasId, size) {var canvas = document.getElementById(canvasId);var imgData = null;var context = null;var radius = size / 2;this.start = function () {if (canvas.getContext) {init();drawPointers();setInterval(drawPointers, 10);} else {console.log("浏览器不支持canvas绘图");}};function init() {context = canvas.getContext("2d");for (var i = 0; i < 60; i++) {var arc = i * 6 / 360 * 2 * Math.PI;var lineWidth = "1";var length = size * 0.01;if (i % 5 == 0) {lineWidth = "2";length = size * 0.02;}context.beginPath();context.lineWidth = lineWidth;context.moveTo(Math.cos(arc) * (radius - length) + radius, Math.sin(arc) * (radius - length) + radius);context.lineTo(Math.cos(arc) * radius + radius, Math.sin(arc) * radius + radius);context.stroke();}imgData = context.getImageData(0, 0, size, size);}function drawPointers() {context.putImageData(imgData, 0, 0);var ms = getDateByMilliseconds();var configs = [{ p: 60000, width: "1", style: "rgba(0,0,255)", length: radius * 0.8 },{ p: 60000 * 60, width: "2", style: "rgba(100,0,255)", length: radius * 0.6 },{ p: 1000 * 60 * 60 * 12, width: "4", style: "rgba(100,200,255)", length: radius * 0.5 },];configs.forEach(function (c) {var sArc = (ms / c.p) * 2 * Math.PI - Math.PI / 2;context.beginPath();context.lineWidth = c.width;context.moveTo(radius, radius);context.lineTo(Math.cos(sArc) * c.length + radius, Math.sin(sArc) * c.length + radius);context.strokeStyle = c.style;context.stroke();});}function getDateByMilliseconds() {var now = new Date();var hours = now.getHours() * 3600 * 1000;var minutes = now.getMinutes() * 60 * 1000;var seconds = now.getSeconds() * 1000;return hours + minutes + seconds + now.getMilliseconds();}
}var clock = new Clock("clock", 200);
clock.start();

使用Canvas HTML5画出时钟相关推荐

  1. html5 canvas 画阿迪达斯logo,canvas绘图画出了的美团LOGO

    接下来是用HTML新标签canvas绘图画出了的美团LOGO. canvas练习 var canvas=document.getElementById('myfirstcanvas'); canvas ...

  2. 使用JavaScript在Canvas上画出一片星空

    随着Html5的迅猛发展,画布也变得越来越重要.下面我就写一个关于在canvas上画出一片星空的简单的代码的示例. 理论基础 初始化一个canvas,获得一个用于绘制图形的上下文环境context.并 ...

  3. 利用html5画出五角星画出星空

    利用html5画出五角星 (在慕课网学习<canvas>标签后代码总结) 五角星的格定点坐标该如何定位?原理图如下: 源代码: <!DOCTYPE HTML> <html ...

  4. 运用html画一个三角形,利用css或html5画出一个三角形的方法

    利用css或html5画出一个三角形的方法 发布时间:2020-09-14 14:49:22 来源:亿速云 阅读:83 作者:小新 这篇文章主要介绍利用css或html5画出一个三角形的方法,文中介绍 ...

  5. html5之太阳地球月球,使用html5画出地球月球和太阳之间的环绕关系

    本文主要是描述了使用html5画出地球月球和太阳之间的环绕关系,其实他们比较简单,主要是通过旋转来控制各个之间的环绕关系!~ 输入代码,里面有注释: ------------------------- ...

  6. php绘制一个三角形,如何利用css或html5画出一个三角形?两种不同的制作三角形方法(代码实例)...

    我们在平时的前端开发的时候,有时候是需要一些小图形来丰富一下页面效果,比如:下拉列表的倒三角图形.那么这样的一个三角形是如何制作出来的,本章给大家介绍如何利用css或html画出一个三角形?两种不同的 ...

  7. h5画三角形_如何利用css或html5画出一个三角形?两种不同的制作三角形方法(代码实例)...

    我们在平时的前端开发的时候,有时候是需要一些小图形来丰富一下页面效果,比如:下拉列表的倒三角图形.那么这样的一个三角形是如何制作出来的,本章给大家介绍如何利用css或html画出一个三角形?两种不同的 ...

  8. 万花筒写轮眼画法_纯canvas来画出斑的万花筒写轮眼

    主要注意的问题: 1,先进行定位,用三角形的角点来定写轮眼的坐标, 2,用二次贝塞尔曲线来画出曲线和弧度. 3,要注意覆盖方面的问题:颜色覆盖,图形覆盖这些问题! 代码如下: (浏览器:火狐,360, ...

  9. html a标签指定区域,第四讲:使用html5中的canvas标签画出一个球在指定区域内的运动...

    小球在一个区域运动 var canvas = document.getElementById('mc'); var cxt = canvas.getContext('2d'); //定义一个小球 va ...

最新文章

  1. 2年Java面试提问总结
  2. RSGAN:对抗模型中的“图灵测试”思想
  3. LL1分析构造法_16条数学得分法,想提分快来看!
  4. 【报告分享】2020“后浪”消费图鉴.pdf(附下载链接)
  5. retrofitWrap
  6. Soft Bellman Equation and Soft Value Iteration证明
  7. 微信宣布:被禁 8 年的限制解除了!
  8. DSP 程序远程升级 / Bootloader设计指南(五)—— FLASH擦写操作
  9. arm触摸屏的头文件_ARM触屏校准程序
  10. 【场景实现】Vue+element如何让帖子评论带上emoji,这个需求让我在富文本Quill开始了踩坑连连看
  11. php程序的运行方法
  12. fastboot使用
  13. chrome浏览器的性能测试--本文引用自 百度百科http://baike.baidu.com/view/1835504.htm
  14. 计算风险指标:最大回撤、计算风险收益指标:夏普比率、利用最大回撤和夏普比筛选基金、比较3只股票的夏普指数
  15. 2018年天津大学夏令营机试第一题
  16. android 自动化 微信,C#手把手教你玩微信自动化
  17. iOS常见问题笔记总结这是本人开发中遇见的一些常见问题处理方法的总结笔记,包括http访问配置、Alcatraz插件安装、最新cocoapod安装、真机运行出错等许多与参考笔记总结,希望对大家有所帮助
  18. 添加2本书 JavaScript Patterns、Developing JavaScript Web Applications
  19. 网站友链交换十个标准
  20. 男孩子取名起名字:无私慷慨 拼搏自强的男孩名字

热门文章

  1. gotoxy()的用法.
  2. 忆享聚焦|全球云计算市场份额、数字虚拟人、“元宇宙”实体店……近期行业热点速览
  3. 李开复:创业开始别想太高 年轻人多看国外网站
  4. make命令 makefile文件
  5. DSP模型中FM FFM模型
  6. Java中的请求域(Request)《笔记》
  7. 免费计算机论文 阅读,关于计算机的毕业论文
  8. 修改数据库编码格式UTF-8
  9. mysql中删除数据库语句
  10. liunx下判断c语言是否挂载U盘