tsParticles Filter Effect 完全指南:用 CSS Filter 为粒子特效叠加风格化滤镜
【免费下载链接】tsparticlestsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animated backgrounds for your website. Ready to use components available for React.js, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Inferno, Solid, Riot and Web Components.项目地址: https://gitcode.com/GitHub_Trending/ts/tsparticles
tsParticles 官方 effects 家族中的@tsparticles/effect-filter插件,将 CSSfilter能力接入粒子渲染管线,让你无需手写 Canvas 绘制代码,仅通过配置即可为粒子应用 blur、grayscale、sepia、drop-shadow、hue-rotate 等滤镜,快速改变粒子视觉风格。本指南以仓库 effects/filter/README.md 为主线,结合 effects/filter 目录下的源码与 engine 的注册机制,完整覆盖安装、加载、配置、原理与实战注意事项,帮助你直接把 Filter Effect 应用到自己的项目中。
什么是 Filter Effect
Filter Effect 是 tsParticles 提供的一个"渲染前拦截"型效果插件。它复用引擎中已有的粒子形状、运动与交互逻辑,只在粒子绘制前后对 Canvas 上下文应用一层 CSS 滤镜(context.filter),从而让同一种粒子在不改变几何外观的前提下呈现出完全不同的视觉风格。典型应用包括:
- 老照片/胶片质感的粒子背景(grayscale + sepia + contrast);
- 柔光、发光感粒子(blur + drop-shadow);
- 反色、卡通化等创意视觉(invert + saturate);
- 通过
url()引用 SVG 滤镜实现更复杂的效果。
它在仓库中的位置是 effects/filter,npm 包名为@tsparticles/effect-filter,是官方提供的独立插件包,可通过加载函数按需注册,不会增加主包体积。
安装与加载
前置依赖
Filter Effect 依赖核心引擎 @tsparticles/engine 提供的tsParticles实例与插件注册机制,两者需要一起安装。仓库中 effects/filter/package.json 将@tsparticles/engine声明为peerDependencies,这意味使用方需要自行安装引擎。
npm / yarn 安装
npm install @tsparticles/engine @tsparticles/effect-filter或使用 yarn:
yarn add @tsparticles/engine @tsparticles/effect-filterCDN / Vanilla JS / jQuery
CDN 版本在引入tsparticles.effect.filter.min.js后会向全局对象暴露loadFilterEffect函数(见 browser.ts),无需 import 即可使用:
<script src="https://cdn.jsdelivr.net/npm/tsparticles-engine"></script> <script src="https://cdn.jsdelivr.net/npm/@tsparticles/effect-filter"></script> <script> (async () => { await loadFilterEffect(tsParticles); await tsParticles.load({ id: "tsparticles", options: { /* options */ /* 在 particles.effect.type 中使用 "filter" */ }, }); })(); </script>ESM / CommonJS
CommonJS 方式:
const { tsParticles } = require("@tsparticles/engine"); const { loadFilterEffect } = require("@tsparticles/effect-filter"); (async () => { await loadFilterEffect(tsParticles); })();ESM 方式:
import { tsParticles } from "@tsparticles/engine"; import { loadFilterEffect } from "@tsparticles/effect-filter"; (async () => { await loadFilterEffect(tsParticles); })();懒加载(Lazy)入口
如果你的打包器重视首屏体积,可以导入@tsparticles/effect-filter/lazy。仓库中 index.lazy.ts 会在效果真正被使用时才动态import("./FilterDrawer.js"),从而把 FilterDrawer 拆成独立的异步 chunk:
import { tsParticles } from "@tsparticles/engine/lazy"; import { loadFilterEffect } from "@tsparticles/effect-filter/lazy"; (async () => { await loadFilterEffect(tsParticles); })();工作原理:FilterDrawer 与插件注册
Filter Effect 的核心实现位于 FilterDrawer.ts,它实现了引擎定义的IEffectDrawer接口,包含三个关键钩子:
| 方法 | 作用 |
|---|---|
particleInit(container, particle) | 粒子初始化时,把particle.effectData中配置的滤镜字段复制到粒子实例属性上 |
drawBefore(data) | 渲染前context.save(),拼接各滤镜函数并赋给context.filter |
drawAfter(data) | 渲染后context.restore(),恢复画布上下文,避免滤镜泄漏到后续绘制 |
loadFilterEffect(index.ts)在内部调用engine.pluginManager.addEffect("filter", () => new FilterDrawer())完成注册,注册机制位于 PluginManager.ts。注册完成后,配置particles.effect.type: "filter"时引擎即可解析到对应的 drawer。
drawBefore中 filter 字符串的拼接逻辑对应 IFilterData.ts 中的字段:
blur与hueRotate为数字时自动补充单位:blur(2px)、hue-rotate(45deg);传字符串则原样使用;dropShadow与url直接作为字符串嵌入:drop-shadow(2px 2px 4px rgba(0,0,0,0.5))、url(#filterId);- 其余数值型滤镜(brightness、contrast、grayscale、invert、opacity、saturate、sepia)直接填充;
- 未设置的属性会被跳过,最终以空格分隔多个滤镜函数并
trim()后赋值给context.filter。
配置详解
Filter Effect 的配置分两层:particles.effect负责选择效果类型,options.filter负责传递滤镜数据。
粒子层 effect 选项
effect对象定义在引擎的 Effect.ts 中,有三个属性:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
type | string/string[] | [] | 效果名称,Filter Effect 注册名固定为"filter" |
options | ShapeData | {} | 按效果名存放的数据载荷,Filter 的配置写在options.filter下 |
close | boolean | true | 效果路径是否闭合(对 filter 效果无实际绘制影响,通常保持默认) |
从 Effect.ts 的doLoad可以看出,options会按效果名做deepExtend深度合并,因此你可以分多次合并配置而无需一次性写全。
滤镜参数:options.filter
options.filter是传给FilterDrawer的数据对象,支持以下字段(完整字段见 IFilterData.ts):
| 字段 | 类型 | 生成的 CSS filter 示例 | 说明 |
|---|---|---|---|
blur | number/string | blur(2px) | 模糊半径;数字自动加px,字符串原样 |
brightness | number | brightness(1.2) | 亮度倍率,1为原始值 |
contrast | number | contrast(1.5) | 对比度倍率,1为原始值 |
dropShadow | string | drop-shadow(2px 2px 4px rgba(0,0,0,0.5)) | 完整字符串,需自备单位 |
grayscale | number | grayscale(1) | 灰度比例,0~1 |
hueRotate | number/string | hue-rotate(45deg) | 色相旋转;数字自动加deg |
invert | number | invert(1) | 反色比例,0~1 |
opacity | number | opacity(0.5) | 透明度,0~1 |
saturate | number | saturate(2) | 饱和度倍率,1为原始值 |
sepia | number | sepia(0.8) | 棕褐色比例,0~1 |
url | string | url(#feColorMatrix) | 引用 SVG 滤镜的 URL |
完整配置示例
一个"老胶片"风格的粒子配置:
{ "particles": { "effect": { "type": "filter", "options": { "filter": { "grayscale": 0.8, "sepia": 0.4, "contrast": 1.1, "brightness": 1.05 } } } } }一个"柔光发光"风格的配置:
{ "particles": { "effect": { "type": "filter", "options": { "filter": { "blur": 1, "dropShadow": "0 0 6px rgba(255, 200, 100, 0.8)" } } } } }数据流:从配置到 Canvas
结合引擎 Particle.ts 的初始化流程可以还原完整链路:
tsParticles.load()解析配置,Effect类把options.filter深合并进effect.options;- 粒子创建时读取
effect.type,若匹配已注册的"filter",把options.filter拷贝为particle.effectData; FilterDrawer.particleInit将effectData的字段展开到粒子实例(filterBlur、filterGrayscale等,字段定义见 FilterParticle.ts);- 每帧绘制时
drawBefore根据粒子实例属性拼接context.filter,绘制形状后drawAfter恢复上下文。
这意味着同一粒子实例在任意时刻都携带完整的滤镜快照,便于后续扩展按粒子差异化配置。
注意事项与常见问题
Safari 兼容性
CanvasRenderingContext2D.filter在 Safari 与 iOS Safari 中默认未启用(MDN 文档有说明),需要用户在浏览器设置中手动开启。因此面向 Apple 设备用户时需谨慎使用本效果,建议提供降级方案或在使用前检测context.filter支持情况。README 中也明确提示了这一点。
加载顺序
必须在tsParticles.load(...)之前调用await loadFilterEffect(tsParticles),否则引擎注册表中没有"filter"效果,配置会被静默忽略,粒子按普通方式渲染。
调试建议
- 一次只改动一个滤镜组(例如先只调
blur,再叠加sepia),便于快速定位回归; - 检查是否缺少 peer 依赖
@tsparticles/engine; - 多滤镜叠加时注意顺序:CSS filter 函数按书写顺序执行,
blur与drop-shadow先后不同效果也不同; - 大数量粒子 + 全局滤镜可能带来性能开销,可优先用较大尺寸粒子或降低粒子密度。
与其他模块的组合
Filter Effect 只干预渲染阶段,不影响粒子的移动、旋转、形状、交互等行为,因此可以自由与仓库中其他模块组合:
- 形状:shapes 下的任意 shape(circle、star、heart、emoji 等)都可作为滤镜载体;
- 移动与更新器:updaters 下的 color、size、opacity、rotate 等更新器照常生效;
- 交互:interactions 下的 connect、grab、bubble 等交互插件不受影响;
- 其他效果:仓库 effects 下还有 bubble、shadow、trail、particles 等同族插件,注册与配置方式一致,可叠加使用。
小结
@tsparticles/effect-filter通过"注册效果 + 渲染前设置context.filter+ 渲染后恢复"的简洁设计,把完整 CSS 滤镜能力交还给配置层。本文覆盖了从安装加载、配置参数到源码数据流的完整链路,并给出了胶片、柔光等可直接套用的配置示例。在动手之前请记住两条关键规则:先loadFilterEffect再tsParticles.load,以及Safari 默认不开启 canvas filter。
【免费下载链接】tsparticlestsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animated backgrounds for your website. Ready to use components available for React.js, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Inferno, Solid, Riot and Web Components.项目地址: https://gitcode.com/GitHub_Trending/ts/tsparticles
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考