canvas入门
文档:https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial
创建canvas画布的两种方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>创建canvas画布的两种方法</title>
</head>
<body>
<!--方法1: 通过标签来创建-->
<canvas id="canvas1" width="100" height="100" style="background: black"></canvas>
<script>
<!--方法2: 通过js来创建-->
const canvas = document.createElement('canvas');
canvas.id = 'canvas2';
canvas.width = 200;
canvas.height = 200;
canvas.style.background = 'red';
document.body.appendChild(canvas);
</script>
</body>
</html>
绘制各种图形
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>绘制各种图形</title>
</head>
<body>
<canvas id="canvas1"></canvas>
<script>
const canvas = document.getElementById('canvas1')
canvas.width = 500
canvas.height = 500
// canvas.style.background = 'red'
canvas.style.border = '1px solid black'
const ctx = canvas.getContext('2d')
// 绘制矩形
ctx.fillStyle = 'red'
ctx.fillRect(0, 0, 100, 100)
// 绘制圆形
ctx.beginPath()
ctx.arc(200, 200, 100, 0, Math.PI * 2)
ctx.fillStyle = 'blue'
ctx.fill()
ctx.closePath()
// 绘制椭圆
ctx.beginPath()
ctx.ellipse(400, 100, 100, 50, 0, 0, Math.PI * 2)
ctx.fillStyle = 'yellow'
ctx.fill()
ctx.closePath()
// 绘制三角形
ctx.beginPath()
ctx.moveTo(300, 300)
ctx.lineTo(400, 300)
ctx.lineTo(350, 400)
ctx.closePath()
ctx.fillStyle = 'green'
ctx.fill()
// 绘制文字
ctx.font = '30px Arial'
ctx.fillStyle = 'black'
ctx.fillText('Hello World', 100, 100)
// 绘制图片
const img = new Image()
img.src = 'https://www.baidu.com/img/bd_logo1.png'
img.onload = function () {
ctx.drawImage(img, 0, 100, 100, 100)
}
</script>
</body>
</html>
![image](https://prod-files-secure.s3.us-west-2.amazonaws.com/371abca5-94fd-4d13-a43e-bbcb27be7c63/81da0631-d68e-44f8-b148-cd795035bde6/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466TC5OUX6R%2F20250205%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250205T160234Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEC8aCXVzLXdlc3QtMiJHMEUCIA6rI%2BaGwp6sfwNyBbx7FATYxE2g7wyyZm3r7q5KeIupAiEA87G%2BYrklVB1fVf11rBrk5%2BB6O7FEe57fBMqBSOxCxRIq%2FwMISBAAGgw2Mzc0MjMxODM4MDUiDP6W4vtipSoTyPsxFSrcA0kbbJ%2BwYaq0glqNHOUuMxTDinePuz3l2qHlfwa%2FrUvXt3869EtHzZ%2FtK2XQWkpMugyr8ABhy0F6CZrwJzpmO6s7vMSlsNWh0RA7LZCsVWYeD2GP0cqbsMk06fLL%2FnbRMriS9%2FSoUh9nAgXpzeyOKxpJNzoLXEslmTczZKJQ1iMVXfLqwMyOVZZsYZGImiB5v4Pbo9d%2Boh3SmBl7EDB11s%2B1CsJ%2F4XgMLmcSa6EnyxLCioptz2XZkSpufOj5IKvWnfOtJTcEPFuSB%2BMNvW65SutZWtzwrFsXtjYf2LL9In1RYFU4oW4U0XT0jLc0M0mWEXpWKkLDXFs9%2Ft%2BcaHpdf%2BcwfnVXj%2FJomcdiFeuq2NfxM8OrJGob5jMoaHQ5JMD8X4PzzOpq12z9%2F4CPK4wBrSEdcvlCZPCt9NKWzu8bkhm7zinpvO976dU6zSTlbRAL7mEZ5Q1icPOODKdOByg7Xd%2BS%2BMcx03fcvGOEPxDWjSjawY%2BYy8VtWlgVk1o0XFVd1Zp2ykACW66wWEgUcj8R3gO1kw6TS3ecVBnqjfcZ1627qhTtfeDAmgbFsh2e299Cv9DdB53JXRI3SXfAUD45q8H5gbJ3hsXcvYq9h%2FleirsJa3hB0x9Iqle7uSOvMIyBjr0GOqUBb%2BweSWrcYTNnE6wwJPhONhZMD1hE8a9Fs%2FWxanINKgn4Rg5N9SOxROHEYVBm2nPfXPHDMp%2FBdGnxI7R8C4x6lT3BlgWlVcyrFZSYSdNLkU9Ufs0K83koVe6XNXGVy3R4UuCvDG0USjq6B226Dp2dft8g7cYg6nqsNsSIYqgt7xQb1IlwW2EqtCzlnk6ZG%2FKBmiuHEs%2B%2BTARJobmgfcRB7jRpMgQT&X-Amz-Signature=ac03f5dc7a1a73a2057279249cb10a65af97467c4e24b9562217991effb4b4b4&X-Amz-SignedHeaders=host&x-id=GetObject)
绘制阴影
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用阴影</title>
</head>
<body>
<canvas id="canvas1"></canvas>
<script>
const canvas = document.getElementById('canvas1')
canvas.width = 500
canvas.height = 500
// canvas.style.background = 'red'
canvas.style.border = '1px solid black'
const ctx = canvas.getContext('2d')
ctx.beginPath()
ctx.shadowBlur = 20
ctx.shadowColor = 'black'
ctx.shadowOffsetX = 10
ctx.shadowOffsetY = 10
ctx.arc(200, 200, 100, 0, Math.PI * 2)
ctx.fillStyle = 'grey'
ctx.fill()
ctx.closePath()
</script>
</body>
</html>
![image](https://prod-files-secure.s3.us-west-2.amazonaws.com/371abca5-94fd-4d13-a43e-bbcb27be7c63/e5215fde-8ac4-4d60-8b9e-6d65580f8dfe/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466TC5OUX6R%2F20250205%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250205T160234Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEC8aCXVzLXdlc3QtMiJHMEUCIA6rI%2BaGwp6sfwNyBbx7FATYxE2g7wyyZm3r7q5KeIupAiEA87G%2BYrklVB1fVf11rBrk5%2BB6O7FEe57fBMqBSOxCxRIq%2FwMISBAAGgw2Mzc0MjMxODM4MDUiDP6W4vtipSoTyPsxFSrcA0kbbJ%2BwYaq0glqNHOUuMxTDinePuz3l2qHlfwa%2FrUvXt3869EtHzZ%2FtK2XQWkpMugyr8ABhy0F6CZrwJzpmO6s7vMSlsNWh0RA7LZCsVWYeD2GP0cqbsMk06fLL%2FnbRMriS9%2FSoUh9nAgXpzeyOKxpJNzoLXEslmTczZKJQ1iMVXfLqwMyOVZZsYZGImiB5v4Pbo9d%2Boh3SmBl7EDB11s%2B1CsJ%2F4XgMLmcSa6EnyxLCioptz2XZkSpufOj5IKvWnfOtJTcEPFuSB%2BMNvW65SutZWtzwrFsXtjYf2LL9In1RYFU4oW4U0XT0jLc0M0mWEXpWKkLDXFs9%2Ft%2BcaHpdf%2BcwfnVXj%2FJomcdiFeuq2NfxM8OrJGob5jMoaHQ5JMD8X4PzzOpq12z9%2F4CPK4wBrSEdcvlCZPCt9NKWzu8bkhm7zinpvO976dU6zSTlbRAL7mEZ5Q1icPOODKdOByg7Xd%2BS%2BMcx03fcvGOEPxDWjSjawY%2BYy8VtWlgVk1o0XFVd1Zp2ykACW66wWEgUcj8R3gO1kw6TS3ecVBnqjfcZ1627qhTtfeDAmgbFsh2e299Cv9DdB53JXRI3SXfAUD45q8H5gbJ3hsXcvYq9h%2FleirsJa3hB0x9Iqle7uSOvMIyBjr0GOqUBb%2BweSWrcYTNnE6wwJPhONhZMD1hE8a9Fs%2FWxanINKgn4Rg5N9SOxROHEYVBm2nPfXPHDMp%2FBdGnxI7R8C4x6lT3BlgWlVcyrFZSYSdNLkU9Ufs0K83koVe6XNXGVy3R4UuCvDG0USjq6B226Dp2dft8g7cYg6nqsNsSIYqgt7xQb1IlwW2EqtCzlnk6ZG%2FKBmiuHEs%2B%2BTARJobmgfcRB7jRpMgQT&X-Amz-Signature=6b8bd115846085148d4ffb2292b5a8df8fb0e82c9b24b1e64bd7db40556011b9&X-Amz-SignedHeaders=host&x-id=GetObject)