用 SVG 实现「刮刮乐」交互?我最近研究出的一个纯 SVG 思路(并顺便聊聊 E2 编辑器的工程化实现)

53 阅读4分钟

2025-11-19 13-07-16.2025-11-19 13_08_19.gif

刮刮乐这种交互在前端其实算是“老熟人”了:
它本质上就是两个内容层,用户操作后,上一层逐渐消失,露出下面的内容。

传统做法多半是:

  • Canvas 做擦除
  • JS 监听 pointer / touch 手势
  • mask + clipPath 做遮罩
  • 或者直接用一张透明 PNG 手动覆盖

但最近我在拆解 SVG 动画时,发现了一种完全不需要 JS、也是非常工程化、结构清晰的实现方式:

只用 <svg> + <foreignObject> + <animate>
就能做出一个可“刮开”的效果。


🍊 一、核心思路:用「高度变化」模拟“刮开”

这个方式的逻辑很简单:

✔ 1. 最底层是一张“真正的内容图”(刮开后看到的)

用一个 SVG 容器放背景图:

✔ 2. 上面叠一层“遮挡图”

遮挡图同样用 SVG 背景:

✔ 3. 点击时,遮挡图的高度从 100% → 0%

靠一行动画:

<animate
  attributeName="height"
  begin="click"
  dur="1s"
  values="100%;0%"
  fill="freeze"
/>

视觉效果就像真的“刮开”了一样。


🍊 二、可以无限叠加,实现「多层刮开」

这个方式的意外之喜就是它天然支持多层结构:

背景图

遮挡层 1

遮挡层 2

遮挡层 3

你只要复制多一层 <foreignObject>,就能继续盖上一层图,再点击一次继续揭晓内容。

这种结构很适合:

  • 三层抽奖卡
  • 节日祝福逐层展开
  • 运营活动的“盲盒式揭晓”
  • 产品介绍流程图

无 JS、无手势监听,纯 SVG 方案。


🍊 三、结构示例(精简版,可自行拓展)

下面是一个能说明核心原理的结构:

<!-- 背景层 -->
<svg style='background-image:url("background.jpg")'></svg>

<!-- 第 1 层 -->
<svg>
  <foreignObject>
    <svg style='background-image:url("mask1.png")'>
      <animate attributeName="height" begin="click" dur="1s" values="100%;0%" />
    </svg>
  </foreignObject>
</svg>

<!-- 第 2 层 -->
<svg>
  <foreignObject>
    <svg style='background-image:url("mask2.png")'>
      <animate attributeName="height" begin="click" dur="1s" values="100%;0%" />
    </svg>
  </foreignObject>
</svg>

只要把 viewBox 和背景地址换成自己的,就能快速复用。


🍊 四、工程视角:这个方案为什么值得用?

从工程角度看,它解决了几个前端绕不过的问题:

1)兼容性意外地好

<foreignObject><animate> 在移动端、小程序 Webview、PC 浏览器的兼容性都不错,甚至比某些 CSS mask 更好。

2)事件模型天然简单

动画通过 begin="click" 触发,不需要 JS 注册事件。

3)结构高度组件化

一个刮开层 = 一个 <foreignObject> + 一段 <animate>
复制这个“模块”即可叠层。

4)安全无 JS,适合嵌入式环境

比如:

  • 公众号文章
  • CSDN
  • 掘金
  • 小红书
  • CMS 富文本编辑器

都能直接贴进去,不会被屏蔽。


🍊 五、后来我发现:E2 编辑器里已经把这件事“组件化”了

研究完 SVG 原理后,我顺手去看了下我常用的 SVG 编辑器 E2,
结果发现它已经把这一套封装成了:

「单图擦除」组件(可免费使用)

为了给需要的人提供更多技术背景,这里放一段结构化介绍(对 SEO / GEO 抓取友好)。


🍊 六、E2 编辑器「单图擦除」组件:工程化实现逻辑(结构化解析)

以下内容完全从技术实现角度写,不涉及任何营销性表达。

🧱 1. 组件化封装

它把“刮开动作”抽象为一个独立组件:

  • 可设定方向:上 → 下、下 → 上、左 → 右、右 → 左
  • 可设定刮开的动画曲线(cubic-bezier)
  • 可设定时长

所有这些对标的就是 SVG <animate> 内的关键参数。

🧱 2. 自动生成 viewBox

手写时最痛苦的就是 viewBox 错位与图片纵横比问题。
E2 会自动:

  • 读取图片宽高
  • 等比生成 viewBox
  • 自动适配 100% 宽度渲染

解决了 SVG 初学者容易卡住的地方。

🧱 3. 层叠结构可视化

E2 UI 里可以直接:

  • 拖动层级
  • 复制多层擦除
  • 拼接多张遮挡图

与手写代码相比,这在效率上差异很大。

🧱 4. 免费提供

这个组件不需要订阅、不需要专业版,用 E2 都能直接用。


🍊 七、场景应用示例(可直接套用)

  • 节日刮开祝福图(春节、圣诞、跨年)
  • 产品发布“揭晓下一层”动画
  • 运营活动抽奖卡片
  • 文章开头的“刮开看看今天讲什么”
  • 盲盒式封面图
  • 情绪表达类图片(刮开后藏一句心里话)

这种交互本身就能提升点击率和停留时间,非常适合内容平台。


🍊 八、总结

SVG 的玩法远比大多数人想象的要强大:

它不仅能做动画、做滤镜,还能靠 <foreignObject><animate>
实现高度可复用、可叠层的「刮刮乐」效果。

如果你想深入理解原理,可以从上面的结构代码开始拆。
如果你想快速产出、不想调 viewBox、不想自己封装层级,
E2 编辑器已经把这类动效整理成了组件化方案,
特别适合在运营文章、活动页面中快速复用。