JavaScript Canvas 裁剪教程
最后修改于 2025 年 4 月 3 日
在本文中,我们探索 JavaScript Canvas 中的裁剪方法。裁剪路径允许您将绘图限制在画布的特定区域。这种强大的技术能够实现创意效果和优化渲染。
基本定义
Canvas 裁剪是定义绘图操作可见区域的过程。在裁剪路径之外绘制的任何内容都不会显示。裁剪路径就像后续绘图操作的蒙版。
主要的裁剪方法是 clip,它使用当前路径作为裁剪区域。可以使用路径操作组合多个裁剪路径。可以保存和恢复裁剪区域与画布状态一起。
基本裁剪用法
本示例演示了如何创建简单的圆形裁剪区域。
<!DOCTYPE html>
<html>
<head>
<title>Basic Canvas Clip</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="200"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// Create circular clipping path
ctx.beginPath();
ctx.arc(150, 100, 80, 0, Math.PI * 2);
ctx.clip();
// Draw rectangle (only visible inside circle)
ctx.fillStyle = 'blue';
ctx.fillRect(0, 0, 300, 200);
</script>
</body>
</html>
在这个基本示例中,我们创建了一个圆形路径并调用了 clip。这会将裁剪区域设置为圆形。紧随其后的蓝色矩形仅在此圆形区域内可见。
裁剪路径会一直存在,直到画布状态被恢复或重置。所有后续的绘图操作都将被裁剪到此区域。
使用复杂路径进行裁剪
本示例展示了如何创建星形裁剪区域。
<!DOCTYPE html>
<html>
<head>
<title>Complex Path Clip</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="300"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// Create star-shaped clipping path
ctx.beginPath();
ctx.moveTo(150, 50);
ctx.lineTo(175, 125);
ctx.lineTo(250, 125);
ctx.lineTo(190, 175);
ctx.lineTo(210, 250);
ctx.lineTo(150, 200);
ctx.lineTo(90, 250);
ctx.lineTo(110, 175);
ctx.lineTo(50, 125);
ctx.lineTo(125, 125);
ctx.closePath();
ctx.clip();
// Draw gradient (only visible inside star)
const gradient = ctx.createLinearGradient(0, 0, 300, 300);
gradient.addColorStop(0, 'red');
gradient.addColorStop(1, 'yellow');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, 300, 300);
</script>
</body>
</html>
在这里,我们使用多个 lineTo 调用创建了一个复杂的星形路径。clip 方法将此路径转换为裁剪区域。
紧随其后的渐变填充仅在星形形状内可见。这表明任何复杂路径都可以用作裁剪蒙版。
多个裁剪区域
本示例展示了如何组合多个裁剪路径。
<!DOCTYPE html>
<html>
<head>
<title>Multiple Clipping Regions</title>
</head>
<body>
<canvas id="myCanvas" width="300" height="200"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// First clipping circle
ctx.beginPath();
ctx.arc(100, 100, 60, 0, Math.PI * 2);
ctx.clip();
// Second clipping circle (intersects with first)
ctx.beginPath();
ctx.arc(200, 100, 60, 0, Math.PI * 2);
ctx.clip();
// Draw pattern (only visible in intersection)
ctx.fillStyle = 'green';
for (let x = 0; x < 300; x += 20) {
for (let y = 0; y < 200; y += 20) {
ctx.fillRect(x, y, 10, 10);
}
}
</script>
</body>
</html>
本示例创建了两个重叠的圆形裁剪区域。有效的裁剪区域是两个圆形的交集,即它们重叠的部分。
网格图案仅在两个裁剪圆相交的地方绘制。这表明多次调用 clip 可以组合成复杂的区域。
使用 Save/Restore 进行裁剪
本示例演示了如何使用 save/restore 来管理裁剪状态。
<!DOCTYPE html>
<html>
<head>
<title>Save/Restore Clip</title>
</head>
<body>
<canvas id="myCanvas" width="400" height="200"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// Save initial state
ctx.save();
// Create first clipping region (left circle)
ctx.beginPath();
ctx.arc(100, 100, 80, 0, Math.PI * 2);
ctx.clip();
// Draw in first region
ctx.fillStyle = 'rgba(255, 0, 0, 0.5)';
ctx.fillRect(0, 0, 400, 200);
// Restore state and create second clipping region
ctx.restore();
ctx.beginPath();
ctx.arc(300, 100, 80, 0, Math.PI * 2);
ctx.clip();
// Draw in second region
ctx.fillStyle = 'rgba(0, 0, 255, 0.5)';
ctx.fillRect(0, 0, 400, 200);
</script>
</body>
</html>
在这里,我们使用 save 和 restore 来管理不同的裁剪状态。第一个裁剪圆是在保存状态后创建的。
绘制完成后,我们恢复到原始状态并创建第二个裁剪圆。这使我们能够在不重叠的情况下拥有独立的裁剪区域。
文本裁剪效果
本示例使用文本作为裁剪路径创建了一个裁剪效果。
<!DOCTYPE html>
<html>
<head>
<title>Text Clipping Effect</title>
</head>
<body>
<canvas id="myCanvas" width="500" height="200"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// Set large font for clipping
ctx.font = 'bold 100px Arial';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
// Create text clipping path
ctx.beginPath();
ctx.fillText('CLIP', 250, 100);
ctx.clip();
// Draw gradient inside text
const gradient = ctx.createLinearGradient(0, 0, 500, 0);
gradient.addColorStop(0, 'red');
gradient.addColorStop(0.5, 'yellow');
gradient.addColorStop(1, 'blue');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, 500, 200);
</script>
</body>
</html>
这个创意示例使用文本作为裁剪路径。fillText 方法创建了文本路径,然后用于裁剪。
紧随其后的渐变填充仅在文本字符内部可见。这种技术可用于创建有趣的文本效果和蒙版。
来源
在本文中,我们探讨了在 HTML Canvas 上使用裁剪路径的各种技术。掌握裁剪功能可以实现高级图形效果和 Web 应用程序的优化渲染。
作者
列出 所有 JS Canvas 教程。