canvas是一种基于javascript的绘图api。而是svg和VML是使用XML来进行描述绘图。各有缺点和优势。svg绘图时容易编辑,只要重描述中移除元素就行,而canvas要移除原有的元素进行重新绘制。

# 1、颜色、样式及阴影设置

属性 描述
fillStyle 设置或返回用于填充绘画的颜色、渐变或模式(对应着面)
strokeStyle 设置或返回用于笔触的颜色、渐变或模式(对应着线)
shadowColor 设置或返回用于阴影的颜色
shadowBlur 设置或返回用于阴影的模糊级别(该属性必须在fill或者fillRect之前设置才有用)
shadowOffsetX 设置或返回阴影距形状的水平距离
shadowOffsetY 设置或返回阴影距形状的垂直距离

ctx.fillStyle=color|gradient|pattern;
//默认值是白色
ctx.strokeStyle=color|gradient|pattern;
//默认值是白色
1
2
3
4
5
  • color:指示绘图笔触的CSS颜色值 (opens new window)。默认值是#000000。常见表示方式有"red"、FFFF"、rgb(1-255,1-255,1-255)以及rgba(1-255,1-255,1-255,0-1)

  • gradient:用于填充绘图的渐变对象 (opens new window)(线性或放射性)

  • pattern:用于创建pattern笔触的pattern对象。与设置样式配合使用的方法是填充绘制和边绘制。

# 2、线条样式设置

属性 描述
lineCap 设置或返回线条的结束端点样式。属性可以是round(末端为圆形)、butt(默认值,末端为平直的边缘)以及square(线条末端为正方向线帽)。
lineJoin 设置或返回两条线相交时,所创建的拐点类型。属性可以是bevel(斜角)、round(圆角)和miter(尖角)
lineWidth 设置或返回当前的线条宽度。
miterLimit 设置或返回最大的斜接长度。斜接长度值的是两条线交汇处内角和外交之间的距离。只有当lineJoin为miter时,miterLimit才有效.当斜接长度超过miterLimit的值时,边角会以lineJoin的bevel类型来显示。miterLimit属性的主要作用是为了避免斜接长度过长
    const canvas=document.querySelector("#demo");
    const ctx=canvas.getctx("2d");  
    ctx.beginPath();//起始一条路径,或重置当前路径
    ctx.lineWidth=10;
    ctx.lineJoin="round";
    ctx.moveTo(20,20);//将笔尖放置到指定点
    ctx.lineTo(100,100);
    ctx.closePath(); //或者ctx.stroke()
1
2
3
4
5
6
7
8

# 3、常与设置样式配合使用的方法

方法 描述
createLinearGradient(x0,y0,x1,y1) 创建线性渐变,(x0,y0)和(x1,y1)是渐变的开始位置和结束位置。返回的值可以直接赋值给fillStyle。
createPattern(img,"repeat repeat-x
createRadialGradient(x0,y0,r0,x1,y1,r1) 创建放射状/环形的渐变。x0,y0,r0表示的是渐变的开始的圆的x、y坐标以及开始的圆半径。x1,y1,r1表示的是渐变的结束的圆的x、y坐标以及结束的圆的半径。返回的值可以直接赋值给fillStyle。
addColorStop(0-1,color) 规定渐变对象中的颜色和停止位置,第一个参数的范围为0-1,第二个参数为颜色值。

# 4、形状设置

方法 描述
fill() 填充当前绘图(对应着面)
stroke() 绘制已定义的路径。(对应着线
beginPath() 起始一条路径或者是重置当前路径。(对应着线)
moveTo(x,y) 把路径移动到动画中的指定点,不创建线条。x、y对应着路径的目标位置的x、y坐标。
lineTo() 添加一个新点,然后在画布中创建从上一个点(lineTo或moveTo中的坐标点)到该点的线条。
closePath() 创建当前点到开始点的路径。一般用于闭合多边形
clip() 从原始画布剪切任意形状和尺寸的区域。
rect() 创建矩形
fillrect() 绘制被填充的矩形
strokeRect() 绘制矩形(无填充)
clearRect() 在指定的矩形内清除指定的像素
quadraticCurveTo(cpx,cpy,x,y) 创建二次贝塞尔曲线。(cpx,cpy)控制点的坐标;(x,y)结束点的坐标。
bezierCurveTo() 创建三次贝塞尔曲线
arc() 创建弧/曲线(主要是创建圆形或部分圆)
arcTo() 创建两切线之间的弧/曲线
/*1、设置矩形填充区域*/
const canvas=document.querySelector("#demo");
const ctx=canvas.getctx("2d");
ctx.fillStyle="red";
ctx.fillRect(0,0,200,200);
ctx.clearRect(0,0,100,100);//
//注意:fill()跟rect()方法一起使用时,相当于使用fillRect();但是clearRect()方法只能跟fillRect()起作用。
ctx.fillStyle="red";
ctx.rect(0,0,200,200);
ctx.fill();

//2、设置矩形线框区域*/
const canvas=document.querySelector("#demo");
const ctx=canvas.getctx("2d");
ctx.strokeStyle="red";
ctx.strokeRect(10,10,200,200);
ctx.stroke()
//3、绘制线条记闭合多边形*/
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.beginPath();//开始绘制线条
ctx.moveTo(20,20);//设定线条起始点(20,20)
ctx.lineTo(20,100);//移动到(20,100)位置
ctx.lineTo(70,100);//移动到(70,100)位置
ctx.closePath();//创建从当前点到起始点的路径
ctx.stroke();//将线条绘制到画布上
/*4、绘制贝塞尔曲线*/
ctx.beginPath();
ctx.moveTo(20,20);//贝塞尔曲线的开始点
ctx.quadraticCurveTo(20,100,200,20);//(20,100)表示贝塞尔曲线的控制点。(200,20)表示贝塞尔曲线的结束点
ctx.stroke();
/*5、绘制3次贝塞尔曲线*/
ctx.beginPath();
ctx.moveTo(20,20);//贝塞尔曲线的开始点
ctx.quadraticCurveTo(20,100200,100,200,20);//(20,100)表示贝塞尔曲线的控制点1。(200,100)表示贝塞尔曲线的控制点2。(200,20)表示贝塞尔曲线的结束点
ctx.stroke();

/*6、绘制矩形*/
/*x表示矩形左上角的坐标;y表示左上角的y坐标;width:矩形的宽度,以像素记;height:矩形的高度,以像素记*/
ctx.rect(x,y,width,height);
ctx.fillRect(x,y,width,height);
ctx.strokeRect(x,y,width,height);
ctx.clearRect(x,y,width,height);

/*7、绘制圆*/
ctx.arc(x,y,r,sAngle,eAngle,counterclockwise);
//x:圆的中心x坐标;y:圆的中心y坐标;r:圆的半径;sAngle:起始角,以弧度记(弧的圆形的三点钟位置为0度)。;eAngle:结束角,以弧度记。;counterclockwise:可选。规定应该逆时针还是顺时针绘图。False=顺时针(默认),true=逆时针。
/*创建实心圆*/
const canvas=document.querySelector("#demo");
const ctx=canvas.getctx("2d");
ctx.arc(100,75,50,0,2*Math.PI);
ctx.fillStyle="green"
ctx.fill();
/*创建空心圆*/
ctx.arc(100,75,50,0,2*Math.PI);
ctx.strokeStyle="green";
ctx.stroke();
/*8、创建两个切线之间的弧*/
ctx.beginPath();
ctx.moveTo(20,20);           // 创建开始点
ctx.lineTo(100,20);          // 创建水平线
ctx.arcTo(150,20,150,70,50); // 创建弧
ctx.lineTo(150,120);         // 创建垂直线
ctx.stroke();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

# 5、转换设置

方法 描述
scale(scalewidth,scaleheight) 缩放当前绘图至更大或更小。对绘图进行缩放,所有之后的绘图也会被缩放,定位也会被缩放,线框也会被缩放,都是在原来的基础上进行缩放的
rotate(angle) 旋转当前绘图。旋转角度以弧度计。一般使用degrees*Math.PI/180来计算弧度,是以(0,0)为基准点进行旋转的
translate() 重新映射画布上的(0,0)位置。
translate(a,b,c,d,ef) 替换当前的变换矩阵。a表示水平缩放绘图;b表示水平倾斜绘图;c表示垂直倾斜绘图;d表示垂直缩放绘图;e表示水平移动绘图;f表示垂直移动绘图。
setTransform(ab,c,d,ef) 将当前转换设置为单位矩阵。然后运行transform。参数意义跟transform的完全一样。不同的是transform是相对上一次的变换再次进行变换。而setTransform是在最开始的基准上进行变换。
    /*1、缩放*/
    ctx.strokeRect(5,5,25,15);
    ctx.scale(2,2);//x,y轴方向都缩放两倍
    ctx.strokeRect(5,5,25,15);//所以此时实际上运行的代码是ctx.strokeRect(5*2,5*2,25*2,15*2)
    ctx.scale(2,2);//在原来的基础上在x,y轴方向都缩放两倍,
    ctx.strokeRect(5,5,25,15);//所以此时实际上运行的代码是ctx.strokeRect(5*2*2,5*2*2,25*2*2,15*2*2)
    ctx.scale(2,2);
    ctx.strokeRect(5,5,25,15);

     /*2、旋转*/
     //注意:rotate()必须在fillRect()等方法之前调用,才能起到作用。
    ctx.rotate(20*Math.PI/180);//以(0,0)基准点,将下面的图形旋转20°。
    ctx.fillRect(50,20,100,50);

    /*3、重新设置基准点位置*/
    ctx.fillRect(10,10,100,50);
    ctx.translate(70,70);//将起点设置为(70,70)
    ctx.fillRect(10,10,100,50);//相当于设置(80,80,100,50)

    /*4、变换矩阵*/
    ctx.fillStyle="yellow";
    ctx.fillRect(0,0,250,100)
    //水平缩放参数为1,然后再x,y轴上分别移动10
    ctx.transform(1,1,0,1,10,10);
    ctx.fillStyle="red";
    ctx.fillRect(0,0,250,100);
    //相对于上一次的变换,在x,y轴上分别移动10
    ctx.transform(1,0,0,1,10,10);
    ctx.fillStyle="blue";
    ctx.fillRect(0,0,250,100);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 6、文本设置

属性 描述
font 设置或返回文本内容的当前属性
textAlign 设置或返回本文内容的当前对齐方式。值有start(文本在指定的位置开始,默认值)、end(文本在指定的位置结束)、center(文本的中心北放在指定位置)、left(文本左对齐)、right(文本右对齐)
textBaseLine 设置或返回在绘制文本时使用的当前文本基线。属性可以是alphabetIC、top、hanging、middle、ideaographic、bottom
//绘制文本
ctx.font="40px Arial";
ctx.fillText("hello world",10,50)
//用渐变色绘制文本
ctx.font="30px Verdana";
ctx.textAlign="center";
const gradient=ctx.createLinearGradient(0,0,300,0);
gradient.addColorStop(0,"red");
gradient.addColorStop(0.5,"blue");
gradient.addColorStop(1,"green");
ctx.strokeStyle=gradient;
ctx.strokeText("hello world",100,90);
//计算文本的宽度
 ctx.fillText("width:"+ctx.measureText("javascript").width,10,50);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
方法 描述
fillText(text,x,y,maxWidth) 在画布上绘制"被填充的"文本。(x,y)表示开始绘制文本的位置。text表示输出到画布上的文本。maxWidth是可选的,表示允许的最大文本宽度,以像素计。
strokeText() 在画布上绘制文本(无填充)
measureText(txt) 返回包含指定文本宽度的对象。

# 7、图像操作

方法 描述
drawImage() 在画布上绘制图像、画布或视频
createImageData() 创建新的、空白的imageData对象。
getImageData() 返回ImageData对象,该对象为画布上指定的矩形复制像素元素。
putImageData() 把图像数据 (从指定的ImageData对象)放回画布上。

# 8、状态保存及恢复

方法 描述
save() 保存当前Canvas画布状态并放在栈的最上面,可以使用restore()方法依次取出。绘图效果本身不会被保存,保存的只是绘画状态。包括当前矩阵变换、当前裁剪区域以及当前虚线设置和一些属性值。
restore() 依次从堆栈的上方弹出存储的canvas状态,如果没有任何存储的Canvas转态,则执行此方法没有任何变化。
Last Updated: 11/17/2020, 12:36:11 AM