ZetCode

JavaScript Canvas moveTo 教程

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 JavaScript 中的 Canvas moveTo 方法。此方法对于在 HTML canvas 上绘制路径至关重要。它设置绘制操作的起始点,而不会产生任何可见的标记。

基本定义

moveTo 方法将绘图光标移动到指定的坐标,而 **不** 绘制任何内容。这就像在纸上提起一支笔并将其移动到新位置,然后才开始绘画一样。

此方法始终与其他路径绘制方法(如 lineToarcquadraticCurveTo)一起使用。在 beginPath 之后调用它以开始一个新的子路径。

基本的 moveTo 用法

此示例演示了如何使用 moveTo 和 lineTo 绘制一条简单的直线。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic moveTo Example</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    ctx.moveTo(50, 50);  // Start point
    ctx.lineTo(250, 150); // End point
    ctx.stroke();        // Draw the line
</script>

</body>
</html>

在此基本示例中,我们创建了一个 canvas 元素并获取其 2D 渲染上下文。我们使用 beginPath 开始一个新路径。

moveTo 方法将起始点设置为 (50,50)。然后 lineTo 绘制一条线到 (250,150)。最后,stroke 使线条可见。

绘制多条线

此示例展示了如何使用 moveTo 绘制多条连接的线。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Multiple Lines with moveTo</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    ctx.moveTo(50, 50);
    ctx.lineTo(150, 50);
    ctx.lineTo(150, 150);
    ctx.lineTo(50, 150);
    ctx.closePath();
    ctx.stroke();
</script>

</body>
</html>

在这里,我们使用多个 lineTo 调用创建一个正方形。初始 moveTo 将起始点设置在左上角。

每个 lineTo 都绘制到下一个角。closePath 连接回起始点。stroke 方法渲染完整的正方形轮廓。

不相连的路径

此示例演示了如何使用 moveTo 创建不相连的路径。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Disconnected Paths</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    // First line
    ctx.moveTo(50, 50);
    ctx.lineTo(150, 50);
    
    // Second disconnected line
    ctx.moveTo(50, 100);
    ctx.lineTo(150, 100);
    
    // Third disconnected line
    ctx.moveTo(50, 150);
    ctx.lineTo(150, 150);
    
    ctx.stroke();
</script>

</body>
</html>

此示例绘制了三条未连接的水平线。每条新的 moveTo 调用都会在不同的 y 坐标处启动一个新的子路径。

如果线之间没有 moveTo 调用,它们都会垂直连接。这表明了 moveTo 如何创建独立的路径段。

绘制三角形

此示例展示了如何使用 moveTo 和 lineTo 绘制三角形。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Drawing a Triangle</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    ctx.moveTo(150, 50);  // Top point
    ctx.lineTo(250, 150); // Bottom right
    ctx.lineTo(50, 150);  // Bottom left
    ctx.closePath();      // Connect back to top
    ctx.stroke();
</script>

</body>
</html>

在这里,我们通过连接三个点来创建一个三角形。moveTo 将起始点设置在顶部顶点 (150,50)。

两个 lineTo 调用绘制到下方的两个角。closePath 通过连接回起始点来完成形状。然后描边三角形轮廓。

具有多个 moveTo 的复杂形状

此示例使用多个 moveTo 调用演示了一个更复杂的形状。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Complex Shape with moveTo</title>
</head>
<body>

<canvas id="myCanvas" width="400" height="300"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    // First shape (house)
    ctx.moveTo(100, 100);
    ctx.lineTo(200, 100);
    ctx.lineTo(200, 200);
    ctx.lineTo(100, 200);
    ctx.closePath();
    
    // Roof
    ctx.moveTo(100, 100);
    ctx.lineTo(150, 50);
    ctx.lineTo(200, 100);
    
    // Door
    ctx.moveTo(140, 200);
    ctx.lineTo(140, 160);
    ctx.lineTo(160, 160);
    ctx.lineTo(160, 200);
    
    ctx.stroke();
</script>

</body>
</html>

此示例绘制了一个具有多个组件的简单房屋形状。每个结构元素都以新的 moveTo 调用开始。

房屋主体是一个正方形。屋顶是它上面的一个三角形。门是底部的一个小矩形。所有部分都绘制在一个路径中,但它们是独立的子路径。

来源

MDN Canvas moveTo 文档

在本文中,我们探讨了使用 moveTo 方法在 HTML canvas 上创建路径的各种技术。掌握此方法对于在 Web 应用程序中创建复杂的绘图和图形至关重要。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 JS Canvas 教程