# Canvas
教程
# 基本用法
canvas
看起来和img
很像,不同在于- 没有
src alt
属性 - 需要结束标签
</canvas>
不可省略
- 没有
- 只有两个属性
width height
,没有设置的时候默认值为width:300px height:150px
id
不是canvas
特有,每个标签都有
# 渲染上下文
canvas
创造了一个大小固定的画布,通过其渲染上下文可以用来绘制和处理需要展示的内容(主要是 2D
,WebGl
处理 3D
)
获取渲染上下文:
var canvas = document.getElementById("tutorial");
var ctx = canvas.getContext("2d");
2
# 检查支持性
通过 getContext
检查是否支持 canvas
,不支持则显示替代内容:
var canvas = document.getElementById("tutorial");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
// drawing code here
} else {
// canvas-unsupported code here
}
2
3
4
5
6
7
8
# 例子
下面绘制两个正方形:
# 绘制基本图形
栅格
canvas
元素默认被网格所覆盖。通常来说网格中的一个单元相当于canvas
元素中的一像素。栅格的起点为左上角(坐标为(0,0
))。所有元素的位置都相对于原点定位。所以图中蓝色方形左上角的坐标为距离左边(X 轴
)x 像素,距离上边(Y 轴
)y 像素(坐标为(x,y
))

# 绘制矩形
相关 API
:
- 填充矩形
fillRect(x,y,width,height)
- 矩形边框
strokeRect(x,y,width,height)
- 清除矩形
clearRect(x,y,width,height)
# 绘制路径
图形的基本元素是路径。路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合。一个路径,甚至一个子路径,都是闭合的。使用路径绘制图形需要一些额外的步骤:
- 首先,你需要创建路径起始点。
- 然后你使用画图命令去画出路径。
- 之后你把路径封闭。
- 一旦路径生成,你就能通过描边或填充路径区域来渲染图形
相关 API
:
新建路径
beginPath
闭合路径
closePath
绘制轮廓
stroke
填充
fill
移动笔触
moveTo(x,y)
绘制直线
lineTo(x,y)
圆弧
arc(x, y, radius, startAngle, endAngle, anticlockwise)
:x,y
为圆心的以radius
为半径的圆弧 从startAngle
弧度到endAngle
按照anticlockwise
给定(默认顺时针)方向生成arcTo(x1, y1, x2, y2, radius)
:根据给定控制点和半径画圆弧,再以直线连接两个控制点
贝塞尔曲线
quadraticCurveTo(cp1x, cp1y, x, y)
:绘制二次贝塞尔曲线,cp1x,cp1y
为一个控制点,x,y
为结束点bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
:绘制三次贝塞尔曲线,cp1x,cp1y
为控制点一,cp2x,cp2y
为控制点二,x,y
为结束点
注
- 新建路径之后
beginPath
调用之后,第一条路径构造命令通常是moveTo
- 调用
fill
所有没有闭合的形状都会闭合,就不需要调用closePath
,但是调用stroke
就不会自动闭合 弧度=(Math.PI/180)*角度
绘制三角形:
绘制笑脸(圆弧):
绘制对话气泡(二次贝塞尔):
绘制心形(三次贝塞尔):
# Path2D
对象
为了简化代码和提高性能,可以使用
Path2D
用来缓存或记录绘画命令
常用 API
:
Path2D(path)
:返回一个Path2D
对象,用一个路径或者一个svg path
的字符串来初始化Path2D.addPath(path,transform)
:添加一条路径或者变换矩阵
示例:
# 设置样式
通过设置 绘制上下文 对应属性来修改样式,绘制图形的样式由最近一次设置决定
# 颜色
通过两个属性来设置:
fillStyle = color
:填充颜色strokeStyle = color
:描边颜色
color
可以是:
orange
#fff
rgb(255,255,0)
rgba(255,255,0,0.1)
fillStyle
示例:
strokeStyle
示例:
# 透明度
globalAlpha = transparencyValue
设置透明度
这样设置更灵活,可以单独设置轮廓和填充透明度:
// 指定透明颜色,用于描边和填充样式
ctx.strokeStyle = "rgba(255,0,0,0.5)";
ctx.fillStyle = "rgba(255,0,0,0.5)";
2
3
例子:
# 线
线的样式属性:
lineWidth
:线条宽度lineCap
:线条末端样式lineJoin
:线条之间结合处样式miterLimit
:限制当两条线相交时交接处最大长度
虚线:
getLineDash()
:获取当前虚线样式setLineDash()
:设置当前虚线样式lineDashOffset
:设置虚线样式的起始偏移
像素边缘:

如果线条的边缘不在像素边界上,如左图就会导致渲染不精确,在像素边缘上就如右图,上面例子第一个线条边缘不在边界上,第二个在,明显第一个绘制不精确
# 渐变
createLinearGradient(x1, y1, x2, y2)
线性渐变createRadialGradient(x1, y1, r1, x2, y2, r2)
径向渐变gradient.addColorStop(position, color)
添加色标
createLinearGradient
例子:
createRadialGradient
例子:
# 图案
createPattern(image, type)
:
Image
可以是一个Image
对象的引用,或者另一个canvas
对象Type
:repeat,repeat-x,repeat-y 和 no-repeat
例:
# 阴影
shadowOffsetX = float
x 轴延伸距离shadowOffsetY = float
y 轴延伸距离shadowBlur = float
阴影模糊程度shadowColor = color
阴影颜色
文字阴影: