使用:
canvas坐标系,从最左上角0,0开始。x向右增大, y向下增大
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HUKiRn9C-1574590305291)(img/canvas-x-y.png “canvas坐标系”)]
上下文:工具包,是所有的绘制操作api的入口或者集合
var canvas = document.querySelector('canvas');
var ctx = canvas.getContext('2d'); //注意:2d小写, 3d:webgl
moveTo(x,y) 设置绘制路径的起点(移动画笔位置)
lineTo(x,y) 画线
closePath() 闭合路径,必须闭合路径才能成功填充
beginPath() 开启一个新状态,基于之前的状态开启新的状态,新的状态会保持之前的设置
ctx.beginPath();
//开启新的状态后,当设置新的值时,只会作用于当前状态,不会影响之前的状态
ctx.lindeWidth = 2;
ctx.strokeStyle = '#ddd';
rect(x,y,width,height) 绘制矩形路径
x, y是矩形左上角坐标, width和height都是以像素计(下同)
PS: rect方法只是规划了矩形的路径,并没有填充和描边
PS:重新设置canvas的宽/高也能达到清空的效果
弧度和角度的转换公式: rad = deg*Math.PI/180;
在Math提供的方法中sin、cos等都使用的弧度
1、获得画布
var canvas = document.getElementById( 'cavsElem' );
2、获得canvas上下文
var ctx = canvas.getContext( '2d' );
3、绘制路径
//设置绘制起点(移动画笔位置)
ctx.moveTo(100,100);
ctx.lineTo(200,100);
ctx.lineTo(100,200);
4、设置样式
//设置线宽
ctx.lineWidth = 4;
//设置描边样式(默认黑色)
ctx.strokeStyle = 'red';
//设置填充样式(默认黑色)
ctx.fillStyle = '#f60';
5、描边/填充
ctx.stroke();
ctx.fill();
PS:fill()方法会自动闭合路径
font 设置或返回文本内容的当前字体属性,语法与CSS相同
textAlign 设置或返回文本内容的当前对齐方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FN2GeUi9-1574590305292)(img/textAsign.png “textAlign示意图”)]
textBaseline 设置或返回在绘制文本时使用的当前文本基线
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9eVFCtBi-1574590305293)(img/font-baseline.png “textBaseline示意图”)]
ctx.drawImage(img,x,y);
参数:
x,y 绘制图片左上角的坐标,
img是绘制图片的dom对象。
ctx.drawImage(img,x,y,width,height);
参数:
width 绘制图片的宽度,
height:绘制图片的高度
如果指定宽高,最好成比例,不然图片会被拉伸
等比公式: height = 原高度*width/原宽度;
ctx.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);
参数:
sx,sy 裁剪的左上角坐标,
swidth:裁剪图片的高度。
sheight:裁剪的高度
示例:
ctx.fillStyle = '#fc0';
ctx.shadowColor = '#333';
ctx.shadowBlur = 50;
ctx.shadowOffsetX = 5;
ctx.shadowOffsetY = 5;
ctx.fillRect(100,100,100,100);
线性渐变是一个对象
语法:ctx.createLinearGradient(x0,y0,x1,y1);
参数:x0,y0起始坐标,x1,y1结束坐标
addColorStop(stop,color)
//创建线性渐变的对象,
var grd=ctx.createLinearGradient(0,0,170,0);
//添加一个渐变颜色,
//参数1:0.0 与 1.0 之间的值,表示渐变中开始与结束之间的位置。
//参数2:具体颜色
grd.addColorStop(0,"black");
//添加一个渐变颜色
grd.addColorStop(1,"white");
//关键点,把渐变设置到 填充的样式
ctx.fillStyle =grd;
var rlg = ctx.createRadialGradient(300,300,10,300,300,200);
//添加一个渐变颜色
rlg.addColorStop(0, '#ccc');
rlg.addColorStop(.4, '#efefef');
rlg.addColorStop(1, '#fff');
//设置 填充样式为延续渐变的样式
ctx.fillStyle = rlg;
ctx.fillRect(100, 100, 500, 500);
ctx.createPattern(img,repeat) 方法在指定的方向内重复指定的元素了解
var ctx=c.getContext("2d");
var img=document.getElementById("lamp");
var pat=ctx.createPattern(img,"repeat");
ctx.rect(0,0,150,100);
ctx.fillStyle=pat;// 把背景图设置给填充的样式
ctx.fill();
注意:画布变换仅仅是改变画布状态,不会影响之前画布上的内容
缩放
scale(scaleWidth,scaleHeight) 方法缩放当前绘图,参数为0~1的值
位移画布
translate(x,y) 方法重新映射画布上的 (0,0) 位置
旋转
rotate(angle) 方法旋转当前的绘图,注意参数是弧度
ctx.save() 保存当前环境的状态
可以把当前绘制环境context保存到缓存中。
ctx.restore() 返回之前保存过的路径状态和属性
获取最近通过save()方法缓存的context
PS:必须在服务器环境下使用
var canvas = document.getElementById("canvas");
var dataURL = canvas.toDataURL();
var img = document.querySelector("img");
img.src = canvas.toDataURL("image/png");//将画布的内容赋值给图片的src属性
quadraticCurveTo(cpx,cpy,x,y)
bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)
提示:三次贝塞尔曲线需要三个点。前两个点是用于三次贝塞尔计算中的控制点,第三个点是曲线的结束点