JavaScript之Canvas_动力节点Java学院整理


Posted in Javascript onJuly 04, 2017

Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表、动画等。

没有Canvas的年代,绘图只能借助Flash插件实现,页面不得不用JavaScript和Flash进行交互。有了Canvas,我们就再也不需要Flash了,直接使用JavaScript完成绘制。

一个Canvas定义了一个指定尺寸的矩形框,在这个范围内我们可以随意绘制:

<canvas id="test-canvas" width="300" height="200"></canvas>

由于浏览器对HTML5标准支持不一致,所以,通常在<canvas>内部添加一些说明性HTML代码,如果浏览器支持Canvas,它将忽略<canvas>内部的HTML,如果浏览器不支持Canvas,它将显示<canvas>内部的HTML:

<canvas id="test-stock" width="300" height="200">
  <p>Current Price: 25.51</p>
</canvas>

在使用Canvas前,用canvas.getContext来测试浏览器是否支持Canvas:

<!-- HTML代码 -->
<canvas id="test-canvas" width="200" heigth="100">
  <p>你的浏览器不支持Canvas</p>
</canvas>
'use strict';
var canvas = document.getElementById('test-canvas');
if (canvas.getContext) {
  alert('你的浏览器支持Canvas!');
} else {
  alert('你的浏览器不支持Canvas!');
}

getContext('2d')方法让我们拿到一个CanvasRenderingContext2D对象,所有的绘图操作都需要通过这个对象完成。

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

如果需要绘制3D怎么办?HTML5还有一个WebGL规范,允许在Canvas中绘制3D图形:

gl = canvas.getContext("webgl");

本节我们只专注于绘制2D图形。

绘制形状

我们可以在Canvas上绘制各种形状。在绘制前,我们需要先了解一下Canvas的坐标系统:

JavaScript之Canvas_动力节点Java学院整理

Canvas的坐标以左上角为原点,水平向右为X轴,垂直向下为Y轴,以像素为单位,所以每个点都是非负整数。

CanvasRenderingContext2D对象有若干方法来绘制图形:

'use strict';

var
  canvas = document.getElementById('test-shape-canvas'),
ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, 200, 200); // 擦除(0,0)位置大小为200x200的矩形,擦除的意思是把该区域变为透明
ctx.fillStyle = '#dddddd'; // 设置颜色
ctx.fillRect(10, 10, 130, 130); // 把(10,10)位置大小为130x130的矩形涂色
// 利用Path绘制复杂路径:
var path=new Path2D();
path.arc(75, 75, 50, 0, Math.PI*2, true);
path.moveTo(110,75);
path.arc(75, 75, 35, 0, Math.PI, false);
path.moveTo(65, 65);
path.arc(60, 65, 5, 0, Math.PI*2, true);
path.moveTo(95, 65);
path.arc(90, 65, 5, 0, Math.PI*2, true);
ctx.strokeStyle = '#0000ff';
ctx.stroke(path);

绘制文本

绘制文本就是在指定的位置输出文本,可以设置文本的字体、样式、阴影等,与CSS完全一致:

'use strict';

var
  canvas = document.getElementById('test-text-canvas'),
ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.shadowOffsetX = 2;
ctx.shadowOffsetY = 2;
ctx.shadowBlur = 2;
ctx.shadowColor = '#666666';
ctx.font = '24px Arial';
ctx.fillStyle = '#333333';
ctx.fillText('带阴影的文字', 20, 40);

Canvas除了能绘制基本的形状和文本,还可以实现动画、缩放、各种滤镜和像素转换等高级操作。如果要实现非常复杂的操作,考虑以下优化方案:

  1. 通过创建一个不可见的Canvas来绘图,然后将最终绘制结果复制到页面的可见Canvas中;
  2. 尽量使用整数坐标而不是浮点数;
  3. 可以创建多个重叠的Canvas绘制不同的层,而不是在一个Canvas中绘制非常复杂的图;
  4. 背景图片如果不变可以直接用<img>标签并放到最底层。
Javascript 相关文章推荐
alixixi runcode.asp的代码不错的应用
Aug 08 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
Nov 19 Javascript
javascript实现的简单的表单验证
Jul 10 Javascript
jQuery实现带水平滑杆的焦点图动画插件
Mar 08 Javascript
AngularJS入门教程之AngularJS指令
Apr 18 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
Jan 22 jQuery
vue props传值失败 输出undefined的解决方法
Sep 11 Javascript
Angular PWA使用的Demo示例
Jan 31 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
Sep 14 Javascript
ElementUI 修改默认样式的几种办法(小结)
Jul 29 Javascript
原生js实现购物车
Sep 23 Javascript
Openlayers学习之加载鹰眼控件
Sep 28 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 #jQuery
jQuery动画_动力节点节点Java学院整理
Jul 04 #jQuery
JS点击缩略图整屏居中放大图片效果
Jul 04 #Javascript
理解Angular的providers给Http添加默认headers
Jul 04 #Javascript
详解在Angular项目中添加插件ng-bootstrap
Jul 04 #Javascript
详解在 Angular 项目中添加 clean-blog 模板
Jul 04 #Javascript
Node.js使用gm拼装sprite图片
Jul 04 #Javascript
You might like
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
TensorFlow利用saver保存和提取参数的实例
2018/07/26 Python
python 实现倒排索引的方法
2018/12/25 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
Mankind西班牙男士护肤品网站:购买皮肤护理、护发和剃须
2017/04/27 全球购物
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
小学教研工作制度
2014/01/15 职场文书
给老婆的婚前保证书
2014/02/01 职场文书
关爱留守儿童标语
2014/06/18 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers