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 相关文章推荐
window.js 主要包含了页面的一些操作
Dec 23 Javascript
javascript 闭包
Sep 15 Javascript
Javascript执行效率全面总结
Nov 04 Javascript
js实现俄罗斯方块小游戏分享
Jan 31 Javascript
javascript将异步校验表单改写为同步表单
Jan 27 Javascript
jQuery UI设置固定日期选择特效代码分享
Aug 27 Javascript
jQuery获取this当前对象子元素对象的方法
Nov 29 Javascript
简单实现jquery隔行变色
Nov 09 jQuery
JS+HTML5 canvas绘制验证码示例
Dec 05 Javascript
vue返回上一页面时回到原先滚动的位置的方法
Dec 20 Javascript
vue项目接口域名动态获取操作
Aug 13 Javascript
vue 如何从单页应用改造成多页应用
Oct 23 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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
十天学会php之第六天
2006/10/09 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
PHP的Yii框架中View视图的使用进阶
2016/03/29 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
vue.js使用3DES加密的方法示例
2018/05/18 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
element-ui中el-upload多文件一次性上传的实现
2020/12/02 Javascript
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
谈谈python中GUI的选择
2018/03/01 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
tornado+celery的简单使用详解
2019/12/21 Python
Python flask框架端口失效解决方案
2020/06/04 Python
西班牙手机之家:Phone House
2018/10/18 全球购物
财务人员个人求职信范文
2013/12/04 职场文书
安全大检查反思材料
2014/01/31 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers
python3实现常见的排序算法(示例代码)
2021/07/04 Python
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL