JavaScript Canvas beginPath 教程
最后修改于 2025 年 4 月 3 日
在本文中,我们将探讨 JavaScript 中的 Canvas beginPath 方法。此方法对于在 HTML canvas 上绘制复杂形状和路径至关重要。掌握路径创建是创建自定义图形的关键。
基本定义
beginPath
方法通过清空子路径列表来开始一个新路径。当您想创建一条与任何先前路径分离的新路径时,会使用它。这可以防止形状之间出现不必要的连接。
路径由线条、圆弧和曲线等子路径组成。定义路径后,您可以对其进行描边或填充。beginPath
通常与 moveTo
、lineTo
和 arc
方法一起使用。
beginPath 的基本用法
此示例演示如何使用 beginPath 绘制两条独立的线。
<!DOCTYPE html> <html> <head> <title>Basic beginPath</title> </head> <body> <canvas id="myCanvas" width="300" height="200"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // First line ctx.beginPath(); ctx.moveTo(50, 50); ctx.lineTo(150, 50); ctx.strokeStyle = 'red'; ctx.stroke(); // Second line (separate from first) ctx.beginPath(); ctx.moveTo(50, 100); ctx.lineTo(150, 100); ctx.strokeStyle = 'blue'; ctx.stroke(); </script> </body> </html>
在此基本示例中,我们创建了两条独立的水平线。第一条线是红色的,从 (50,50) 绘制到 (150,50)。第二条线是蓝色的,绘制在下方。
每条线都使用 beginPath
在自己的路径中绘制。没有它,第二条线将连接到第一条线,从而形成一个 L 形。
使用 beginPath 绘制多个形状
此示例展示了如何使用 beginPath 绘制多个独立的形状。
<!DOCTYPE html> <html> <head> <title>Multiple Shapes</title> </head> <body> <canvas id="myCanvas" width="300" height="200"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // First rectangle ctx.beginPath(); ctx.rect(50, 50, 80, 80); ctx.fillStyle = 'lightblue'; ctx.fill(); ctx.strokeStyle = 'blue'; ctx.stroke(); // Second rectangle (independent) ctx.beginPath(); ctx.rect(150, 50, 80, 80); ctx.fillStyle = 'pink'; ctx.fill(); ctx.strokeStyle = 'red'; ctx.stroke(); </script> </body> </html>
在这里,我们绘制了两个具有不同填充和描边颜色的独立矩形。每个矩形都在其自己的路径中使用 beginPath
创建。
第一个矩形是浅蓝色带蓝色描边,第二个是粉红色带红色描边。没有 beginPath
,属性会继续沿用。
使用 beginPath 绘制复杂路径
此示例演示了如何创建具有多个子路径的复杂形状。
<!DOCTYPE html> <html> <head> <title>Complex Path</title> </head> <body> <canvas id="myCanvas" width="300" height="200"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); ctx.beginPath(); // Main shape ctx.moveTo(50, 50); ctx.lineTo(200, 50); ctx.lineTo(200, 150); // Hole in shape ctx.moveTo(100, 100); ctx.lineTo(150, 100); ctx.lineTo(150, 130); ctx.lineTo(100, 130); ctx.closePath(); ctx.fillStyle = 'lightgreen'; ctx.fill(); ctx.strokeStyle = 'green'; ctx.stroke(); </script> </body> </html>
这会创建一个具有主体和孔的复杂形状。moveTo
方法会提起“画笔”,开始一个新子路径,而不会连接线条。
主形状是一个直角,而孔是内部的一个较小矩形。所有部分都在一个路径中,但使用 moveTo
分成子路径。
beginPath 与圆弧
此示例展示了如何在单个路径中组合圆弧和线条。
<!DOCTYPE html> <html> <head> <title>Arcs and Lines</title> </head> <body> <canvas id="myCanvas" width="300" height="200"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); ctx.beginPath(); // Start at left ctx.moveTo(50, 100); // Line to right ctx.lineTo(200, 100); // Arc back to left ctx.arc(125, 100, 75, 0, Math.PI, true); ctx.fillStyle = 'lightyellow'; ctx.fill(); ctx.strokeStyle = 'orange'; ctx.lineWidth = 3; ctx.stroke(); </script> </body> </html>
这会创建一个带有直线和半圆形圆弧的形状。路径从 (50,100) 开始,绘制一条线到 (200,100),然后沿圆弧回到起点。
arc
方法以 75px 的半径绘制一个 180 度(Math.PI 弧度)的圆弧。true 参数使其逆时针绘制。
多个独立路径
此示例演示了如何绘制具有不同样式的多个独立路径。
<!DOCTYPE html> <html> <head> <title>Multiple Paths</title> </head> <body> <canvas id="myCanvas" width="400" height="300"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // First path - triangle ctx.beginPath(); ctx.moveTo(50, 50); ctx.lineTo(100, 150); ctx.lineTo(150, 50); ctx.closePath(); ctx.fillStyle = 'rgba(255, 0, 0, 0.5)'; ctx.fill(); // Second path - circle ctx.beginPath(); ctx.arc(300, 100, 50, 0, Math.PI * 2); ctx.fillStyle = 'rgba(0, 0, 255, 0.5)'; ctx.fill(); // Third path - custom shape ctx.beginPath(); ctx.moveTo(200, 200); ctx.lineTo(300, 200); ctx.lineTo(350, 250); ctx.lineTo(250, 280); ctx.closePath(); ctx.strokeStyle = 'purple'; ctx.lineWidth = 5; ctx.stroke(); </script> </body> </html>
此示例创建了三个完全独立的路径:一个红色三角形、一个蓝色圆形和一个紫色自定义形状。每个都有自己的样式属性。
beginPath
调用确保每个形状都单独绘制,而不会影响其他形状。在使用不同的填充和描边样式时,这至关重要。
来源
在本文中,我们探讨了 beginPath 方法及其在创建复杂 canvas 图形中的重要性。正确的路径管理对于创建具有自定义样式的干净、独立的形状至关重要。
作者
列出 所有 JS Canvas 教程。