html5中实现“指定区域绘制”需用canvas的clip()方法创建裁剪路径:先绘制闭合路径,再调用clip(),后续绘图仅在该区域内生效;注意路径须闭合、裁剪状态可累积、可用save()/restore()重置。

HTML5 中没有 clip 属性(那是 CSS 旧规范中已废弃的),真正用于“限定绘制区域”的是 Canvas 的 裁剪路径(clipping path),通过 ctx.clip() 方法实现。它不是“隐藏区域外内容”,而是让后续所有绘图操作**只在当前路径围成的区域内生效**,区域外完全不绘制——这才是你想要的“指定区域绘制”特效。
用 clip() 创建裁剪区域的基本流程
核心三步:绘制路径 → 调用 clip() → 绘制目标图形(自动被裁剪):
- 先用
beginPath()开始一条新路径 - 用
rect()、arc()、moveTo()/lineTo()等绘制一个封闭形状(必须闭合!否则裁剪行为不可靠) - 调用
ctx.clip()—— 此时裁剪区域生效,但**不会画出路径本身** - 再调用
fill()、stroke()、drawImage()等,它们将严格限制在该区域内渲染
常用裁剪形状示例(矩形、圆形、自定义多边形)
矩形裁剪(最常用):
ctx.beginPath(); ctx.rect(50, 50, 200, 150); // x, y, width, height ctx.clip(); // 设定裁剪区 <p>// 后续所有绘制都在这个矩形内 ctx.fillStyle = 'red'; ctx.fillRect(0, 0, 400, 300); // 实际只显示重叠部分</p>
圆形裁剪:
ctx.beginPath(); ctx.arc(150, 150, 80, 0, Math.PI * 2); // 圆心x/y、半径、起止弧度 ctx.clip(); <p>ctx.drawImage(img, 0, 0); // 图片只显示圆形区域内的部分</p>
不规则多边形裁剪(如三角形、五角星):
ctx.beginPath(); ctx.moveTo(100, 50); ctx.lineTo(150, 150); ctx.lineTo(50, 150); ctx.closePath(); // 必须闭合! ctx.clip(); <p>ctx.fillStyle = '#00aaff'; ctx.fill(); // 填充仅限三角形内</p>
关键注意事项与避坑点
-
裁剪状态是累积的:多次调用
clip()会取交集。如需重置,用ctx.save()+ctx.restore()包裹裁剪段 -
路径必须闭合:未闭合路径(如只用
lineTo没有closePath)可能导致裁剪失效或意外结果 - clip() 不影响已有内容:它只约束“之后”的绘制命令,之前画的内容不受影响
-
性能提示:频繁切换裁剪区域有开销,复杂动画中建议复用
save()/restore()而非反复创建路径
结合 save/restore 实现局部裁剪动画
例如让一张图片在圆形区域内平移显示:
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
<p>// 保存初始状态
ctx.save();</p><p>// 设置圆形裁剪区(随时间变化圆心)
const cx = 150 + Math.sin(Date.now() <em> 0.002) </em> 50;
const cy = 150;
ctx.beginPath();
ctx.arc(cx, cy, 60, 0, Math.PI * 2);
ctx.clip();</p><p>// 绘制整张图,但只在圆内可见
ctx.drawImage(img, -50, -50, 200, 200);</p><p>// 恢复原始裁剪区(无裁剪)
ctx.restore();
}</p>
裁剪路径是 Canvas 实现蒙版、头像裁切、视差滚动、UI 遮罩等效果的核心机制,掌握 clip() 的时机和路径构造逻辑,比任何 CSS hack 都更直接可控。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











