```
容器:
<div style="width: 800px;margin:0 auto">
<canvas id="test" width="700" height="1200"></canvas>
</div>
```
```
获取canvas
const cnv = document.getElementById('test')
const cxt = cnv.getContext('2d')
```
1.绘制横线(实线或虚线)
```
// 横线
cxt.moveTo(20, 100)//起点
cxt.lineTo(200, 100)//终点
cxt.lineWidth = 10//线宽
cxt.strokeStyle = 'red'//描边填充颜色
cxt.lineCap = "round" //两端样式
// cxt.setLineDash([5,10,...])//设置虚线:数组:对应 实线-空白的距离
cxt.stroke()//连接起点和终点
```
2.设置拐角样式
```
cxt.beginPath()// 重新开启一个路径
cxt.moveTo(20, 120)//起点
cxt.lineTo(120, 120)
cxt.lineTo(120, 150)//终点
cxt.lineJoin = 'round'//拐角样式,可选:bevel(尖角),round(圆角),miter(默认)
cxt.lineWidth = 5//线宽
cxt.strokeStyle = 'green'//描边填充颜色
cxt.lineCap = "square" //两端样式
cxt.stroke()//连接起点和终点
```
![](https://img.kancloud.cn/4f/71/4f715e856939aa98ff09e98a738b4709_212x62.png)
3.折线
```
// 折线,通过每个点的坐标连接
cxt.beginPath()// 重新开启一个路径
cxt.strokeStyle = 'pink'//描边填充颜色
cxt.moveTo(250, 200)
cxt.lineTo(300, 250)
cxt.lineTo(350, 200)
cxt.lineTo(400, 250)
cxt.stroke()//连接起点和终点
```
![](https://img.kancloud.cn/d0/44/d0442c1b928b3d544db841beefa3c3cf_220x102.png)
4.矩形
```
// 矩形
// strokeRect(x, y, width, height) 方法
cxt.strokeStyle = 'pink'
cxt.strokeRect(50, 50, 200, 100)//长方形
cxt.strokeStyle = 'blue'
cxt.strokeRect(150, 200, 50, 50)//正方形
//颜色填充
cxt.fillStyle = 'pink'
cxt.fillRect(50, 250, 200, 100)
// cxt.clearRect(50, 50, 200, 100) // 清空矩形
```
5.多边形
```
// 多边形:cxt.closePath()闭合起始点,如:绘制一个三角形
cxt.beginPath()// 重新开启一个路径
cxt.strokeStyle = 'yellow'//描边填充颜色
cxt.lineWidth = 2
cxt.moveTo(50, 400)
cxt.lineTo(100, 450)
cxt.lineTo(50, 500)
cxt.closePath()
cxt.stroke()//连接起点和终点
```
![](https://img.kancloud.cn/69/84/698437295dc2fbfc95385a742cbc69ae_181x190.png)
6.圆
```
// 圆:
//方法:arc(x, y, r, sAngle, eAngle,counterclockwise)
// x 和 y: 圆心坐标
// r: 半径
// sAngle: 开始角度:都是以弧度为单位。例如 180°就写成 Math.PI ,360°写成 Math.PI * 2
// eAngle: 结束角度
// counterclockwise: 绘制方向(true: 逆时针; false: 顺时针),默认 false
cxt.beginPath();//绘制圆之前必须调用重新开始方法
cxt.strokeStyle = 'skyBlue'//描边填充颜色
cxt.arc(200, 450, 80, 0, 360 * Math.PI / 180)
// cxt.arc(200, 450, 80, 0, 180 * Math.PI / 180 ,true)//半圆且朝上
cxt.closePath();//结束必须调用闭合
cxt.stroke()
```
![](https://img.kancloud.cn/3e/7b/3e7be12a7060839a8f652bb1565de811_268x245.png)
7.圆弧
```
// 圆弧:就是圆不闭合
cxt.beginPath();//绘制圆之前必须调用重新开始方法
cxt.strokeStyle = 'skyBlue'//描边填充颜色
cxt.arc(260, 450, 80, 0, 30 * Math.PI / 180)//绘制一个30°的圆弧
cxt.stroke()
```
![](https://img.kancloud.cn/bf/7a/bf7adcd25d6f911d35212abc631c0956_76x133.png)
8.设置字体
```
// cxt.font = 'font-style font-variant font-weight font-size/line-height font-family'
cxt.font = '60px Arial'
cxt.strokeStyle = "orange"
cxt.strokeText('hello111', 500, 90)//描边方法:设置文本,位置:x,y
cxt.textAlign = 'center'//文本水平对齐方式
cxt.textBaseline = 'middle'//文本垂直对齐方式
cxt.fillStyle = 'yellow'//填充颜色
cxt.fillText('hello', 400, 90)//填充方法:设置文本
```
![](https://img.kancloud.cn/47/24/4724424a0fbc9aa8fe860b62da317e0e_617x167.png)
9.图片渲染
```
// 渲染图片的方式有两种,一种是在JS里加载图片再渲染,另一种是把DOM里的图片拿到 canvas 里渲染。
// JS渲染方式:1.创建 Image 对象 2.引入图片 3.等待图片加载完成 4.使用 drawImage() 方法渲染图片
const image = new Image()//实例化图片对象
image.src = './favicon .png'//引入图片
// 加载完成
image.onload = () => {
cxt.drawImage(image, 10, 20, 50, 50)//drawImage():三个参数:图片对象,左上角x坐标,左上角y坐标,宽,高
}
// dom渲染
window.onload = () => {
const image1 = document.getElementById('img')//获取图片对象
cxt.drawImage(image1, 400, 170, 50, 80)
}
```
![](https://img.kancloud.cn/5c/73/5c73751c94ab96008240000d5696a0aa_92x84.png)
10.截取图片
```
// 截取图片:drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)
// image: 图片对象 sx: 开始截取的横坐标 sy: 开始截取的纵坐标 sw: 截取的宽度 sh: 截取的高度
// dx: 图片左上角的横坐标位置 dy: 图片左上角的纵坐标位置 dw: 图片宽度 dh: 图片高度
// 截取时:参数缺一不可
// image.onload = () => {
// cxt.drawImage(image, 10, 10, 10, 10, 30, 30, 20, 20)
// }
```