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 相关文章推荐
js几个验证函数代码
Mar 25 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
Aug 04 Javascript
10分钟学会写Jquery插件实例教程
Sep 06 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
Aug 13 Javascript
ANGULARJS中使用JQUERY分页控件
Sep 16 Javascript
JS无缝滚动效果实现方法分析
Dec 21 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
JavaScript获取select中text值的方法
Feb 13 Javascript
分享vue.js devtools遇到一系列问题
Oct 24 Javascript
微信小程序App生命周期详解
Jan 31 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
Nov 21 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
Apr 17 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
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
js实现开关灯效果
2020/03/30 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
Python类的基础入门知识
2008/11/24 Python
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
python自动化测试实例解析
2014/09/28 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
Python callable()函数用法实例分析
2018/03/17 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
Python2与Python3的区别实例分析
2019/04/11 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
Python pip 常用命令汇总
2020/10/19 Python
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
大学生求职中的自我评价
2013/10/01 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS