canvas 画布

canvas是H5的新标签在页面上绘制图形用的(通常也称他画布),canvas只是一个容器,我们用JS脚本来控制他

语法:
<canvas id="draw" width="600" height="500"></canvas>
这是一个宽600px 高500px的canvas画布

在canvas的原型中有很多公有的方法和属性,下面来详细介绍canvas中几款常用的方法
首先来说一下使用canvas的步骤

先获取canvas标签

var draw=document.getElementById("draw");

第一步先创建(设置)绘制环境,2d绘制视图(目前不支持3D)

var cvs=draw.getContext("2d")

"cvs"这个就是你的画板,接下来就可以在cvs操作并进行绘制


常用的属性和方法

cvs.fillStyle 填充的样式

cvs.strokeStyle 触笔(或边框)的颜色

cvs.lineWidth 边框的宽度

绘制图形有两种方式

cvs.fill( ) 填充
cvs.stroke() 边框

色值color一共4种色值:
1.颜色名字如:"red"
2.十六进制如:"#ff6700"
3.三色值:rgb(255,255,255);
4.四色值:rgba(255,255,255,0.4)
在canvas中较为常用,几乎所有支持颜色的属性都支持这四种方法,甚至在多色渐变等场景中还可以混用

坐标以画布为准,距离画布上下距离是Y坐标值,距离画布的左右的距离是X坐标

cvs.moveTo(x,y) 起始点的坐标
cvs.lineTo(x,y) 结束点坐标

如果没有moveTo就把上一个挨着的lineTo作为起始坐标,假如第一个不是moveTo而是lineTo,那么lineTo就是起始坐标

起笔/封笔

cvs.beginPath() 开始下笔 设置一个新路径
cvs.closePath() 収笔 关闭当前路径 自动闭合,从结束坐标值到起始坐标自动连接
小例子:
function draw1() {
	var draw = document.getElementById("draw");
	var cvs = draw.getContext("2d");
	cvs.beginPath();
	cvs.moveTo(50,50);
	cvs.lineTo(150,50);
	cvs.closePath();
	cvs.strokeStyle="red";
	cvs.lineWidth=20;
	cvs.stroke();//以边框的形式显示出来
}
draw1();

css中有圆角border-radius,canvas中也有
设置线条交汇处的样式

cvs.lineJoin 
他有三个属性 尖角miter 斜角bevel 圆角round

设置一条线两端的样式

cvs.lineCap 三个属性 butt(默认 平角) round(圆角)  square(方角)

矩形填充

填充矩形

cvs.fillRect(x,y,w,h);

x,y这个矩形左上角的坐标
w,h 这个矩形的宽,高
注意:边框是从中间往两边算的,一半在里面,一半在外边
清除矩形某部分,清除的还是矩形

cvs..clearRect(20,100,40,40)
参数同设置矩形相同

用canvas画圆 arc属性

cvs.arc(x,y,r,star,end,n);

x,y: 表示圆心坐标

r : 表示圆的半径

star : 表示其实角度,以弧度计算(默认三点钟方向表示0度)

end : 结束角

n: 表示是否逆时针 ture/false 默认值(false 顺时针)

例子:
function draw2(){
		cvs.fillStyle="orangered";
		cvs.beginPath();
		cvs.arc(200,200,40,0,2*Math.PI);
		cvs.closePath();
		cvs.fill();
		cvs.strokeStyle="yellow";
		cvs.lineWidth=40;
		cvs.beginPath();
		cvs.arc(200,200,60,0,2*Math.PI);
		cvs.closePath();
		cvs.stroke();
	}
	draw2();
	>```

每次调用fill的时候,会将当次路径的其实点和结束点分别连接,填充闭合部分,所以说,以后在写每次路径结束的时候,记得关闭当前路径

function draw3(){
			cvs.strokeStyle="#ff6700";
			cvs.beginPath();
			cvs.lineWidth=2;
			cvs.arc(100,100,100,0,Math.PI/2);
			cvs.stroke();
			
			cvs.fillStyle="yellow";
			cvs.arc(300,300,80,0,Math.PI/2);
			cvs.closePath();
			cvs.fill();
			//每次调用fill的时候,会把当次路径的起始点和结束点分别连接,填充闭合部分
			//所以说,以后再写每次路径结束的时候,记得关闭当前路径
		}
		draw3();

颜色渐变

线性渐变

var CLG=cvs.createLinearGradient(x0,y0,x1,y1)
CLG.addColorStop(n,m)

x0: 表示渐变开始的x坐标
y0: 表示渐变开始的Y坐标
x1: 表示渐变结束的X坐标
y1: 表示渐变结束的Y坐标
n: 表示设置颜色的偏移量
m: 颜色

例子:
function draw1(){
		var CLG=cvs.createLinearGradient(0,0,0,200);
		CLG.addColorStop(0,"red");
		CLG.addColorStop(0.25,"yellow");
		CLG.addColorStop(0.5,"#ccc");
		CLG.addColorStop(0.75,"yellow");
		CLG.addColorStop(1,"red");
		cvs.fillStyle=CLG;
		cvs.fillRect(0,0,200,200);
	}
	draw1();

径向渐变,发散性渐变(从中间到两边)

cvs.createRadialGradient(x0,y0,r0,x1,y1,r1)

x0: 表示发散渐变开始中心的X坐标
y0: 表示发散渐变开始中心的Y坐标
r0: 表示发散渐变开始的半径
x1: 表示发散渐变结束中心的X坐标
y1: 表示发散渐变结束中心的Y坐标
r1: 发散结束的半径

例子:
	function draw2(){
	//CRG=cvs.createRadialGradient(200,200,100,200,200,10);
	var CRG=cvs.createRadialGradient(200,200,10,200,200,100)
		CRG.addColorStop(0,"#000");
		CRG.addColorStop(0.5,"orange");
		CRG.addColorStop(1,"red");
		cvs.fillStyle=CRG;
		cvs.fillRect(100,100,200,200);
	}
	//draw2();

阴影shadow

cvs.shadowOffsetX;表示阴影的横向偏移量(默认是0)
cvs.shadowOffsetY表示阴影的纵向偏移量(默认是0)
cvs.shadowColor阴影颜色
cvs.shadowBlur阴影的模糊范围(值越大越模糊)

function draw1(){
	cvs.shadowColor="#0000ff";
	cvs.shadowOffsetX=30;
	cvs.shadowOffsetY=20;
	cvs.shadowBlur=20;
	cvs.fillStyle="#449FDB";
	cvs.fillRect(50,50,100,100);
}
draw1();

绘制文本

设置字体样式:

cvs.font="字体大小font-size  font-family";

水平对齐方式

cvs.textAlign=""
属性值:start,end,right,center

垂直对齐方式

cvs.textBaseline=""
属性值: top,middle,hanging,bottom,alphabetic,ideographic

计算文本宽度

var text="12565"
var length=cvs.measureText(text);

填充文字

cvs.fillText(text,x,y);

绘制文字轮廓

cvs.strokeText(text,x,y)
text:文本内容
x,y:文字内容
function draw3(){
例子:
	var CLG =cvs.createLinearGradient(0,150,450,250);
	CLG.addColorStop(0,"red");
	CLG.addColorStop(0.25,"yellow");
	CLG.addColorStop(0.5,"green");
	CLG.addColorStop(0.75,"yellow");
	CLG.addColorStop(1,"red");
	var text="hello world";
	cvs.fillStyle=CLG;
	cvs.shadowOffsetX=5;
	cvs.shadowOffsetY=4;
	cvs.shadowColor="#FFb6c1";
	cvs.shadowBlur=5;
	cvs.font="40px cursive";
	cvs.textAlign="start";
	cvs.textBaseline="top";
	cvs.fillText(text,20,120);
	var wid=cvs.measureText(text).width;
	cvs.fillText("Zitichangduwei:"+wid,0,170);
}
draw3();

绘制图片

cvs.drawImage(Image,x,y,w,h)

Image:就是可以放在Dom中的真实图片,可以是动态创建,也可以获取页面上现有的
**X,Y: **图片左上角的坐标
W,H:绘制图片的宽高


图片的截取

cvs.drawImage(Image,sx,sy,sw,sh,dx,dy,dw,dh);
	**sx,sy:**   图片左上角的坐标
**sw,sh:**   矩形区域的宽高,用来截取图片
**dx,dy:**   截取出来放在canvas上的坐标
**dw,dh:**   画在canvas上的宽高
**sx,sy,sw,sh:** 是截取图片的过程
**dx,dy,dw,dh:** 把截取出的图片放在canvas上的过程
例子:
function draw1(){
	var img=new Image();
	img.src="img/default.gif";
	img.onload=function(){
		cvs.drawImage(this,0,100,100,75)
	}
}
//draw1();
function draw2(){
	var img=new Image();
	img.src="img/1.jpg";
	img.onload=function(){
		cvs.drawImage(this,480,150,440,410,0,0,200,200);
		cvs.drawImage(this,70,80,400,400,200,0,200,200);
		cvs.drawImage(this,480,150,440,410,400,0,200,200);
		cvs.drawImage(this,70,80,400,400,600,0,200,200);
	}
}
//draw2();

设置平铺

cvs.createPattern(Image,type)

Image:就是可以放在DOM中的真实图片,可以动态创建,也可以获取页面上的
type: no-repeat不平铺 ,repeat 全方向平铺
repeat-x x轴方向平铺
repeat-y y轴方向平铺

例子
function draw3(){
	var img=new Image;
	img.src="img/default.gif";
	img.onload=function(){
		var rep=cvs.createPattern(this,"repeat");
		cvs.fillStyle=rep;
		cvs.fillRect(0,0,draw.width,draw.height)
	}
}
draw3()
>```

画布的平移/旋转/缩放

注意:平移,缩放,旋转这些都是对原始坐标操作的

平移:
cvs.translate(x,y);

**x:**坐标原点向x轴平移的距离

y:坐标原点向y轴平移的距离

缩放:vas.scale(x0,y0);

x0:x轴按照x0的比例缩放

y0:y轴按照y0的比例缩放

旋转:cvs.rotate(angle);

angle:坐标轴转的角度(跟画圆的弧度计算是一样的)

例子function draw2(){
cvs.scale(1,2);
cvs.fillStyle="#800080";
cvs.fillRect(100,50,100,50)
}
//draw2();

图形组合

cvs.globalCompositeOperation=type;

type的值:
1.source-over:默认值 在原来的图形上绘制新图(覆盖的意思)

2.destination-over:在原来的图形下面绘制新图

3.source-in:显示交集,颜色就是新图的颜色

4.source-out:显示的新图非交集部分

5.destination-in:显示交集,颜色就是旧图的颜色

6.destination-out:显示的旧图非交集部分

7.source-atop:显示旧图和交集部分, 交集是新图的颜色

8.destination-atop:显示新图和交集部分,交集是旧图的颜色

9.lighter:全部显示,交集是二者颜色叠加

10.xor:显示全部非交集部分

11.copy:只显示新图

小例子:
var draw = document.getElementById("draw");
	var cvs = draw.getContext("2d");
	var img = new Image;
	img.src = "img/11.png";
	img.onload = function() {
		var width = this.width / 10;
		var height = this.height;
		var i = 0;
		window.setInterval(function() {
			cvs.clearRect(0,0,draw.width,draw.height)
			cvs.drawImage(img, i * width, 0, width, height, 0, 0, width, height);
			if(i == 9) {
				i = 0
			} else {
				i++
			}
		}, 200);

	}
原文地址:https://www.cnblogs.com/Jiazexin/p/7080141.html