canvas最早由Apple引入WebKit,用于Mac OS X的dashboard,后来又在safari和Google Chrome被实现。基于Geoko 1.8的浏览器(如firefox1.5)支持此元素。
<canvas>元素是WhatWG Web applications 1.0规范的一部分,也包含于HTML5中。<canvas>不再是语义化标签,存在兼容性问题,因此使用语义化标签兼容插件无法解决兼容问题。
canvas体验
绘图步骤:
准备画布
使用
<canvas>标签定义一个画布,默认画布为透明色(rgba(0, 0, 0, 0)),大小为300*150可在
<canvas>的样式中设置边框,但不设置大小,画布大小在<canvas>属性中设置canvas尺寸设置
在样式中设置
canvas尺寸:1
2
3
4
5canvas{
border: 1px solid pink;
width: 600px;
height: 400px;
}运行结果:

使用
canvas属性设置画布尺寸1
<canvas width="600px" height="400px"></canvas>
运行结果:

可以看出虽然两种方法设置的画布最终大小是一致的,但画布中的内容却不一样。
使用样式设置画布大小,相当于对画布进行了放大操作,画布中的内容也会被拉伸;使用canvas自带属性设置画布大小设置的是画布的实际大小,内容不会有影响
准备绘图工具
<canvas>标签中不能写内容,因此绘图工具只能在js中设置利用工具绘图
绘图步骤也需写在JS中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1. 获取canvas元素
var myCanvas = document.querySelector('canvas');
// 2. 获取上下文(此处上下文为canvas的回执工具箱)
var ctx = myCanvas.getContext('2d');
// 3. 移动画笔
ctx.moveTo(100,100);
// 4. 绘制直线(轨迹/绘制路径)
ctx.lineTo(200,100);
// 5. 描边
ctx.stroke();
canvas不支持3d效果,一般使用web gl绘制3d效果的网页
绘制平行线
绘制两条平行线
1 | var myCanvas = document.querySelector('canvas'); |
关于描边
描边默认的宽度是1px,默认颜色为黑色,但实际在浏览器显示为2px,浅黑色
描边线的中心位置与刻度线对齐,因此描边线会占据浏览器上下各0.5px,但浏览器无法解析0.5px,只能解析1px,因此最终显示结果是宽度为2px,颜色饱和度降低
解决方案: 前后(Y轴)移动0.5px
绘制三条不同颜色的平行线
1 | var myCanvas = document.querySelector('canvas'); |
绘制不同属性的线条时,需要用ctx.beginPath();来开启新路径解决样式覆盖问题
绘制三角形
1 | ctx.moveTo(200,100); |
使用此方法绘制出的三角形会出现起始点和lineto的连接点无法闭合产生缺角的问题:

解决方案:使用ctx.closePath()让canvas自动闭合
1 | ctx.moveTo(200,100); |

绘制填充的三角形
1 | ctx.moveTo(200,100); |
绘制结果:

填充时不再使用ctx.stroke()而是使用ctx.fill(),同样的,填充样式属性用的是fillStyle而不是strokeStyle
绘制镂空正方形
1 | // 顺时针绘制100*100小正方形 |
绘制结果:

非零环绕规则:从区域内往外画一条足够长的线,线与顺时针路径相交,计数器+1,与逆时针路径相交,计数器-1,计数器最终不为0则填充

与线条相关的属性(画笔状态)
lineWidth: 线宽,默认1pxlineCap: 线末端属性: butt、round、squarelineJoin: 相交线的拐点: miter(默认)、round、bevelstrokeStyle: 线的颜色fillStyle: 填充颜色setLineDash(): 设置虚线setLineDash()方法中需要传一个数组,用来描述虚线的排列方式,如ctx.setLineDash([5,10,15,20])
getLineDash(): 获取虚线宽度集合lineDashOffset: 设置虚线偏移量(负值向右偏移)
绘制渐变色矩形
绘制思路: 绘制点组成线,为每个点上色
绘制折线图
绘制流程: 绘制网格 –> 绘制坐标系 –> 绘制点 –> 连点成线
具体实现:
1 |
|
绘制图形
矩形:
rect(x轴坐标,Y轴坐标,长度,高度)X轴坐标、Y轴坐标表示矩形左上角的点的位置
此方法绘制的是轨迹,要显示出来还必须使用
stroke()或fill()进行描边或填充绘制的路径不是独立路径
strokeRect(x轴坐标,Y轴坐标,长度,高度)绘制描边矩形
此方法绘制有自己的独立路径,即默认自带
beginPath(),不会被其他路径样式覆盖
fillRect(x轴坐标,Y轴坐标,长度,高度)绘制填充矩形
此方法绘制有自己的独立路径,即默认自带
beginPath(),不会被其他路径样式覆盖
clearRect(x轴坐标,Y轴坐标,长度,高度)- 清除矩形内容
绘制渐变矩形
1 | var linearGradient = ctx.createLinearGradient(100,100,400,100);// 设置渐变方向,以两点的坐标来定 |
绘制曲线
弧形
一个弧度 = 一个半径的长度
arc(圆心x轴,圆心y轴,起始弧度,结束弧度,绘制方向)
起始点放在弧线的圆心位置,绘制弧线,闭合路径
1 | var ctx = document.querySelector('canvas').getContext('2d'); |
起始点若不设置直接闭合,则绘制出的为扇形
n等分随机颜色的圆
1 | var ctx = document.querySelector('canvas').getContext('2d'); |
根据数据绘制饼图
1 | var ctx = document.querySelector('canvas').getContext('2d'); |
绘制文本
strokeText(文本内容,x坐标,y坐标)文本绘制的起点在左下角,矩形绘制的起点在左上角
strokeText绘制出的是描边的文字,字体为空心,若要实心则使用fillText绘制
textAlign- 文本对齐方式,基于起始坐标的对齐方式
font- 设置文本大小、字体
textBaseline设置基线(垂直对齐方式),基于起始坐标的对齐方式
可取值:
top、middle、bottom、hanging、alphabetic、ideographichanging文本的基线处于文本的正上方并且和文本相粘合(适用于印度文)alphabetic默认值,基线处于文本下方,并穿过文字(适用于英文)ideographic与bottom相似(适用于中文)
measureText(文本内容)获取文本的宽度对象
若取文本长度则需要xxx.ctx.measureText(xx).width
绘制带文本的饼图
https://garden.aezo.cn/demos/canvas饼状图.html
绘制图片
绘制图片使用方法drawImage(),可传三个参数、五个参数、九个参数
绘制思路
加载图片至内存,创建image对象
1
2
3
4
5
6
7// 方法1
var img = doucment.createElement('img');
img.src = 'image/dude.png';
// 方法2
var image = new Image();// Image()为JS提供的内置构造函数
img.src = 'image/dude.png';图片加载完成才能执行代码,因此必须写在onload函数里面
部分浏览器如果有缓存时,图片可能会在onload函数触发之前就已经加载完毕,第一次加载图片时已经触发了onload事件,含有缓存时不再触发onload事件,为保证兼容性,最好把onload事件写在图片加载之前
1
2
3
4
5var image = new Image();// Image()为JS提供的内置构造函数
image.onload = function() {
// 此处实现图片绘制
}
img.src = 'image/dude.png';
三种绘制方法
三个参数
darwImage(img, x, y)img图片对象、canvas对象、 video对象x、y图片绘制的左上角
五个参数
darwImage(img, x, y, w, h)img图片对象、canvas对象、 video对象x、y图片绘制的左上角w、h图片绘制尺寸设置,会对图片进行缩放而不是裁剪
九个参数
drawImage(img, x, y, w, h, x1, y1, w1, h1)img图片对象、canvas对象、 video对象x、y、w、h图片中的一个矩形区域x1、y1、w1、h1画布中的一个矩形区域,w1、h1是图片的缩放尺寸而不是裁剪
帧动画
绘制关键思路
动态获取当前图片的尺寸
1
2var imageWidth = image.width;
var imageHeight = image.height;计算出每个小人物的尺寸
示例
https://garden.aezo.cn/demos/canvas帧动画.html
方向键控制精灵行走的帧动画
https://garden.aezo.cn/demos/canvas方向键控制行走动画.html
转换
参考视频
https://www.bilibili.com/video/av53813293?p=2 (canvas视频【高级教程】)