moveTo() 简介

moveTo() 是 Canvas 2D 上下文中用于移动画笔到指定坐标的方法,它不画线,只是改变当前绘制位置。

语法

ctx.moveTo(x, y);
参数 说明
x 目标位置的 X 坐标
y 目标位置的 Y 坐标

类比理解

就像拿笔在纸上画画:

  • moveTo() = 把笔抬起来,移动到另一个位置放下去,移动过程中不留下痕迹
  • lineTo() = 笔尖不离开纸面,画出一条线

基本用法

const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');

ctx.beginPath();
ctx.moveTo(50, 50);      // 移动到 (50, 50),不画线
ctx.lineTo(200, 50);     // 从 (50, 50) 画线到 (200, 50)
ctx.lineTo(200, 200);    // 从 (200, 50) 画线到 (200, 200)
ctx.stroke();            // 描边显示路径

典型应用场景

1. 绘制多条不相连的线段:

ctx.beginPath();
ctx.moveTo(50, 50);     // 第一条线起点
ctx.lineTo(150, 50);    // 第一条线终点

ctx.moveTo(50, 100);    // 抬起笔,移动到第二条线起点
ctx.lineTo(150, 100);   // 第二条线终点

ctx.moveTo(50, 150);    // 抬起笔,移动到第三条线起点
ctx.lineTo(150, 150);   // 第三条线终点

ctx.stroke();           // 一次性画出三条独立的水平线

2. 绘制折线图:

const data = [120, 85, 160, 95, 140, 180, 130];

ctx.beginPath();
ctx.moveTo(50, 300 - data[0]);  // 移动到第一个数据点

for (let i = 1; i < data.length; i++) {
  ctx.lineTo(50 + i * 60, 300 - data[i]);
}

ctx.strokeStyle = 'blue';
ctx.lineWidth = 2;
ctx.stroke();

3. 绘制多边形:

ctx.beginPath();
ctx.moveTo(100, 50);     // 顶点
ctx.lineTo(170, 135);    // 右下
ctx.lineTo(145, 220);    // 左下
ctx.lineTo(55, 220);     // 左下
ctx.lineTo(30, 135);     // 右上
ctx.closePath();         // 回到起点,形成五边形
ctx.fillStyle = 'gold';
ctx.fill();

注意事项

情况 行为
首次绘制未调用 moveTo() 默认从 (0, 0) 开始
连续调用 moveTo() 只取最后一次的位置作为当前点
beginPath() 之前调用 路径会被清空,相当于无效

lineTo() 的区别

方法 是否画线 用途
moveTo(x, y) ❌ 不画线 移动画笔位置,准备新起点
lineTo(x, y) ✅ 画线 从当前位置画到目标点

一句话总结

moveTo() 就像把笔抬起来挪个地方再放下,方便你在画布的不同位置分别绘制图形,而不产生多余的连线。