目录
一、初体验
二、通过js的方式创建canvas
三、为什么推荐属性的方式设置canvas的宽高?
四、常见画笔API
4.1 画直线
🔶 步骤
🫢 小练习
4.2 线条的样式
4.2.1 线条的宽度设置
🔶 API
4.2.2 线条的颜色设置
🔶 API
🔶 步骤
一、初体验
使用canvas的基本步骤
- 创建canvas元素,并使用宽度和高度属性设置canvas的大小
- 获取 画笔 对象
- 使用canvas提供的api进行绘画
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<canvas style="background-color: aliceblue;">
<!-- canvas的默认大小:300 x 150 -->
</canvas>
</body>
</html>
可以看到:canvas有一个默认的大小 300 x 150 px
❗ 有博主说:canvas和别的元素不太一样,需要使用属性的方式设置宽和高,不然会有问题。
这个情况我暂时还没发现有什么问题,两种方式试了一下都能展示,有问题后面再说。(见第三章)
<canvas style="background-color: orange;width: 50px;height: 50px;"> </canvas> <canvas style="background-color: pink;" width="50" height="50"> </canvas>
接下来,我们画一个方形看看,直接给代码进行演示
<canvas id="canvas"
style="border: 1px solid grey;"
width="500"
height="500">
<!-- canvas的默认大小:300 x 150 -->
</canvas>
<script>
// 1. 获取 canvas 画布标签
const canvas = document.getElementById('canvas')
// 2. 获取 context 画笔对象
const context = canvas.getContext('2d')
// 3. 画出自己想要的图像
// 画一个方形: 有专门的api -> fillRect(x,y, width, height)
// x、y: 表示左上角顶点的坐标
// width、height: 表示这个方形的宽度和高度
context.fillRect(100, 100, 50, 50)
</script>
ok,这里我们得到canvas画笔的第一个api:
画方形 API
CanvasRect.fillRect(x: number, y: number, w: number, h: number): void
x、y: 表示左上角顶点的坐标
w、h: 表示这个方形的宽度和高度
二、通过js的方式创建canvas
前面演示的方式获取到的仅仅是html元素,现在这种方式 js 能够识别到这是canvas元素。这样就能给出相应的api提示了。比较方便!
<body>
<!-- 这种方式js能够识别到这是canvas元素,前面演示的方式获取到的仅仅是html元素 -->
<script>
// 1. 创建 canvas 画布
const canvas = document.createElement('canvas')
// 2. 设置宽高
canvas.width = 400
canvas.height = 600
canvas.style = "border:1px solid green"
// 3. 将该画布放入body标签中
document.body.append(canvas);
// 4. 继续获取画笔
const context = canvas.getContext('2d')
// 5. 画出想要的图形
context.fillRect(70, 70, 100, 100)
</script>
</body>
三、为什么推荐属性的方式设置canvas的宽高?
我们直接上代码演示进行对比
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
const canvas = document.createElement('canvas')
canvas.width = 400
canvas.height = 200
canvas.style="border:1px solid grey"
document.body.append(canvas)
const context = canvas.getContext('2d')
context.fillRect(200, 0, 200, 100)
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
canvas {
width: 400px;
height: 200px;
}
</style>
</head>
<body>
<script>
const canvas = document.createElement('canvas')
// canvas.width = 400
// canvas.height = 200
canvas.style="border:1px solid grey"
document.body.append(canvas)
const context = canvas.getContext('2d')
context.fillRect(200, 0, 200, 100)
</script>
</body>
</html>
很明显,通过样式修改的宽高尺寸已经严重扭曲。所以,必须使用属性的方式修改宽高!
四、常见画笔API
4.1 画直线
🔶 步骤
1. 使用 moveTo 方法把画笔移动到直线的起点
2. 使用 lineTo 方法把画笔移动到直线的终点
3. 使用 stoke 方法让画笔绘制一条直线
<script>
const canvas = document.createElement('canvas')
canvas.width = 400
canvas.height = 200
canvas.style="border:1px solid grey; background-color: green"
document.body.append(canvas)
const context = canvas.getContext('2d')
// 画直线
// 画笔移动到 (起点)
context.moveTo(100, 100)
// 画笔画线到 (终点)
context.lineTo(300, 100)
// 调用画线的方法
context.stroke()
</script>
🫢 小练习
请画出如下所示的折线图?
<script>
const canvas = document.createElement('canvas')
canvas.width = 400
canvas.height = 200
canvas.style="border:1px solid grey;background-color:green;"
document.body.append(canvas)
const context = canvas.getContext('2d')
context.moveTo(50, 150)
context.lineTo(100, 20)
context.stroke()
context.moveTo(100, 20)
context.lineTo(150, 100)
context.stroke()
context.moveTo(150, 100)
context.lineTo(200, 50)
context.stroke()
context.moveTo(200, 50)
context.lineTo(300, 150)
context.stroke()
</script>
<!-- 直接写成这样 -->
<script>
const canvas = document.createElement('canvas')
canvas.width = 400
canvas.height = 200
canvas.style="border:1px solid grey;background-color:green;"
document.body.append(canvas)
const context = canvas.getContext('2d')
context.moveTo(50, 150)
context.lineTo(100, 20)
context.lineTo(150, 100)
context.lineTo(200, 50)
context.lineTo(300, 150)
context.stroke()
</script>
4.2 线条的样式
4.2.1 线条的宽度设置
🔶 API
lineWidth
const context = canvas.getContext('2d')
context.moveTo(20,20)
context.lineTo(380,20)
// 设置线条的宽度
context.lineWidth = 10
context.stroke()
4.2.2 线条的颜色设置
(1)API
strokeStyle
const context = canvas.getContext('2d')
context.moveTo(20,20)
context.lineTo(380,20)
// 设置线条的宽度
context.lineWidth = 10
// 修改线条的颜色
context.strokeStyle = 'orange'
context.stroke()
除了设置纯色线条,我们也可以设置渐变色。
(2)线性渐变色 步骤
1. 通过画笔对象,创建线性渐变对象createLinearGradient
2. 拿到渐变对象,设置渐变的起止颜色,addColorStop
3. 再通过 strokeStyle 将这个渐变对象赋值给它
<script>
const canvas = document.createElement('canvas')
canvas.width = 400
canvas.height = 200
canvas.style="border:1px solid grey;"
document.body.append(canvas)
const context = canvas.getContext('2d')
// 1. 创建线性渐变(左上角横,纵坐标 ,宽, 长)
const gradient = context.createLinearGradient(0, 0, 400, 200)
// 2. 从什么颜色开始渐变 (偏移量(0~1,表示从什么位置开始渐变), 颜色)
gradient.addColorStop(0, 'red')
gradient.addColorStop(1, 'blue')
// 3. 画线
context.moveTo(20, 20)
context.lineTo(380, 20)
context.lineWidth = 20
context.strokeStyle = gradient;
context.stroke()
</script>
gradient.addColorStop(0, 'red')
gradient.addColorStop(0.5, 'pink')
gradient.addColorStop(1, 'blue')
(3)径向渐变
createRadialGradient
<script>
const canvas = document.createElement('canvas')
canvas.width = 600
canvas.height = 400
canvas.style="border:1px solid grey;"
document.body.append(canvas)
const context = canvas.getContext('2d')
// 1. 创建径向渐变对象
// 六个参数
// 1 2 3 param: 第一个圆的中心点坐标 半径
// 4 5 6 param: 第二个圆的中心点坐标 半径
const gradient = context.createRadialGradient(100,100, 0, 100, 100, 100)
// 2. 设置起点和终点的颜色
gradient.addColorStop(0, 'orange')
gradient.addColorStop(1, 'red')
// 3. 把渐变赋给画笔
context.fillStyle = gradient;
context.fillRect(0,0,200, 200)
</script>
(4)锥形渐变
<script>
const canvas = document.createElement('canvas')
canvas.width = 600
canvas.height = 400
canvas.style = 'border: 1px solid grey'
document.body.append(canvas)
const context = canvas.getContext('2d')
// 创建锥形渐变对象
// 参数说明:
// 1 param: 是一个弧度值,如果要以角度来计算,需要转换一下()
// 2 3 param: 圆心坐标
const gradient = context.createConicGradient(0, 100, 100)
// 设置渐变颜色
gradient.addColorStop(0, 'skyblue')
gradient.addColorStop(1, 'red')
// 填充样式
context.fillStyle = gradient
// 绘制矩形
context.fillRect(0, 0, 200, 200)
</script>
// 创建锥形渐变对象
// 参数说明:
// 1 param: 是一个弧度值,如果要以角度来计算,需要转换一下()
// 2 3 param: 圆心坐标
const gradient = context.createConicGradient(45 * (Math.PI / 180), 100, 100)