Skip to content

Canvas入门

什么是 Canvas

<canvas> 是 HTML5 新增的元素,可用于通过使用 JavaScript 中的脚本来绘制图形。例如,它可以用于绘制图形、制作照片、创建动画,甚至可以进行实时视频处理或渲染。

canvas 只是一个画布,本身并不具有绘图的能力,绘图必须使用 JavaScript 等脚本语言。

可以认为 <canvas> 标签只是一个矩形的画布。JavaScript 就是画笔,负责在画布上画画。

Canvas 基本使用

创建画布

使用 canvas 标签即可创建一个画布,如果不给标签设置宽高,它默认的宽高为 300 * 150

可以通过 html/css/js 来改变画布大小

html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>canvas 入门</title>
  <style>
    #canvas {
      border: 1px solid #000;
    }
  </style>
</head>

<body>
  <canvas id="canvas"></canvas>
</body>

</html>

image-20240824094353563

获取 canvas 上下文

我们需要获取到 canvas 的上下文才能对 canvas 进行一些操作。获取上下文的方式:canvas.getContext(contextType, contextAttributes)

canvas 是2d 的,上下文类型为 2d

js
// 获取canvas元素
const canvas = document.getElementById('canvas')
// 获取canvas上下文
const ctx = canvas.getContext('2d')
// 设置canvas宽高
canvas.width = 400
canvas.height = 300

绘制路径

创建路径的方法有

方法描述
fill()填充路径
stroke()描边
arc()创建圆弧
rect()创建矩形
fillRect()绘制矩形路径区域
strokeRect()绘制矩形路径描边
clearRect()在给定的矩形内清除指定的像素
arcTo()创建两切线之间的弧/曲线
beginPath()起始一条路径,或重置当前路径
moveTo()把路径移动到画布中的指定点,不创建线条
lineTo()添加一个新点,然后在画布中创建从该点到最后指定点的线条
closePath()创建从当前点回到起始点的路径
clip()从原始画布剪切任意形状和尺寸的区域
quadraticCurveTo()创建二次方贝塞尔曲线
bezierCurveTo()创建三次方贝塞尔曲线
isPointInPath()如果指定的点位于当前路径中,则返回 true,否则返回 false

绘制线段

js
ctx.moveTo(0, 0) // 设置起点
ctx.lineTo(400, 300) // 设置终点
ctx.stroke() // 绘制线段

image-20240824100051833

绘制一个点 / 圆

主要用的方法是 arc(x, y, radius, startAngle, endAngle, anticlockwise)

  • x:圆心的 x 坐标
  • y:圆心的 y 坐标
  • r:圆的半径
  • sAngle:起始角,以弧度计(弧的圆形的三点钟位置是 0 度)
  • eAngle:结束角,以弧度计
  • counterclockwise:可选。规定应该逆时针还是顺时针绘图。false 为顺时针,true 为逆时针
js
// 绘制一个点
ctx.beginPath()
ctx.arc(200, 150, 10, 0, 2 * Math.PI, true)
ctx.closePath();
ctx.fillStyle = 'red';
ctx.fill()

image-20240824100818188

绘制弧/ 曲线

也是使用 arc 方法

js
ctx.beginPath()
ctx.arc(200, 150, 100, 0, 1 * Math.PI, true)
// ctx.closePath() // 闭合路径
ctx.stroke()

使用 closePath 和不使用 closePath 的区别

image-20240824101604033

Released under the MIT License.