html5 canvas实际应用,Html5 Canvas入门及经典应用

Html5 Canvas入门及经典应用

时间:2019-02-15     来源:华清远见

canvas想必对于前端的工程师都不陌生了,它是 HTML5 新增的「画布」元素,是HTML5 的一大亮点,canvas翻译过来其实就是画布的意思,它可以替代flash,制作网页的很多动画效果以及游戏。渲染效率非常高,不像flash要在游览器安装flash adobe插件,canvas不需要安装任何插件即可渲染这个动画。这时候广大吃瓜群众肯定就会问,他的兼容性咋样呀,它的兼容性所有主流游览器都支持。大家可以放心使用,做出好效果叫你老板给你加鸡腿。。先做会梦在来写代码。

6270703f3b723a37090234ad01e012cb.png

介绍了这么多那怎么使用呢?Canvas其实只是一个画布,如果想要实现绘画功能只能通过javascript去调用api来绘画。打个比方,大家小时候都学过美术吧,首先是不是要有一个白纸或者白板,然后需要笔对吧,那个白板就相当于是canvas,看下下面的例子,下面这个就相当于绘画工具箱,笔或者颜料等绘画工具。ctx其实就是得到了画布的上下文对象,那么以后我们都是通过ctx来操作绘图的。

6cf494f1a8a21c8b1660df69f1717ab8.png

在游览器打开的效果:

9914018ae1365f17fe2f79fa22819ff6.png

如果想让画布满屏怎么办?有小伙伴肯定说,设置css呀,答案是no,你在css里面设置它里面的元素会变形的,强调设置canvas的宽高不要在css里面设置,可以在canvas行内样式写,也可以在js里面写。我们来写个满屏的背景颜色为黑色的画布。

e58de96e8b52074a13803b6e0afcfb8e.png

在我们绘制图形之前,必须要搞清楚canvas的坐标系统,这样才能知道我们具体要在哪里绘制图形。

canvas的2D环境绘图坐标系统,原点(0,0)位于canvas元素的左上角顶点处,沿x轴向右为正值,沿y轴向下为正值,与我们数学中的直角坐标系是不同的

89f5ef22eda5226a65f0fe67e1cad03f.png

首先我们来画个圆,arc() 方法创建弧/曲线(用于创建圆或部分圆)。

context.arc(x,y,r,sAngle,eAngle,counterclockwise);

8564807840050bf961f444363f7991ab.png

第1,2个参数坐标就是圆心的位置,第3个数学不差的都知道是半径哈,第4,5个就是开始角和结束角,第6个就是选是顺时针还是逆时针,False = 顺时针,true = 逆时针。例子,

arc(100,75,50,0*Math.PI,1.5*Math.PI)

如果就是下面一句话没有任何效果,你只是给他瞄了一个路径而已,这时候我们要给它描边和填充。他们默认的颜色都是黑色,我们可以通过调用api改变颜色

fill():     填充当前绘图

stroke():  绘制已定义的路径

fillStyle:  改变填充颜色

strokeStyle:改变描边颜色

现在我们来画一个橘色的圆

e64ea8937bd4be01bd1dd0e61baebba5.png

实现的效果:

248aaae99d4fdb8a3f64cc8da0fdc684.png

下面我们来做一个网页中常见的一个效果,就是从无到与有动态生成一个圆,这个该怎么实现呢?

89be5b24535b0c3781d85000623a1b9b.png

假设有个开始角度startAngle,一个结束角度endAngle,他们的关系是不是他们加起来是2π

var startAngle = -(1 / 2 * Math.PI); //开始角度

var endAngle = startAngle + 2 * Math.PI; //结束角度

现在角度有了,那怎么让它动起来呢?我们给它定义一个临时变量来存储tmpAngle,最开始应该是startAngle 对吧,然后呢一点一点给它加角度,那我们给它一个增量

var xAngle = 1 * (Math.PI / 180); //偏移角度量

var tmpAngle = startAngle; //临时角度变量

现在开始角度,结束角度,偏移量有了,那接下来是不是应该整个定时器让他跑起来,这里我们介绍下最新的定时器 requestAnimationFrame,官方定义 requestAnimationFrame方法告诉浏览器您希望执行动画并请求浏览器在下一次重绘之前调用指定的函数来更新动画。该方法使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。有兴趣的可以下去研究下

现在来分析下重要的渲染函数,其实很简单是不是相当于每次画一个圆弧,临时角度作为结束角度,每次给临时角度加上偏移角度量就可以了,那结束条件是不是就是当tmpAngle>endSngle就结束了

if(tmpAngle >= endAngle){

return;

}else{

tmpAngle += xAngle;

}

现在干正事画圆圈,现在就so easy了

ctx.arc(r, r, cR, startAngle, tmpAngle);

接下来写中间的文字,我们要用到context.fillText(text,x,y,maxWidth);绘制填色的,主要是第一个文本值应该怎么写呢

(tmpAngle -  startAngle) / (endAngle - startAngle) * 100

但是有小数点,我们给它取个整数,这样是不是就可以了

Math.round((tmpAngle -  startAngle) / (endAngle - startAngle) * 100) + '%'

现在就一个简单的圆环效果就出来了,我把全部代码都贴在后面

*{

margin:0px;

padding:0px;

}

var c=document.getElementById('canvas');

//得到画布的上下文

var ctx=canvas.getContext('2d')

//给画布的宽度设置为预览器的宽高

canvas.width=document.documentElement.clientWidth;

canvas.height=document.documentElement.clientHeight;

//     var mW = c.width = 300;

//var mH = c.height = 300;

var lineWidth = 5;

var r = canvas.width/5; //中间位置

var cR = r - 4 * lineWidth; //圆半径

var startAngle = -(1 / 2 * Math.PI); //开始角度

var endAngle = startAngle + 2 * Math.PI; //结束角度

var xAngle = 1 * (Math.PI / 180); //偏移角度量

var fontSize = 35; //字号大小

var tmpAngle = startAngle; //临时角度变量

//渲染函数

var rander = function(){

if(tmpAngle >= endAngle){

return;

}else{

tmpAngle += xAngle;

}

ctx.clearRect(0, 0, canvas.width, canvas.height);

//画圈

ctx.beginPath();

ctx.lineWidth = lineWidth;

ctx.strokeStyle = 'deeppink';

ctx.arc(r, r, cR, startAngle, tmpAngle);

ctx.stroke();

ctx.closePath();

//写字

ctx.fillStyle = 'deeppink';

ctx.font= fontSize + 'px Microsoft Yahei';

ctx.textAlign='center';

ctx.fillText( Math.round((tmpAngle -  startAngle) / (endAngle - startAngle) * 100) + '%', r, r + fontSize / 2);

requestAnimationFrame(rander);

};

rander();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redminote8自动关机怎么回事_红米Note8Pro手机值得入手吗 红米Note8Pro手机全面评测...

六、续航:4500mAh大电池与G90T的碰撞发手机发布之前,Redmi品牌总经理卢伟冰在微博上也说过,G90T的12nm处理器在功耗方面和7nm处理器会有10%左右的差距。为了弥补功耗的差距,红米Note 8 Pro采用了4500mAh的大电池。大电池和12nm芯碰…

计算机机房用户不规则行为,网络及网管机房管理理论练习

一、填空题:1、机房行为管理的宗旨是( 以人为本)。2、机房管理的内涵构架上至少应包括“(环境)、人、(机)、网络和管理”五个方面。3、对于从事机房管理的工作人员,不仅要学会管理(机房设备),也得学会管理(…

python异步io 队列_python 学习笔记九 队列,异步IO

queue (队列)队列是为线程安全使用的。1.先入先出import queue#测试定义类传入队列class Foo(object):def __init__(self,n):self.nnnew queue.Queue(maxsize3)new.put(1)new.put(Foo(1),timeout2) # 超时时间后,抛出队列full异常new.put([1, 2, 3],timeout2)print…

html 5 canvas flash,为什么使用HTML5 Canvas创建内容比使用Flash创作要复杂得多?

好问题.我一直在使用< canvas>几年,我也是一名前Flash开发人员.我不认为你错过了什么.嗯,< canvas>,你知道,它必须看起来比Flash更复杂:). Flash是一种客户端工具.它提供了一个非常棒的GUI,大量的视觉和即时功能,并允许用户有时编写动画而无需一行代码(actionscrip…

vue 项目难点_vue项目中遇到的问题汇总

前&#xff1a;项目用到的技术栈为webpackvue2.xpugstyluselementUI1、IE9中&#xff0c; 请求服务器数据并用v-for渲染option标签出现只显示第一个字的问题解决方法&#xff1a;/*** 强制重绘页面的select 输入框&#xff0c;解决IE9只显示单个字符串问题* param useNextTick …

计算机工程师的英语求职信,软件工程师的英文求职信范文

软件工程师的英文求职信范文软件工程师的英文求职信范文name:CNrencai sex: maleethnic: chinese political features: membersacademic qualifications (degree): bachelor of professional: industrial electric automationtel :0755-12345678 mobile: 139xxxxxxfutian distr…

matlab用diag直接使用错误_matlab中的diag(diag(a))是什么意思?

展开全部取出62616964757a686964616fe4b893e5b19e31333365643533a阵的对角元&#xff0c;然后构建一个以a对角元为对角的对角矩阵。A 1 23 4>> diag(diag(A))ans 1 00 4matlab中diag用法&#xff1a; diag(v,k)以向…

计算机控制系统为什么会受到干扰,浅谈计算机控制系统中的干扰及其抑制措施...

摘要&#xff1a;具有良好的抗干扰性&#xff0c;是衡量计算机控制系统可靠性的一个标准。国内外的学者&#xff0c;曾经研究过这一课题&#xff0c;认为抗抗干扰性的理论十分复杂&#xff0c;技术也十分精密&#xff0c;需要大量的实践才能解决。本文通过对计算机控制系统中存…

php 获取上周日期_php 获取今日、昨日、上周、本月的起始时间戳和结束时间

1、php获取今日开始时间戳和结束时间戳$beginTodaymktime(0,date(m),date(d),date(Y));$endTodaymktime(0,date(d)1,date(Y))-1;2、php获取昨日起始时间戳和结束时间戳$beginYesterdaymktime(0,date(d)-1,date(Y));$endYesterdaymktime(0,date(Y))-1;3、php获取上周起始时间戳和…

计算机软件中级职称 入职,计算机职调称论文.doc

计算机职称论文以多层次计算机专业职称资格证书为主线的人才培养新模式探索与实践摘 要&#xff1a;本文结合我院近几年学生就业的实际情况&#xff0c;提出以多层次计算机专业职称资格证书为主线的人才培养新模式。文章探讨了该模式的内涵及实施该模式的意义&#xff0c;依据新…

mysql 统计本月的_mysql 查询当天、本周,本月,上一个月的数据

今天select * from 表名 where to_days(时间字段名) to_days(now());昨天SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) < 1近7天SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) < date(时间字段名)近30天SELECT * FROM 表名 whe…

浙大远程教育计算机作业3,2016浙大远程教育计算机应用基础作业-3剖析

2016第3章 Word文字编辑(单选题)(其实我所给的这些典型题目就是期末考试题或统考题&#xff0c;因此必做。参考答案在另一个Word文档中)一&#xff0e; Word 概述1、Word具有的功能是__C__。A.表格处理 ---- Word既能处理文字又能处理表格B.绘制图形 ---- 它有一个绘图工具&…

vue根据url获取内容axios_vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据...

在&#xff56;&#xff55;&#xff45;项目中组件间相互传值或者后台获取的数据需要供多个组件使用的情况很多的话&#xff0c;有必要考虑引入&#xff56;&#xff55;&#xff45;&#xff58;来管理这些凌乱的状态&#xff0c;今天这边博文用来记录这一整个的过程&#xf…

微型计算机实验代码,微型计算机原理实验1-数据传送

《微型计算机原理实验1-数据传送》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《微型计算机原理实验1-数据传送(14页珍藏版)》请在人人文库网上搜索。1、实验一数据传送一、实验目的1.熟悉8086指令系统的数据传送指令及8086的寻址方式。2.利用Turbo Debugger调试工具…

机器人J中WPR_北方工业大学服务机器人研究项目介绍

原标题&#xff1a;北方工业大学服务机器人研究项目介绍指导老师&#xff1a;王月海、杨扬团队成员&#xff1a;李雄 16级研究生 电子与通信工程专业郭迎达 15级研究生 电子与通信工程专业朱建林 15级研究生 计算机技术专业宋威 16级研究生 电子与通信工程专业孙逊之 15级研究生…

风洞试验计算机控制模块,计算机控制风洞

C15计算机控制的亚音速风洞Armfield C15是一款新型的由计算机控制的亚音速台式风洞&#xff0c;它用于高校教学。小型台式风洞&#xff0c;带有可视工作段。备有大量附件和测量仪器&#xff0c;可对亚音速空气动力学进行综合研究。该设备适合大学生演练和设计工作。分类说明? …

云原生的本质_云原生是什么 云原生技术有何作用

花火网消息&#xff0c;随着科技的发展&#xff0c;催生出以云原生为代表的下一代架构&#xff0c;云原生以容器、Kubernetes、Serverless等为代表的新技术引领移动互联网进入急速赛道。但是很多小伙伴们可能对云原生没有什么概念&#xff0c;今天小编就来为大家介绍一下云原生…

通过服务器给多台计算机装系统,怎么快速给机房多台电脑安装系统?

Ghost局域网克隆备份操作方法 Ghost局域网克隆备份操作方法 LPT 是通过并口传送备份文件,下面有两个选项&#xff1a;slave 和 master, 分别用以连接主机和客户机。 网络基本输入输出系统 NetBios 和 LPT 相似, 也有 slave 和 master 两个选项, 作用与 LPT 相同。 先和平时一样…

为什么不敢和别人竞争_内心很脆弱,不敢和人竞争。该怎么办?

心理咨询师02月26日 11:56你好&#xff0c;我是壹点灵的心理咨询师李海霞。1.看到您的描述&#xff0c;您的困惑来自于几个方面&#xff0c;您觉得自己很脆弱&#xff0c;内心不够强大&#xff0c;容易悲伤&#xff0c;崩溃与社交恐惧症和敏感&#xff0c;而这些看似复杂的症状…

江恩 计算机,江恩理论基础篇

前言-废话我发这个贴的目的&#xff0c;不是教大家江恩理论&#xff0c;而仅仅是帮助探索者打通卡住的瓶颈&#xff0c;最重要的还是得靠自己。想想自己当初也是投师无门歪打乱撞进了MACD论坛江恩板块。所以还是得知恩图报。这几年没去工作&#xff0c;每天5-20小时全部砸在了江…