JavaScript Canvas clearRect 教程
最后修改于 2025 年 4 月 3 日
在本文中,我们将探讨 JavaScript 中的 Canvas clearRect 方法。此方法对于清除 HTML canvas 的特定矩形区域至关重要。掌握 clearRect 对于动画和动态图形至关重要。
基本定义
clearRect 方法将指定矩形区域内的像素清除为透明黑色(rgba(0,0,0,0))。它通常用于擦除 canvas 的一部分或为新绘图准备区域。
该方法接受四个参数:左上角的 x 和 y 坐标,以及矩形的宽度和高度。它仅影响指定区域,而不会改变其他 canvas 内容。
clearRect 的基本用法
此示例演示了如何从已填充的 canvas 中清除一个矩形区域。
<!DOCTYPE html> <html> <head> <title>Basic clearRect</title> </head> <body> <canvas id="myCanvas" width="300" height="200"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // Fill entire canvas with blue ctx.fillStyle = 'blue'; ctx.fillRect(0, 0, canvas.width, canvas.height); // Clear a rectangle in the middle ctx.clearRect(100, 50, 100, 100); </script> </body> </html>
在这个基本示例中,我们首先使用 fillRect 将整个 canvas 填充为蓝色。然后我们使用 clearRect 在中间创建一个透明矩形。
clearRect 参数 (100,50,100,100) 意味着:从 x=100,y=50 开始,清除一个宽度为 100 像素、高度为 100 像素的区域。这展示了最简单的 clearRect 用法。
局部 Canvas 清除
此示例展示了如何在保留其他内容的同时清除多个区域。
<!DOCTYPE html> <html> <head> <title>Partial Clearing</title> </head> <body> <canvas id="myCanvas" width="400" height="300"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // Draw a complex pattern ctx.fillStyle = 'green'; for (let i = 0; i < canvas.width; i += 20) { for (let j = 0; j < canvas.height; j += 20) { ctx.fillRect(i, j, 10, 10); } } // Clear specific areas ctx.clearRect(50, 50, 100, 50); ctx.clearRect(250, 100, 100, 100); ctx.clearRect(150, 200, 200, 50); </script> </body> </html>
在这里,我们首先通过在 canvas 上绘制小的绿色正方形来创建网格图案。然后我们清除不同位置的三个矩形区域。
每次调用 clearRect 都会从其指定区域中删除内容,从而在图案中创建“孔”。这演示了选择性清除并保留其他 canvas 内容。
使用 clearRect 进行动画
此示例展示了 clearRect 如何通过清除帧来实现平滑动画。
<!DOCTYPE html> <html> <head> <title>Animation with clearRect</title> </head> <body> <canvas id="myCanvas" width="400" height="200"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); let x = 0; const ballRadius = 20; function animate() { // Clear only the area needed for animation ctx.clearRect(x - ballRadius - 1, 0, ballRadius * 2 + 2, canvas.height); // Draw new ball position ctx.beginPath(); ctx.arc(x, 100, ballRadius, 0, Math.PI * 2); ctx.fillStyle = 'red'; ctx.fill(); x += 2; if (x > canvas.width + ballRadius) x = -ballRadius; requestAnimationFrame(animate); } animate(); </script> </body> </html>
此动画在 canvas 上移动一个红球。我们没有在每一帧都清除整个 canvas,而是只清除球的最后位置周围的区域。
clearRect 参数考虑了球的半径加上 1 像素的填充。这种优化的清除方式减少了闪烁,并与完全清除 canvas 相比提高了性能。
交互式清除
此示例演示了通过鼠标移动进行交互式清除。
<!DOCTYPE html> <html> <head> <title>Interactive Clearing</title> </head> <body> <canvas id="myCanvas" width="500" height="400"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // Fill canvas with gradient const gradient = ctx.createLinearGradient(0, 0, 0, canvas.height); gradient.addColorStop(0, 'purple'); gradient.addColorStop(1, 'orange'); ctx.fillStyle = gradient; ctx.fillRect(0, 0, canvas.width, canvas.height); // Clear on mouse move canvas.addEventListener('mousemove', (e) => { const rect = canvas.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; ctx.clearRect(x - 25, y - 25, 50, 50); }); </script> </body> </html>
这会创建一个带有垂直渐变的 canvas。当鼠标移动时,它会在光标位置中心清除 50x50 像素的正方形,从而显示透明度。
mousemove 事件计算相对于 canvas 的坐标。然后 clearRect 创建一个跟随鼠标的清除效果,展示了交互式用法。
高级:使用复合操作进行清除
此示例将 clearRect 与 globalCompositeOperation 结合使用以实现效果。
<!DOCTYPE html> <html> <head> <title>Composite Clearing</title> </head> <body> <canvas id="myCanvas" width="500" height="400"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // Draw background image (simulated) ctx.fillStyle = 'lightblue'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = 'brown'; for (let i = 0; i < 100; i++) { ctx.fillRect( Math.random() * canvas.width, Math.random() * canvas.height, 5, 5 ); } // Set composite mode ctx.globalCompositeOperation = 'destination-out'; // Clear with shapes instead of rectangles function clearCircle(x, y, r) { ctx.beginPath(); ctx.arc(x, y, r, 0, Math.PI * 2); ctx.fill(); } // Interactive clearing canvas.addEventListener('mousemove', (e) => { const rect = canvas.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; clearCircle(x, y, 30); }); </script> </body> </html>
这个高级示例使用 globalCompositeOperation 来创建非矩形清除效果。我们将模式设置为 'destination-out',这使得任何新绘图都会清除现有内容。
我们不使用 clearRect,而是使用 fill 和 arc 来创建圆形清除区域。鼠标移动会以圆形而不是矩形清除内容,展示了创意的清除技术。
来源
在本文中,我们探索了使用 clearRect 管理 canvas 内容的各种技术。从基本清除到高级动画和效果,clearRect 是 canvas 操作的强大工具。
作者
列出 所有 JS Canvas 教程。