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,一经查实,立即删除!

相关文章

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

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

scrum回顾_3步开好回顾会 | IDCF FDCC认证学员作品

了解敏捷的人应该对回顾会不陌生,回顾会是在SCRUM框架五个活动中的最后一个活动,但是在敏捷的实际应用中,回顾会并不只是会在应用SCRUM的团队中使用,在其他敏捷实践中也会引入回顾会作为反馈环节。那么什么是回顾会呢?…

维沃丫3手机微信无法连接服务器1.104,手机微信网络连接不可用?教你4个方法,轻松解决网络问题!...

原标题:手机微信网络连接不可用?教你4个方法,轻松解决网络问题!微信,可以说是我们日常生活中离不开的一个通讯软件,无论是工作还是生活!而最近有位朋友使用手机微信的时候,明明网络信号十分好,…

金叉成功率_技巧!三分钟教会你识别macd真假金叉,让你精准把握买卖点!

如果看见MACD发生金叉就买,死叉就卖的话,或许早被市场消灭了。 机械的运用金叉/死叉信号来买卖还不如用投硬币来决定买卖会更省力些,而效果也不会差很多,只有在符合一定规则之下采用MACD发出的金叉/死叉信号,才可以大大提高信号的成功率。就像…

css规则可以放在云上,CSS中!important规则的使用方法

CSS中!important规则的使用方法发布时间:2020-06-15 10:53:11来源:亿速云阅读:129作者:Leah这期内容当中小编将会给大家带来有关CSS中!important规则的使用方法,以专业的角度为大家分析和叙述,阅读完这篇文…

ajax改变div内容,jquery ajax双击div可直接修改div中的内容

最近在做后台功能开发的时候,用到对排序字段的修改,感觉只为了修改一个排序值,而要重新进入编辑页比较麻烦,于是网上找点资料自己动手写了一个jquery双击实现直接修改排序值的效果:html代码:{$sort}JS代码&…

开榨油店的失败教训_想开水果店没有经验?线下开水果店经营心得分享,或许你用得上...

水果店随地都有,但能把水果店开好的人,似乎并不多见,那作为新人想开水果店,可以吸收哪些经验教训?想开店如何运作更好?且听小编细细道来。 很多开水果店的人都没有开好,那么有什么开水果店失败后…

js中的json ajax,js结合json实现ajax简单实例

这篇文章主要为大家详细介绍了js结合json实现ajax简单实例的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下前期准备1、安装wampserver或者其他相似软件来搭建本地集成安装环境,我安装的是phpstudy2、html、js、css等文件需要放置…

服务器系统wlanapi,没有找到wlanapi.dll怎么办?

没有找到wlanapi.dll怎么办呢?电脑提示没有找到wlanapi.dll将会导致电脑无法正常使用,因为wlanapi.dll文件中包含了系统正常运行所不可或缺的大量代码,下文小编就为大家带来无法找到wlanapi.dll的解决方法,一起去了解下吧。wlanapi.dll出错原…

最小错误率贝叶斯决策的基本思想_太赞了!机器学习基础核心算法:贝叶斯分类!(附西瓜书案例及代码实现)...

Datawhale 作者:尹晓丹,Datawhale优秀学习者寄语:首先,简单介绍了生成模型和判别模型,对条件概率、先验概率和后验概率进行了总结;其次,对朴素贝叶斯的原理及公式推导做了详细解读;再…

1 数列分块入门_线性代数入门——利用分块矩阵简化矩阵乘法运算

系列简介:这个系列文章讲解线性代数的基础内容,注重学习方法的培养。线性代数课程的一个重要特点(也是难点)是概念众多,而且各概念间有着千丝万缕的联系,对于初学者不易理解的问题我们会不惜笔墨加以解释。在内容上,以…

h5首页加载慢_H5网站制作注意了

H5自适应网站越来越受到企业的追捧,不同于原来的建站模式,H5网站可以很好是调整来达到PC端和移动端的良好展示效果,获得更友好用户体验。H5网站作为网站优化人员,小编第一个想到的并不是H5带来的炫酷效果,认识它解决了…

阿联酋esma认证_阿联酋无人驾驶汽车预计2021年上路

本报讯 迪拜消息-----据《海湾时报》11月26日报道,阿联酋标准化与计量局(ESMA;EmiratesAuthorityfor StandardisationandMetrology)局长AbdullaAlMaeeni表示,阿联酋准备成为全球第一个对无人驾驶汽车制订相关法规的国家,无人驾驶…

base cap 分布式_高并发架构系列:详解分布式一致性ACID、CAP、BASE,以及区别

在面试环节,经常会问CAP、BASE等相关的分布式理论,其实这些名词主要还是来自于分布式的一致性,今天主要介绍分布式一致性:强一致性、最终一致性、ACID、CAP等理论。分布式一致性的背景随着分布式事务的出现,传统的单机…

读取剪贴板英语转换为国际莫斯码

Python全代码如下 执行代码之后会自动检测按键,按下CtrlZ之后程序读取剪贴板然后转换为莫斯码再次写入剪贴板 使用第三方模块: pynput win32clipboard 文章尾部附带国际莫斯码表 示例: Caesar openly defied the Senates authority by cros…

asp python 定时任务_Python定时任务轻量解决方案——Schedule

写后端的同学们可能都知道,工作中可能需要周期性执行一些任务,俗称定时任务。Linux环境下,可以借助于系统自带的crontab完成定时任务。但是很多时候,开发的同学们可能并没有权限去操作crontab,所以就催生了一些不太好的…

Pygame简单深度优先算法生成迷宫

学习路径计算之前需要一个场景,网上查了下迷宫生成方法花了点时间写了个简单的迷宫生成器 基本原理十分简单: 使用2维矩阵表示迷宫,每一个节点有四面墙,使用深度搜索,随机顺序向四个方向移动,,如果遇到已到…

wait放弃对象锁_终于搞懂了sleep/wait/notify/notifyAll,真的是不容易

sleep/wait/notify/notifyAll分别有什么作用?它们的区别是什么?wait时为什么要放在循环里而不能直接用if?简介首先对几个相关的方法做个简单解释,Object中有几个用于线程同步的方法:wait、notify、notifyAll。public c…

Pygame 使用Djkstra广度搜索寻找迷宫(相对)最短路径

基于之前写的迷宫生成器实现了Djkstra算法搜索路径。 https://blog.csdn.net/ChillingKangaroo/article/details/122800431 Djkstra基于广度优先算法,与简单搜索不同的是Djkstra在访问每一个节点的时候会计算到该节点的最短路径以及上一个节点,如果有新…

python打乱list_超实用!每 30 秒学会一个 Python 小技巧,GitHub 标星 5300!

公众号关注 “GitHubDaily”设为 “星标”,每天带你逛 GitHub!很多学习 Python 的朋友在项目实战中会遇到不少功能实现上的问题,有些问题并不是很难的问题,或者已经有了很好的方法来解决。当然,孰能生巧,当…