tsParticles 粒子透明度控制详解:opacity 选项的静态、随机与动画淡入淡出实战
【免费下载链接】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 引擎中particles下的opacity选项展开,覆盖文档给出的全部属性说明、四组典型 JSON 配置示例与常见误区,并结合 OpacityUpdater 与 动画工具函数 的源码实现,讲清每个参数在引擎内部的真实作用:读完后你可以精确配置粒子透明度、用动画做出闪烁(twinkle-like)与淡出销毁效果,并理解sync、startValue、destroy等参数背后的调用链与默认值。
opacity 选项的定位
opacity位于粒子选项(particles)之下,控制粒子的透明度,支持静态值与随时间变化的动画淡入淡出效果。它由独立的功能包@tsparticles/opacity-updater(本仓库中位于 updaters/opacity)实现:该包通过 入口文件 向引擎的插件管理器注册一个粒子更新器,参与每个粒子的每帧更新。
属性总览
以下表格完整继承自 Opacity 官方说明,并结合源码补充了各参数的默认值:
| Key | Type | Example | Notes |
|---|---|---|---|
value | number/range | 0.5/{ min: 0.1, max: 0.8 } | Base opacity (0–1),默认值从源码看为1(见 Opacity 类) |
animation.enable | boolean | true/false | Animates opacity over time,默认false |
animation.speed | number | 3 | Rate of change(每秒向 min/max 变化的百分比),默认1 |
animation.startValue | string | min/max/random | Starting point of the animation,默认random(见 RangedAnimationOptions) |
animation.sync | boolean | true/false | Whentrue, all particles fade in sync,默认false |
animation.destroy | string | min/max/none | Destroys the particle when opacity reaches the chosen bound,默认none(见 OpacityAnimation 类) |
此外,从 AnimationOptions 基类 的结构看,animation下还继承了一组通用动画字段:count(动画循环次数上限,0表示无限)、decay(衰减系数)、delay(动画启动前的延迟,单位毫秒)与mode(auto/increase/decrease/random,决定朝向 min 还是 max 变化)。这些字段在 动画初始化函数 中都会生效。
快速上手示例
静态透明度
最简单的用法是给粒子设置固定的透明度:
{ "opacity": { "value": 0.5 } }每粒子随机透明度
value支持范围对象,每个粒子在[min, max]区间内随机取值,制造层次感:
{ "opacity": { "value": { "min": 0.2, "max": 0.8 } } }动画淡入淡出(闪烁效果)
开启动画后,透明度在min与max之间往返变化,得到类似 twinkle 的闪烁观感:
{ "opacity": { "value": { "min": 0.1, "max": 1 }, "animation": { "enable": true, "speed": 1, "startValue": "random", "sync": false } } }淡出并销毁
destroy指定到边界时销毁粒子,常用于粒子出场后自然消失:
{ "opacity": { "value": 1, "animation": { "enable": true, "speed": 0.5, "startValue": "max", "destroy": "min" } } }源码级原理:opacity 是如何生效的
初始化:初始值与速度
每个粒子创建时,OpacityUpdater.init 调用 initParticleNumericAnimationValue 计算该粒子的透明度状态:
value取随机值(若startValue为min/max则强制取边界值),同时记录min、max、initialValue;- 若动画开启,
velocity = (speed / 100) * retina.reduceFactor——这里的除数100来自 常量 percentDenominator,印证了文档中 “% per second” 的说法; - 当
sync为false时,速度再乘一个getRandom(),使各粒子变化快慢不同;sync为true时则所有粒子共享同一速度。
每帧更新:ping-pong 与销毁判定
每帧由 OpacityUpdater.update 驱动,内部委托给通用的 updateAnimation:
- 根据当前状态(increasing/decreasing)按
velocity * delta推进数值; - 触及
max或min时反转方向(opacity 传入的changeDirection为true,因此默认是往返震荡),并累加loops计数——这就是count能限制动画循环次数的原因; - 随后调用 checkDestroy:
destroy为max且值>= max、或为min且值<= min时,执行particle.destroy(); - 最后把数值
clamp回[min, max],保证透明度始终在合法区间。
speed与delta相乘意味着动画速率与帧率无关,delta.factor保证了高/低刷新率下观感一致。
sync 与 startValue 的配合
文档将 “animation.sync: true搭配startValue: random” 列为误区,说明此时sync被忽略。从 init 源码 看,sync只控制速度是否被随机化:startValue为random时每个粒子仍从不同相位出发,同步同一速度并不能让它们在同一时刻到达边界,因此 “同步淡变” 的观感无法成立。要获得真正同步的整体呼吸/闪烁效果,应使用startValue: "min"或"max"配合sync: true。
常见误区与排查
sync: true+startValue: random:如上所述,相位不同步导致sync实际失效,应改为固定起始点。destroy: "min"但没有 emitter 补充粒子:粒子到达最小透明度后被逐个销毁且不会重生,画布会逐渐变空。从 isEnabled 判定逻辑 看,已销毁粒子的动画直接跳过,不会复活;需要持续视觉效果时应配合 emitter 插件或改用往返震荡(不设destroy)。- 动画永远不触发:确认
animation.enable为true——它是 OpacityAnimation 继承来的开关,默认false;同时检查count是否过早耗尽循环(loops达到count后动画停止,见 update 中的早退条件)。 - speed 观感偏慢:
speed是百分比每秒,例如speed: 30表示透明度每秒变化 30 个百分点;若范围区间(max - min)很大,相同的speed所需时间自然更长。
相关文档
- 粒子选项总览:Particles
- 尺寸选项(使用同一套动画结构
RangedAnimationOptions,属性形状与 opacity 完全一致):Size - 选项文档根目录:Options
如需进一步阅读实现细节,可查阅 OpacityUpdater 完整源码、数值动画工具函数 以及 AnimationOptions 基类。
【免费下载链接】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),仅供参考