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 相关文章推荐
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
Oct 22 Javascript
基于Jquery实现键盘按键监听
May 11 Javascript
用js通过url传参把数据从一个页面传到另一个页面
Sep 01 Javascript
jQuery中:last选择器用法实例
Dec 30 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
Feb 27 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
Mar 24 Javascript
javascript实现自动输出文本(打字特效)
Aug 27 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
Apr 26 Javascript
JavaScript门面模式详解
Oct 19 Javascript
基于vue cli 通过命令行传参实现多环境配置
Jul 12 Javascript
javascript实现手动点赞效果
Apr 09 Javascript
vue+web端仿微信网页版聊天室功能
Apr 30 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
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
JS代码格式化和语法着色V2
2006/10/14 Javascript
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
详解JSON Web Token 入门教程
2018/07/30 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
世界第一冲浪品牌:O’Neill
2016/08/30 全球购物
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
优秀团员个人的自我评价
2013/10/02 职场文书
办理居住证介绍信
2014/01/15 职场文书
升国旗仪式主持词
2014/03/19 职场文书
村委会换届选举方案
2014/05/03 职场文书
自我检讨书范文
2015/01/28 职场文书
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫