HTML <canvas> 元素提供一种使用 JavaScript 绘制图形的简单而强大的方法。它可以用来绘制图表、制作照片构图或制作简单(和不那么简单)的动画。
下面是一个简单的 <canvas> 元素,它只有两个特定的属性 width 和 height 以及所有核心 HTML 属性,如 id、name 和 class 等。
您可以使用 getElementById() 方法在 DOM 中轻松找到 <canvas> 元素,如下所示:
例子
如何在 HTML 文档使用 <canvas> 元素。
渲染上下文
<canvas> 最初是空白的,要显示某些内容,脚本首先需要访问渲染上下文。canvas 元素具有一个名为 getContext 的 DOM 方法,该方法用于获取渲染上下文及其绘图函数。此函数采用一个参数,即上下文类型 2d。
实例
以下是获取所需上下文的代码,以及检查浏览器是否支持 <canvas> 元素:
浏览器支持
注意:最新版本的 Firefox、Safari、Chrome 和 Opera 都支持 HTML Canvas,但 IE8 本身不支持 Canvas。
可以使用 ExplorerCanvas 通过 Internet Explorer 获得画布支持。你只需要包含这个 JavaScript ,如下所示 -
HTML Canvas - 绘制矩形
有三种方法可以在画布上绘制矩形:
方法 | 描述 |
---|---|
fillRect(x,y,width,height) | 此方法绘制一个填充的矩形。 |
strokeRect(x,y,width,height) | 此方法绘制矩形轮廓。 |
clearRect(x,y,width,height) | 此方法清除指定区域并使其完全透明 |
此处,x 和 y 指定矩形左上角在画布上的位置(相对于原点),宽度和高度是矩形的宽度和高度。
例子
下面利用上面提到的方法来绘制一个漂亮的矩形。
HTML Canvas - 绘图路径
我们需要以下方法在画布上绘制路径:
方法 | 描述 |
---|---|
beginPath() | 此方法重置当前路径。 |
moveTo(x, y) | 此方法使用给定点创建新的子路径。 |
closePath() | 此方法将当前子路径标记为闭合,并启动新子路径,其点与新闭合子路径的起点和终点相同。 |
fill () | 此方法使用当前填充样式填充子路径。 |
stroke() | 此方法使用当前描边样式描边子路径。 |
arc(x, y, radius, startAngle, endAngle, anticlockwise) | 向子路径添加点,使得由参数描述的圆的周长描述的圆弧(从给定的起始角度开始,到给定的结束角度结束,沿给定方向前进)被添加到路径中,通过直线连接到前一个点。 |
例子
下面是利用上面提到的方法来绘制一个形状。
HTML Canvas - 画线
Line 方法
我们需要以下方法在画布上画线:
方法 | 描述 |
---|---|
beginPath() | 此方法重置当前路径。 |
moveTo(x, y) | 此方法使用给定点创建新的子路径。 |
closePath() | 此方法将当前子路径标记为闭合,并启动新子路径,其点与新闭合子路径的起点和终点相同。 |
fill() | 此方法使用当前填充样式填充子路径。 |
stroke() | 此方法使用当前描边样式描边子路径。 |
lineTo(x, y) | 此方法将给定点添加到当前子路径中,通过直线连接到前一个子路径。 |
例子
下面利用上述方法绘制一个三角形。
HTML Canvas - 绘制贝塞尔曲线
我们需要以下方法在画布上绘制贝塞尔曲线:
方法 | 描述 |
---|---|
beginPath() | 此方法重置当前路径。 |
moveTo(x, y) | 此方法使用给定点创建新的子路径。 |
closePath() | 此方法将当前子路径标记为闭合,并启动新子路径,其点与新闭合子路径的起点和终点相同。 |
fill() | 此方法使用当前填充样式填充子路径。 |
stroke() | 此方法使用当前描边样式描边子路径。 |
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) | 此方法将给定点添加到当前路径中,通过具有给定控制点的立方贝塞尔曲线连接到前一个路径。 |
bezierCurveTo() 方法中的 x 和 y 参数是终点的坐标。CP1x 和 CP1Y 为第一控制点的坐标,CP2X 和 CP2Y 为第二控制点的坐标。
例子
下面利用上面提到的方法来绘制贝塞尔曲线。
HTML Canvas - 绘制二次曲线
我们需要以下方法在画布上绘制二次曲线:
方法 | 描述 |
---|---|
beginPath() | 此方法重置当前路径。 |
moveTo(x,y) | 此方法使用给定点创建新的子路径。 |
closePath() | 此方法将当前子路径标记为闭合,并启动新子路径,其点与新闭合子路径的起点和终点相同。 |
fill() | 此方法使用当前填充样式填充子路径。 |
stroke() | 此方法使用当前描边样式描边子路径。 |
quadraticCurveTo(cpx, cpy, x, y) | 此方法将给定点添加到当前路径中,通过具有给定控制点的二次贝塞尔曲线连接到前一个路径。 |
quadraticCurveTo() 方法中的 x 和 y 参数是终点的坐标。cpx 和 cpy 是控制点的坐标。
例子
下面利用上述方法来绘制二次曲线。
HTML Canvas - 使用图像
如何将外部图像导入画布,然后使用以下方法在该图像上绘图:
方法 | 描述 |
---|---|
beginPath() | 此方法重置当前路径。 |
moveTo(x,y) | 此方法使用给定点创建新的子路径。 |
closePath() | 此方法将当前子路径标记为闭合,并启动新子路径,其点与新闭合子路径的起点和终点相同。 |
fill() | 此方法使用当前填充样式填充子路径。 |
stroke() | 此方法使用当前描边样式描边子路径。 |
drawImage(image,dx,dy) | 此方法将给定的图像绘制到画布上。这里的 image 是对图像或画布对象的引用。x 和 y 构成了目标画布上的坐标,我们的图像应该被放置在那里。 |
例子
下面使用上述方法来导入图像。
HTML Canvas - 创建渐变
利用以下方法使用线性和径向渐变填充和描边形状:
方法 | 描述 |
---|---|
addColorStop(offset, color) | 此方法将具有给定颜色的色标添加到给定偏移处的渐变中。这里 0.0 是梯度一端的偏移量,1.0 是另一端的偏移量。 |
createLinearGradient(x0, y0, x1, y1) | 此方法返回一个 CanvasGradient 对象,该对象表示沿参数表示的坐标给出的线绘制的线性渐变。这四个参数表示梯度的起点 (x1,y1) 和终点 (x2,y2)。 |
createRadialGradient(x0, y0, r0, x1, y1, r1) | 此方法返回一个 CanvasGradient 对象,该对象表示径向渐变,该径向渐变沿参数表示的圆给出的圆锥体绘制。前三个参数定义一个坐标为 (x1,y1) 和半径 r1 的圆,第二个参数定义一个坐标为 (x2,y2) 和半径 r2 的圆。 |
示例 - 线性梯度
下面利用上述方法来创建线性梯度。
示例 - 径向梯度
下面利用上述方法来创建径向渐变。
HTML Canvas - 样式和颜色
将颜色应用于形状的两个重要属性:
方法 | 描述 |
---|---|
fillStyle | 此属性表示要在形状中使用的颜色或样式。 |
strokeStyle | 此属性表示用于形状周围线条的颜色或样式 |
默认情况下,描边和填充颜色设置为黑色,即 CSS 颜色值 #000000 。
示例 - fillStyle
下面利用上面提到 fillStyle 属性来创建一个漂亮的模式。
示例 - strokeStyle
下面利用上面提到的 fillStyle 属性来创建另一个漂亮的模式。
HTML Canvas - 文本和字体
使用不同字体和文本属性创建文本的功能:
字体属性 | 描述 |
---|---|
font [ = value ] | 返回当前字体设置,可以设置以更改字体。 |
textAlign [ = value ] | 返回当前文本对齐设置,可以设置此属性以更改对齐方式。可能的值为 start、end、left、right 和 center。 |
textBaseline [ = value ] | 返回当前基线对齐设置,可以设置此属性以更改基线对齐方式。可能的值为 top、hanging、middle、alphabeticic、ideographic 和 bottom |
fillText(text, x, y [, maxWidth ] ) | 在给定坐标 x 和 y 指示的给定位置填充给定文本。 |
strokeText(text, x, y [, maxWidth ] ) | 在给定坐标 x 和 y 指示的给定位置描边给定文本。 |
例子
下面利用上面提到的属性来绘制文本:
HTML Canvas - 图案和阴影
创建图案
在画布上创建图案需要以下方法:
方法 | 描述 |
---|---|
createPattern(image, repetition) | 将使用 image 创建模式。第二个参数可以是具有以下值之一的字符串:repeat、repeat-x、repeat-y 和 no-repeat。如果指定了空字符串或 null,则重复 will。 |
例子
下面利用上面提到的方法来创建一个漂亮的模式。
假设我们有以下模式:

创建阴影
在绘图周围创建漂亮阴影的功能。所有绘图操作都受四个全局阴影属性的影响。
属性 | 属性和描述 |
---|---|
shadowColor [ = value ] | 返回当前阴影颜色,可以设置此属性以更改阴影颜色。 |
shadowOffsetX [ = value ] | 返回当前阴影偏移量 X,并且可以设置此属性以更改阴影偏移量 X。 |
shadowOffsetY [ = value ] | 返回当前阴影偏移量 Y,并且可以设置、更改阴影偏移量 Y。 |
shadowBlur [ = value ] | 返回应用于阴影的当前模糊级别,可以设置此属性以更改模糊级别。 |
例子
下面利用上述属性来绘制阴影。
HTML Canvas - 保存和恢复状态
保存和恢复画布状态的两种方法,画布绘图状态基本上是已应用的所有样式和转换的快照,由以下内容组成 -
- 转换,如平移、旋转和缩放等。
- 当前剪切区域。
- 以下属性的当前值 - strokeStyle、fillStyle、globalAlpha、lineWidth、lineCap、lineJoin、miterLimit、shadowOffsetX、shadowOffsetY、shadowBlur、shadowColor、globalCompositeOperation、font、textAlign、textBaseline。
每次调用 save 方法时,画布状态都会存储在堆栈上,每次调用 restore 方法时,都会从堆栈中返回上次保存的状态。
方法 | 描述 |
---|---|
save() | 将当前状态推送到堆栈上。 |
restore() | 在堆栈上弹出顶部状态,将上下文还原到该状态。 |
例子
下面显示如何调用还原,以恢复原始状态,并再次将最后一个矩形绘制为黑色。
HTML Canvas - translate
translate(x,y) 方法用于将画布及其原点移动到网格中的不同点。
这里的参数 x 是画布向左或向右移动的量,y 是它向上或向下移动的量
例子
下面绘制各种 Spirographs——
HTML Canvas - 旋转
rotate(angle) 方法用于围绕当前原点旋转画布。
此方法仅采用一个参数,即画布旋转的角度,以弧度为单位的顺时针旋转。
例子
下面运行两个循环,其中第一个循环决定了环的数量,第二个循环决定了每个环中绘制的点数。
HTML Canvas - 缩放
scale(x,y) 方法用于增加或减少 canvas 网格中的单位。这可用于绘制缩小或放大的形状和位图。
此方法采用两个参数,其中 x 是水平方向的比例因子,y 是垂直方向的比例因子。这两个参数都必须是正数。
小于 1.0 的值会减小单位大小,大于 1.0 的值会增加单位大小。将比例因子精确设置为 1.0 不会影响单位大小。
例子
下面绘制九个具有不同比例因子的形状。
HTML Canvas - 转换
直接修改转换矩阵的方法。转换矩阵最初必须是标识转换。然后可以使用转换方法对其进行调整。
方法 | 描述 |
---|---|
transform(m11, m12, m21, m22, dx, dy) | 更改转换矩阵以应用参数给出的矩阵。 |
setTransform(m11, m12, m21, m22, dx, dy) | 将变换矩阵更改为参数给出的矩阵。 |
变换 (m11, m12, m21, m22, dx, dy) 方法必须将当前变换矩阵乘以 −
m12 m22 dy
0 0 1
setTransform(m11, m12, m21, m22, dx, dy) 方法必须将当前变换重置为单位矩阵,然后使用相同的参数调用 transform(m11, m12, m21, m22, dx, dy) 方法。
例子
下面是一个使用 transform() 和 setTransform() 方法的简单示例 −
HTML Canvas - 组合
影响所有绘图操作的组合属性 globalCompositeOperation。
在现有形状后面绘制新形状并遮罩某些区域,使用 globalCompositeOperation 属性从画布上清除部分。
可以为 globalCompositeOperation 设置以下值 :
属性 | 描述 |
---|---|
source-over | 这是默认设置,可在现有画布内容上绘制新形状。 |
source-in | 仅当新形状和目标画布重叠时,才会绘制新形状。其他一切都是透明的。 |
source-out | 新形状的绘制位置与现有画布内容不重叠。 |
source-atop | 仅绘制新形状与现有画布内容重叠的位置。 |
lighter | 如果两个形状重叠,则通过添加颜色值来确定颜色。 |
xor | 形状在重叠的地方变得透明,并在其他任何地方绘制正常。 |
destination-over | 新形状绘制在现有画布内容后面。 |
destination-in | 现有画布内容将保留在新形状和现有画布内容重叠的地方。其他一切都是透明的。 |
destination-out | 现有内容将保留在不与新形状重叠的位置。 |
destination-atop | 现有画布仅保留在与新形状重叠的地方。新形状绘制在画布内容后面。 |
darker | 如果两个形状重叠,则通过减去颜色值来确定颜色。 |
例子
下面利用 globalCompositeOperation 属性创建所有可能的组合:
HTML Canvas - 动画
绘制图像并完全擦除图像的方法,借助 Javascript 在 HTML 画布上模拟良好动画。
在画布上为图像制作动画的两种 Javascript 方法:
方法 | 描述 |
---|---|
setInterval(callback, time); | 在给定的时间毫秒后重复执行提供的代码。 |
setTimeout(callback, time); | 仅在给定时间毫秒后执行一次提供的代码。 |
例子
下面是一个重复旋转小图像的简单示例: