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最常用与实用的创建类的代码
Aug 12 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
Oct 29 Javascript
JavaScript获取图片真实大小代码实例
Sep 24 Javascript
JavaScript页面模板库handlebars的简单用法
Mar 02 Javascript
JavaScript DOM操作表格及样式
Apr 13 Javascript
jQuery+HTML5实现弹出创意搜索框层
Dec 29 Javascript
AngularJS 异步解决实现方法
Jun 12 Javascript
vue 怎么创建组件及组件使用方法
Jul 27 Javascript
webpack4.x开发环境配置详解
Aug 04 Javascript
vue组件开发props验证的实现
Feb 12 Javascript
layui table复选框禁止某几条勾选的实例
Sep 20 Javascript
vue之封装多个组件调用同一接口的案例
Aug 11 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
如何在WIN2K下安装PHP4.04
2006/10/09 PHP
PHP中的cookie不用刷新就生效的方法
2012/02/04 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
PHP MVC框架路由学习笔记
2016/03/02 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
使用隐藏的new来创建对象
2011/03/29 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
js实现限定范围拖拽的示例
2020/10/26 Javascript
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
Python 一句话生成字母表的方法
2019/01/02 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
python中 * 的用法详解
2019/07/10 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
公益广告标语
2014/06/19 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
小学班主任事迹材料
2014/12/17 职场文书
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers