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 进阶篇1 正则表达式,cookie管理,userData
Mar 14 Javascript
JS中toFixed()方法引起的问题如何解决
Nov 20 Javascript
node.js中的path.resolve方法使用说明
Dec 08 Javascript
详解JavaScript基于面向对象之继承
Dec 13 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
详解Webpack实战之构建 Electron 应用
Dec 25 Javascript
详解@angular/cli 改变默认启动端口两种方式
Nov 29 Javascript
layui 富文本编辑器和textarea值的相互传递方法
Sep 18 Javascript
javascript实现弹出层效果
Dec 10 Javascript
Node使用Nodemailer发送邮件的方法实现
Feb 24 Javascript
详解Vue串联过滤器的使用场景
Apr 30 Javascript
怎么理解wx.navigateTo的events参数使用详情
May 18 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
PHP语法速查表
2007/01/02 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
2014/06/26 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
自荐信怎么写好
2013/11/11 职场文书
酒吧创业计划书
2014/01/18 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
协议书格式
2014/04/23 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
法院执行局工作总结
2015/08/11 职场文书
初中语文教师研修日志
2015/11/13 职场文书