【笔记】Canvas学习笔记

前言

画布(canvas)元素是HTML5的一部分,允许脚本语言(scripting languages)动态渲染位图像。(维基百科

定义画布

  • Canvas内部文本内容只有不支持的浏览器才会渲染
  • 不要使用CSS设置宽高,而要使用标签属性设置宽高,否则宽高会拉伸画布,使画布失真
  • Canvas的像素化:每当使用Canvas绘制了一个图形,Canvas就会像素化图形,Canvas没有能力从画布上再次更改已经在画布上的内容
  • Canvas画布上绘制动画:按照清屏->更新->渲染的逻辑进行编程

width:指定画布宽度,单位为px且可以省略,缺省值为300
height:指定画布高度,单位为px且可以省略,缺省值为150

1
<canvas width="" height="">文本内容</canvas>

获取上下文对象

2d:2D绘制上下文
3d:3D绘制上下文

1
2
let canvas = document.querySelector("canvas");
let ctx = canvas.getContext("2d");

创建路径起点

1
ctx.beginPath();

闭合路径

1
ctx.closePath();

移动画笔

1
ctx.moveTo(<x>, <y>);

绘制路径

设置画笔

设置描边颜色

1
ctx.fillStyle = "<color>";
渐变
线性渐变

<x_start>:开始点x轴坐标
<y_start>:开始点y轴坐标
<x_end>:结束点x轴坐标
<y_end>:结束点y轴坐标
<num>:颜色位置,取值范围为[0,1]
<color>:颜色值字符串

1
2
3
4
5
let linear = ctx.createLinearGradient(<x_start>, <y_end>, <x_end>, <y_end>);
linear.addColorStop(<num>, "<color>");
linear.addColorStop(<num>, "<color>");
// 将颜色赋值给画笔
ctx.fillStyle = linear;
径像渐变

<x_start>:开始点圆心x轴坐标
<y_start>:开始点圆心y轴坐标
<r_start>:开始圆的半径
<x_end>:结束点圆心x轴坐标
<y_end>:结束点圆心y轴坐标
<r_end>:结束圆的半径
<num>:颜色位置,取值范围为[0,1]
<color>:颜色值字符串

1
2
3
4
5
let linear = ctx.createRadialGradient(<x_start>, <y_start>, <r_start>, <x_end>, <y_end>, <r_end>);
linear.addColorStop(<num>, "<color>");
linear.addColorStop(<num>, "<color>");
// 将颜色赋值给画笔
ctx.fillStyle = linear;
阴影

<x>:阴影水平方向偏移量,默认值为0,负数向左,正数向右
<y>:阴影垂直方向偏移量,默认值为0,负数向上,正数向下
<num>:模糊效果,默认值为0
<color>:阴影的颜色

1
2
3
4
ctx.shadowOffsetX = <x>;
ctx.shadowOffsetY = <y>;
ctx.shadowBlur = <num>;
ctx.shadowColor = "<color>";

设置填充颜色

1
ctx.strokeStyle = "<color>";

设置线宽

1
ctx.lineWidth = <num>;

设置虚线

设置虚线比例

<num_1>:设置线的长度
<num_2>:设置空隙距离

1
ctx.setLineDash([<num_1>, <num_2>]);
设置起始偏移量
1
ctx.lineDashOffset = <num>;

设置透明度

<num>:1~0之间的数,1为不透明,0为透明

1
ctx.globalAlpha = <num>;

设置路径末端形状

1
ctx.lineCap = "";

取值

butt:缺省值,末端以方形结束
round:末端以圆形结束
square:末端以方形结束,但是增加了一个__宽度是线段相同,高度是线段厚度一半__的矩形区域

设置转折形状

1
ctx.lineJoin = "";

取值

miter:缺省值,尖角
round:圆角
bevel:平角

绘制直线

  • 从当前位置绘制直线到(,)位置
1
ctx.lineTo(<x>, <y>);

绘制圆弧

<x>:曲线圆心x轴坐标
<y>:曲线圆心y轴坐标
<radius>:圆的半径
<startAngle>:起始位置,如果是数字表示圆的弧度
<endAngle>:结束位置,如果是数字表示圆的弧度
<anticlockwise>:是否是顺时针,true顺时针,false逆时针

1
ctx.arc(<x>, <y>, <radius>, <startAngle>, <endAngle>, <anticlockwise>);

绘制矩形

  • 每当调用rect(),会自动设置原点为(0,0)

<x>:矩形左上角x轴坐标
<y>:矩形左上角y轴坐标
<width>:矩形的宽
<height>:矩形的高

1
ctx.rect(<x>, <y>, <width>, <height>);

路径上色

描边

1
ctx.stroke();

填充

1
ctx.fill();

绘制图形

绘制矩形

绘制填充矩形

<x>:矩形左上角x轴坐标
<y>:矩形左上角y轴坐标
<width>:矩形的宽
<height>:矩形的高

1
ctx.fillRect(<x>, <y>, <width>, <height>);

绘制描边矩形

1
ctx.strokeRect(<x>, <y>, <width>, <height>);

清除画布矩形区域

1
ctx.clearRect(<x>, <y>, <width>, <height>);

绘制文本

设置画笔

设置文本字体

<size>:字号,默认为10px
<family>:字体名,默认值为sans-serif

1
ctx.font = "<size> <family>";

设置文本对齐方式

1
ctx.textAlign = "";

取值

start:缺省值,文字方向为LTR(左到右)时,相当于left;文字方向为RTL(右到左)时,相当于right
end:文字方向为LTR(左到右)时,相当于right;文字方向为RTL(右到左)时,相当于left
left:文本内容基于x轴左对齐
right:文本内容基于x轴右对齐
center:文本内容基于x轴居中

设置基线

1
ctx.textBaseline = "";

取值

alphabetic:缺省值,文本内容英文基线与坐标位置对齐
hanging:文本内容悬挂基线与坐标位置对齐
ideographic:文本内容英文表意基线与坐标位置对齐
top:文本内容顶部与坐标位置对齐
middle:文本内容中间与坐标位置对齐
bottom:文本内容底部与坐标位置对齐

绘制填充文本

1
ctx.fillText("文本内容", <x>, <y>);

绘制图片

获取图片对象

创建图片对象

1
2
const img = new Image();
img.src = "";

从DOM获取img标签

1
const img = document.querySelector("img");

绘制图片

<image>:图片对象
<x>:图片左上角距离画布左上角的x轴坐标
<y>:图片左上角距离画布左上角的y轴坐标

1
ctx.drawImage(<image>, <x>, <y>);

<width>:图片的宽度
<height>:图片的高度

1
ctx.drawImage(<image>, <x>, <y>, <width>, <height>);

<d_x>:裁剪图片起始位置的x轴坐标
<d_y>:裁剪图片起始位置的y轴坐标
<d_width>:裁剪图片的宽度
<d_height>:裁剪图片的高度

1
ctx.drawImage(<image>, <x>, <y>, <width>, <height>, <d_x>, <d_y>, <d_width>, <d_height>);

形变

  • 通过形变矩阵实现形变
1
ctx.transform(<a>, <b>, <c>, <d>, <e>, <f>);

平移

<x>:x轴坐标偏移量
<y>:y轴坐标偏移量

1
ctx.translate(<x>, <y>);

旋转

<num>:z轴的旋转弧度

1
ctx.rotate(<num>);

缩放

<x>:x轴缩放倍率
<y>:y轴缩放倍率

1
ctx.scale(<x>, <y>);

画布状态

将当前画布状态保存为快照

1
ctx.save();

恢复到最近一次的快照

1
ctx.restore();

蒙版

1
ctx.globalCompositeOperation = "";

取值

destination-in:只显示旧图形∈新图形
destination-over:将新图形绘制在旧图形的底部
destination-out:只显示旧图形∉新图形
destination-atop:新图形绘制在旧图形底部的同时,只显示新图形的部分
source-in:只显示新图形∩旧图形
source-over:缺省值,将新图形绘制在旧图形的顶部
source-out:只显示新图形∉旧图形
source-atop:只显示非新图形∉旧图形

完成