canvas入门
1. canvas是什么
Canvas
中文名叫 “画布”,是 HTML5
新增的一个标签。
Canvas
允许开发者通过 JS
在这个标签上绘制各种图案。
Canvas
拥有多种绘制路径、矩形、圆形、字符以及图片的方法。
Canvas
在某些情况下可以 “代替” 图片。
Canvas
可用于动画、游戏、数据可视化、图片编辑器、实时视频处理等领域。
2. 使用canvas绘制图形的步骤
a. 在html中创建canvas元素
b. 通过js获取canvas标签
c. 从canvas标签获取到绘图工具
d. 通过绘图工具,在canvas标签上绘制图行
<canvas id="cvs"></canvas> // 步骤a
<script>
let cvs = document.getElementById('cvs') // 步骤b
let ctx = cvs.getContext('2d'); // 步骤c
<!-- 步骤d -->
ctx.moveTo(100, 100); // 起点坐标
ctx.lineTo(200, 100); // 下一个点的坐标
ctx.stroke(); // 将所有坐标用一条线连起来
</script>
**注意:**canvas有默认宽高300px*150px,不能使用css设置canvas宽高,否则内容会被拉伸(canvas提供了width height两个属性设置宽高)
3. 坐标系
与数学中的坐标系y轴相反(y轴正方向向下,原点在浏览器的左上角)
4. 线
线条的默认宽度是 1px,默认颜色是黑色(但由于默认情况下 canvas 会将线条的中心点和像素的底部对齐,所以会导致显示效果是 2px和非纯黑色问题)
-
lineWidth: 线的粗细
-
strokeStyle: 线的颜色
-
lineCap: 线帽,线两端的形状设置了该值线条会稍长一点(默认:butt; 圆形: round;方形: square)
-
lineJoin: 拐角样式(默认值:miter尖角;round:圆角;bevel:斜角)
-
setLineDash(): 将线条变为虚线,需传入一个数值类型的数组(数组只有一个元素:实线与空白都是该值; 数组有两个元素:实线是元素一,虚线是元素二)
-
lineDashOffset(): 设置虚线起始偏移量
-
beginPath(): 新开路径;
在绘制多条线段且样式不同时需要开辟新路径,否则各个线条样式之间会相互污染;
使用beginPath()方法重新开一个路径,并设置新线段的样式(必须);
let cvs = document.getElementById('cvs')
let ctx = cvs.getContext('2d');
ctx.moveTo(100, 50);
ctx.lineTo(290, 50);
ctx.stroke();
ctx.moveTo(100, 80.5);
ctx.lineTo(290, 80.5);
ctx.stroke();
// 虚线
ctx.beginPath();
ctx.moveTo(50, 100);
ctx.lineTo(290, 100);
ctx.setLineDash([10])
ctx.stroke();
5. 矩形
可以使用前面的线段绘制矩形,canvas也提供了rect()方法直接生成矩形。
// 线段方式
let cvs = document.getElementById('cvs')
let ctx = cvs.getContext('2d');
ctx.moveTo(100, 100);
ctx.lineTo(200, 100);
ctx.lineTo(200, 200);
ctx.lineTo(100, 200);
ctx.lineTo(100, 100); // 需要再设置一次起点坐标进行闭合 或者推荐使用closePath()方法
ctx.stroke();
rect()方法:参数一、二分别对应起点(左上角)坐标X、Y的值,参数三、四表示矩形的宽高
// rect(x, y, width, height)
ctx.rect(150, 50, 50, 99);
ctx.stroke();
strokeRect(); 描边矩形;(用法、参数都同rect())
fillRect(); 填充矩形;
clearRect(); 清空指定区域(使用 ctx.clearRect(0, 0, cvs.width, cvs.height) 可以清空整个canvas);
6. 多边形
绘制多边形需要结合使用moveTo()、 lineTo()、 closePath();
7. 圆形(弧线)
绘制圆形的方法是arc(); ( 绘制曲线bezierCurveTo() )
arc(x, y, r, sAngle, eAngle,counterclockwise)
// x, y 是圆心坐标
// sAngle, eAngle是开始角度 结束角度(以弧度为单位。例如 180°就写成 Math.PI ,360°写成 Math.PI * 2 )
// counterclockwise 绘制方向,默认false(true: 逆时针,false: 顺时针)
注意: 绘制圆形之前必须先调用beginPath()方法;绘制完之后还需调用closePath()方法;
let cvs = document.getElementById('cvs')
let ctx = cvs.getContext('2d');
ctx.beginPath();
ctx.arc(100, 100, 50, 0, 360 * Math.PI / 180, false);
ctx.closePath(); // 不调用closePath()就可以绘制弧线
ctx.stroke();
8. 文本
可设置文本样式、描边、填充、对齐方式等
样式:font
cxt.font = 'font-style font-variant font-weight font-size/line-height font-family'
描边:strokeText()
/**
text: 要描边的文本
x: 横坐标,文本左边要对齐的坐标
y: 纵坐标, 文本底部要对齐的坐标
maxWidth: 可选,文本最大渲染宽度,超出文本会被压缩
**/
strokeText(text, x, y, maxWidth)
填充:fillText() 语法同描边
<canvas id="canvas"></canvas>
<script>
let cvs = document.getElementById('canvas')
let ctx = cvs.getContext('2d'); // 获取webgl上下文
ctx.font = '40px Arial'
ctx.strokeStyle = 'red' // 设置描边颜色
ctx.strokeText('hello', 100, 100)
ctx.fillStyle = 'black' // 设置填充颜色
ctx.fillText('hello', 100, 100)
</script>
计算文本宽度:measureText(text)
ctx.measureText('hello world!').width
9. 图片
可用于渲染图片、设置图片宽高、截取图片等
渲染图片:
语法:
// image: 图片对象
// ltx: 图片左上角的横坐标位置
// lty: 图片左上角的纵坐标位置
drawImage(image, ltx, lty)
<canvas id="canvas" width="1500" height="1500"></canvas>
<script>
let cvs = document.getElementById('canvas')
let ctx = cvs.getContext('2d'); // 获取webgl上下文
const image = new Image(); // 1. 创建image对象
image.src = './微信图片_20220620163205.png'; // 2. 引入图片
image.onload = () => { // 3. 加载图片
ctx.drawImage(image, 100, 100); // 使用drawImage()方法渲染
}
</script>
设置图片宽高:只需加多两个参数~
drawImage(image, ltx, lty, w, h); // w h分别表示图片宽高
**截取图片:**参数多了, 顺序也变了
// sx, sy, sw, sh分别表示: 开始截取的横坐标、纵坐标,截取的宽高
drawImage(image, sx, sy, sw, sh, ltx, lty, w, h)
ctx.drawImage(image, 50, 300, 300, 300, 200, 200, 200, 200);
10. 渐变:
线性渐变: createLinearGradient(x1, y1, x2, y2)
放射渐变: createRadialGradient(x1, y1, r1, x2, y2, r2)
创建线性渐变的步骤:
a. 使用 createLinearGradient() 方法创建一个指定了开始和结束点(两点确定一条直线)的 CanvasGradient 对象;
b. 使用 CanvasGradient 对象上的 addColorStop()方法添加起始色标;
c. 把 CanvasGradient 对象赋值给strokeStyle 或 fillStyle属性;
let cvs = document.getElementById('canvas')
let ctx = cvs.getContext('2d'); // 获取canvas 平面 上下文
var gradient = ctx.createLinearGradient(0,0,200,0); // 步骤a
gradient.addColorStop(0,"green"); // 步骤b
gradient.addColorStop(1,"blue");
ctx.fillStyle = gradient; // 步骤c
ctx.fillRect(10,10,200,100);
以上只是canvas的一些基础语法,还有投影、滤镜等高级玩法;
更多详细语法请参考:https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D