裁剪路径

Canvas clip方法详解,掌握裁剪路径的创建、嵌套和实际应用技巧。clip方法用于创建裁剪区域,限制后续绑制只在特定区域内显示。

基本语法

ctx.clip()
ctx.clip(fillRule)
ctx.clip(path, fillRule)
参数说明
fillRule填充规则:'nonzero' 或 'evenodd'
pathPath2D对象

工作原理

clip方法将当前路径转换为裁剪区域:

  1. 首先创建一个路径
  2. 调用clip()将路径设为裁剪区域
  3. 之后绑制的所有内容只在该区域内可见
ctx.beginPath()
ctx.arc(100, 100, 50, 0, Math.PI * 2)
ctx.clip()

// 之后绑制只在圆形区域内显示
ctx.fillRect(0, 0, 200, 200)

基本裁剪演示

基本裁剪效果

裁剪路径形状

裁剪路径可以是任意形状:

圆形裁剪

ctx.beginPath()
ctx.arc(100, 100, 50, 0, Math.PI * 2)
ctx.clip()

矩形裁剪

ctx.beginPath()
ctx.rect(50, 50, 100, 100)
ctx.clip()

多边形裁剪

ctx.beginPath()
ctx.moveTo(100, 50)
ctx.lineTo(150, 100)
ctx.lineTo(125, 150)
ctx.lineTo(75, 150)
ctx.lineTo(50, 100)
ctx.closePath()
ctx.clip()

复杂形状裁剪

复杂形状裁剪

填充规则

clip方法支持两种填充规则:

nonzero(默认)

非零环绕规则,用于判断点是否在路径内:

ctx.clip('nonzero')

evenodd

奇偶规则,用于创建镂空效果:

ctx.clip('evenodd')

填充规则演示

填充规则对比

裁剪路径嵌套

多次调用clip会产生累积效果:

ctx.beginPath()
ctx.rect(0, 0, 200, 200)
ctx.clip()

ctx.beginPath()
ctx.rect(50, 50, 100, 100)
ctx.clip()

// 最终裁剪区域是两个矩形的交集

嵌套裁剪演示

裁剪路径嵌套

重置裁剪路径

使用save/restore重置裁剪路径:

ctx.save()
ctx.beginPath()
ctx.arc(100, 100, 50, 0, Math.PI * 2)
ctx.clip()
// 绑制操作
ctx.restore()  // 裁剪路径被重置

使用Path2D

可以使用Path2D对象创建裁剪路径:

const path = new Path2D()
path.arc(100, 100, 50, 0, Math.PI * 2)
ctx.clip(path)

实际应用

圆形头像

圆形头像效果

文字遮罩

文字遮罩效果

注意事项

路径要求

clip()需要在路径定义后调用,且路径必须闭合。

累积效果

多次clip会累积,使用save/restore重置。

性能考虑

复杂裁剪路径可能影响性能。

状态保存

clip会影响绑图状态,建议配合save/restore使用。