Vanilla Disintegratev1.3.0
ZH
本页内容

内置粒子渲染器可从根入口、/snapdom/particles 导入。如果只需要渲染器及其类型,而不需要 Disintegrator、捕获和内置音频,请使用 /particles

import {
  configureParticleContexts,
  createParticleAnimation,
  createParticleEffect,
  createParticleRestoreAnimation,
  particlePresets,
} from 'vanilla-disintegrate/particles';

createParticleEffect(options?)

创建一个完整的 EffectDefinition,删除与恢复阶段可以分别配置。

interface ParticleEffectOptions {
  remove?: ParticleOptions;
  restore?: ParticleOptions;
}

const effect = createParticleEffect({
  remove: { ...particlePresets.vapor, release: 'top' },
  restore: { ...particlePresets.scatter, release: 'center' },
});

省略 restore 时,它会使用与 remove 相同的配置。两个字段都省略时,两个阶段都使用粒子默认值。该工厂只配置视觉效果;声音应单独通过 sound 添加,或者将效果和音频组合成完整预设。

ParticleOptions

距离和粒子大小使用 CSS 像素,时长使用毫秒,旋转使用角度,归一化参数使用 01 范围。

参数类型默认值控制内容
renderQuality'auto' | 'exact' | ParticleRenderBudget'auto'WebGL 渲染器的分辨率与资源限制
particleSize'auto' | number'auto'单个粒子的最小边长;数值最小为 0.25
alphaThresholdnumber0Alpha 不高于该值的源像素不会生成粒子
curve'settle' | 'float' | 'burst' | 'drift''settle'位移、加速与恢复的运动曲线
durationnumber720阶段的基础时长
staggernumber180分配给各粒子的最大额外启动延迟
release'left' | 'right' | 'top' | 'bottom' | 'center' | 'edges' | 'random''left'元素中最先释放粒子的区域
releaseRandomnessnumber0.22所选释放顺序(0)与随机顺序(1)的混合比例
fadeStartnumber取决于 curve每个粒子在自身生命周期中开始淡出的时点
layoutReleasenumber0.6周围布局开始移动前需要释放的粒子比例
horizontalDriftnumber42添加到每条路径的随机横向偏移
horizontalTravelreadonly [number, number][0, 0]有方向水平位移的最小值与最大值
verticalTravelreadonly [number, number][-100, -45]垂直位移的最小值与最大值;负值表示向上
convergencenumber0粒子向元素水平中心汇聚的强度
swirlnumber0路径上垂直波动的振幅
waveTurnsnumber取决于 curve路径上的振荡次数
endScalenumber0.92删除结束时的粒子缩放比例
rotationreadonly [number, number][0, 0]分配给粒子的最终旋转角度范围

alphaThresholdconvergencereleaseRandomnessfadeStartlayoutRelease 会限制在 01。负数的 durationstaggerhorizontalDriftswirlwaveTurnsendScale 会归零。顺序颠倒的范围端点会自动排序。

曲线

曲线特点默认 fadeStart默认 waveTurns
settle均衡移动并平滑结束0.31
float更柔和的漂浮运动0.31.6
burst更快的初始加速0.121
drift较长的定向运动0.321.25

显式设置的 fadeStartwaveTurns 会覆盖曲线默认值。

释放顺序

leftrighttopbottom 从对应边缘开始释放。center 从中心向外扩展,edges 从外侧向内推进。random 不使用几何顺序。releaseRandomness 可以在不改变所选方向的情况下,为任何有序模式加入随机性。

布局切换

layoutRelease 决定删除时 DOM 重排动画何时开始。值为 0 时布局可以立即移动;值为 1 时会等到所有粒子都已释放。渲染器根据生成的粒子场计算实际 layoutDelay,因此它会与 releasereleaseRandomness 保持同步。

渲染质量

type ParticleRenderQuality = 'auto' | 'exact' | ParticleRenderBudget;

interface ParticleRenderBudget {
  maxSourcePixels: number;
  maxSourceDimension: number;
  maxRenderPixels: number;
}

auto 使用以下软件限制:

{
  maxSourcePixels: 2_000_000,
  maxSourceDimension: 2048,
  maxRenderPixels: 4_000_000,
}

exact 保留捕获结果的完整分辨率并关闭软件降采样。它无法突破设备的 WebGL 纹理或视口限制;无法支持的表面会通过 onError 报告。自定义预算允许应用自行权衡清晰度、内存和 GPU 工作量。

renderQuality 只影响 WebGL 渲染器。源 canvas 包含多少像素由捕获适配器独立决定。

底层阶段工厂

function createParticleAnimation(options?: ParticleOptions): AnimationFactory;
function createParticleRestoreAnimation(options?: ParticleOptions): AnimationFactory;

createParticleAnimation() 创建删除阶段的动画工厂,createParticleRestoreAnimation() 创建对应的恢复阶段工厂。手动组合 EffectDefinition 时可使用它们;如果两个阶段都使用内置渲染器,优先使用 createParticleEffect()

两个工厂都需要快照。如果 AnimationContext.snapshotnull,它们会返回 null,操作随后进入常规的跳过动画回退流程。

particlePresets

type BuiltInPreset = 'dust' | 'scatter' | 'vapor' | 'wind';

const particlePresets: Readonly<Record<BuiltInPreset, Readonly<ParticlePreset>>>;

particlePresets 只包含深度冻结的视觉配置,不含音频,用于 createParticleEffect() 或底层工厂。根入口和 /snapdom 导出的 builtInPresets 则是可供 Disintegrator 使用的完整视觉与音频预设。

configureParticleContexts(limits?)

interface ParticleContextLimits {
  maxContexts?: number;
  maxIdleContexts?: number;
}

const applied = configureParticleContexts({
  maxContexts: 2,
  maxIdleContexts: 1,
});

该设置作用于整个页面,通常应在任何效果启动前设置一次。默认最多保留四个活跃 WebGL2 上下文,并最多保留两个空闲上下文供复用。空闲上下文会在 30 秒后释放,超出空闲上限的上下文会立即释放。

maxContexts 会规范为不小于 1 的整数。maxIdleContexts 会规范为非负整数,并且不会超过 maxContexts。函数返回当前实际使用的限制。

如果渲染器无法获取上下文,DOM 操作仍会提交,finishedstatus: 'skipped' 结束,并通过 onError 报告失败。

在 GitHub 上编辑此页