弹簧

一个弹簧曲线生成器,返回一个带有相应持续时间的缓动函数,用于创建基于物理的动画。

spring() 方法可以直接传递给 ease 参数,作为 animate() 方法的一部分。

import { animate, spring } from 'animejs';

animate(target, { x: 100, ease: spring({ bounce: .5 }) });

动画的 duration 参数会被弹簧计算出的稳定持续时间覆盖。

感知参数

这些参数为生成的曲线提供了更直观和可预测的控制,侧重于视觉上的感觉而非底层的物理特性。
当使用感知参数时,物理值会根据 Apple 的 SwiftUI 弹簧模型自动计算。

animate(target, { x: 100, ease: spring({ bounce: .5, duration: 350 }) });
名称 类型 信息
弹性 数字 控制动画的“弹性”。范围:-11。默认值:0.5。从 01 的值会产生有弹性的曲线,小于 0 的值会产生过阻尼曲线。建议将 bounce 值保持在 -.5.5 之间,否则超出此范围的值会创建非常极端的曲线,并且与 duration 参数配合不佳。
持续时间 数字 动画在视觉上感觉完成时的感知持续时间(毫秒)。范围:1010000。默认值:628

物理参数

直接控制底层的弹簧物理模型。当您需要对物理模拟进行更精确的控制时,请使用这些参数。

animate(target, { x: 100, ease: spring({ stiffness: 95, damping: 13 }) });
名称 类型 信息
质量 数字 连接到弹簧的物体的质量。范围:110000。默认值:1。更高的值会产生更大的惯性,导致更慢、更重的运动。
刚度 数字 弹簧刚度系数。范围:010000。默认值:100。更高的值会产生更紧的弹簧,响应更快、更剧烈。
阻尼 数字 抵抗运动的阻尼系数。范围:010000。默认值:10。控制振荡衰减的速度。更高的值会减少弹性。
velocity 数字 动画的初始速度。范围:-1000010000。默认值:0。正值使动画在目标方向上获得“启动”。

感知 onComplete 回调

这仅适用于 animate()JS 版本。

动画的 onComplete 回调是根据弹簧的稳定持续时间调用的,这会在动画感觉完成的时刻与实际回调调用之间产生视觉上的脱节。
为了解决这个问题,可以在弹簧参数对象上定义一个单独的 onComplete 回调,当弹簧的感知 duration 达到时,该回调将被调用。

animate(target, {
  x: 100,
  onCompete: () => console.log('called when the setting duration is reached'),
  ease: spring({ 
    bounce: .25,
    duration: 350,
    onCompete: () => console.log('called when the spring perceived duration is reached'),
  })
});
名称 类型 信息
onComplete 函数 当弹簧达到其感知持续时间(而非稳定持续时间)时触发的回调。这会在动画在观看者看来完成时触发。

示例

名称 编辑器链接
默认弹簧 在编辑器中打开
灵敏弹簧 在编辑器中打开
弹性弹簧 在编辑器中打开
强力弹簧 在编辑器中打开

弹簧代码示例

import { animate, spring, utils } from 'animejs';

const [ $square1, $square2, $square3 ] = utils.$('.square');

utils.set('.square', { color: 'var(--hex-red-1)' })

animate($square1, {
  x: '17rem',
  rotate: 360,
  onComplete: () => utils.set($square1, { color: 'var(--hex-green-1)' }),
  ease: spring({
    bounce: .15,
    duration: 500,
    onComplete: () => utils.set($square1, { color: 'var(--hex-yellow-1)' }),
  })
});

animate($square2, {
  x: '17rem',
  rotate: 360,
  onComplete: () => utils.set($square2, { color: 'var(--hex-green-1)' }),
  ease: spring({
    bounce: .3,
    duration: 500,
    onComplete: () => utils.set($square2, { color: 'var(--hex-yellow-1)' }),
  })
});

animate($square3, {
  x: '17rem',
  rotate: 360,
  onComplete: () => utils.set($square3, { color: 'var(--hex-green-1)' }),
  ease: spring({
    stiffness: 90,
    damping: 14,
    onComplete: () => utils.set($square3, { color: 'var(--hex-yellow-1)' }),
  })
});
<div class="medium row">
  <div class="square"></div>
  <div class="padded label">{ bounce: .15, duration: 500 }</div>
</div>
<div class="medium row">
  <div class="square"></div>
  <div class="padded label">{ bounce: .3, duration: 500 }</div>
</div>
<div class="medium row">
  <div class="square"></div>
  <div class="padded label">{ stiffness: 90, damping: 14 }</div>
</div>