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 相关文章推荐
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
Jun 28 Javascript
js取消单选按钮选中并判断对象是否为空
Nov 14 Javascript
javascript记住用户名和登录密码(两种方式)
Aug 04 Javascript
jQuery实现动态添加tr到table的方法
Dec 26 Javascript
浅谈javascript的闭包
Jan 23 Javascript
关于axios返回空对象的问题解决
Apr 04 Javascript
JS实现的二叉树算法完整实例
Apr 06 Javascript
vue 中自定义指令改变data中的值
Jun 02 Javascript
swiper 自动图片无限轮播实现代码
May 21 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
Oct 12 Javascript
Vue解决echart在element的tab切换时显示不正确问题
Aug 03 Javascript
js通过canvas生成图片缩略图
Oct 02 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
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
js实现一个简易计算器
2020/03/30 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
简单实现python进度条脚本
2017/12/18 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
python实现抖音视频批量下载
2018/06/20 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
在python3中实现更新界面
2020/02/21 Python
一文读懂Python 枚举
2020/08/25 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
YesStyle美国/全球:购买亚洲时装、美容化妆品和生活百货
2017/01/16 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
水产养殖学应届生求职信
2013/09/29 职场文书
应届生个人求职信模板
2013/11/26 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
关于实现中国梦的心得体会
2016/01/05 职场文书
Nginx搭建rtmp直播服务器实现代码
2021/03/31 Servers
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android