物理选项
通过弹簧、惯性等多种物理引擎实现自然动画
物理选项 (Physics Options)
SSGOI 4.0 支持多种物理引擎,让您能够创建自然流畅的动画。从弹簧物理到惯性动画,您可以为每种情况选择最佳的运动效果。
PhysicsOptions 接口
所有过渡都可以通过 physics 选项配置物理引擎:
type PhysicsOptions = {
spring?: SpringConfig; // 弹簧物理(ease-out 效果)
inertia?: InertiaConfig; // 惯性物理(ease-in 效果)
integrator?: () => Integrator; // 自定义积分器
};
每种物理引擎都提供不同的动画特性,您可以根据情况选择。
弹簧物理 (Spring Physics)
弹簧物理产生 ease-out 效果,适合大多数 UI 动画。
基本用法
import { fade } from '@ssgoi/react/view-transitions';
// 基本弹簧配置
fade({
physics: {
spring: {
stiffness: 300,
damping: 30
}
}
})
弹簧配置选项
type SpringConfig = {
stiffness: number; // 弹簧刚度(越高越快)
damping: number; // 阻尼系数(越高振荡越少)
doubleSpring?: boolean | number | {
stiffness: number;
damping: number;
};
};
- stiffness: 控制弹簧张力。值越高,动画越快。
- damping: 控制阻力。值越高,振荡越少,停止越平滑。
- doubleSpring: 双弹簧配置,用于 ease-in-out 效果
双弹簧 (Double Spring)
使用 doubleSpring 选项可以链接两个弹簧来创建 ease-in-out 效果:
// 自动配置 (true)
fade({
physics: {
spring: {
stiffness: 300,
damping: 30,
doubleSpring: true // follower 弹簧自动配置
}
}
})
// 比例配置 (0~1)
fade({
physics: {
spring: {
stiffness: 300,
damping: 30,
doubleSpring: 0.5 // follower 弹簧的 stiffness 比例(越小 ease-in 越强)
}
}
})
// 手动配置
fade({
physics: {
spring: {
stiffness: 300,
damping: 30,
doubleSpring: {
stiffness: 150, // follower 弹簧配置
damping: 20
}
}
}
})
惯性物理 (Inertia Physics)
惯性物理产生 ease-in 效果,适合方向性过渡(drill、slide 等)。
基本用法
import { drill } from '@ssgoi/react/view-transitions';
drill({
direction: 'enter',
physics: {
inertia: {
acceleration: 20,
resistance: 1.5
}
}
})
惯性配置选项
type InertiaConfig = {
acceleration: number; // 加速力(越大越快)
resistance: number; // 阻力系数(越大最终速度越低)
resistanceType?: 'linear' | 'quadratic'; // 阻力类型
};
- acceleration: 控制加速力。值越大,加速越快。
- resistance: 控制阻力系数。值越大,最终速度越低。
- resistanceType: 阻力类型(linear: 线性, quadratic: 二次函数)
使用示例
import { slide } from '@ssgoi/react/view-transitions';
// 平滑 ease-in 效果
slide({
direction: 'up',
physics: {
inertia: {
acceleration: 15,
resistance: 1.2,
resistanceType: 'linear'
}
}
})
// 快速 ease-in 效果
slide({
direction: 'down',
physics: {
inertia: {
acceleration: 30,
resistance: 2.0,
resistanceType: 'quadratic'
}
}
})
弹簧预设
为了让您无需手动调整物理值即可轻松创建不同的动画效果,我们提供了预定义的弹簧配置。
导入预设
import { config } from '@ssgoi/react/presets';
// 或
import { config } from '@ssgoi/svelte/presets';
// 或
import { config } from '@ssgoi/angular/presets';
// 在过渡中使用
transition({
physics: { spring: config.gentle },
tick: (progress) => {
// 您的动画逻辑
}
})
您也可以导入单独的预设:
import { gentle, wobbly, stiff } from '@ssgoi/react/presets';
transition({
physics: { spring: gentle },
// ...
})
可用预设
default
适合大多数用例的平衡动画。
- stiffness: 170
- damping: 26
- 用例: 通用过渡
gentle
具有细微动作的平滑、平静的过渡。
- stiffness: 120
- damping: 14
- 用例: 优雅、专业的界面
wobbly
具有明显弹簧效果的弹性、活泼的动画。
- stiffness: 180
- damping: 12
- 用例: 有趣、互动的元素
stiff
超调最小的快速响应动画。
- stiffness: 210
- damping: 20
- 用例: 快速 UI 响应、工具提示
slow
谨慎而有节制的动画。
- stiffness: 280
- damping: 60
- 用例: 重要状态更改、展示效果
molasses
非常缓慢和粘稠的运动。
- stiffness: 150
- damping: 60
- 用例: 戏剧性效果、加载状态
自定义物理配置
您可以创建自己的物理配置而不使用预设:
自定义弹簧
transition({
physics: {
spring: {
stiffness: 150,
damping: 15
}
},
// ...
})
自定义惯性
transition({
physics: {
inertia: {
acceleration: 25,
resistance: 1.8,
resistanceType: 'linear'
}
},
// ...
})
组合物理引擎
某些过渡可以为 IN 和 OUT 动画使用不同的物理引擎:
fade({
inPhysics: {
spring: {
stiffness: 300,
damping: 30
}
},
outPhysics: {
inertia: {
acceleration: 20,
resistance: 1.5
}
}
})
示例
在视图过渡中使用物理选项
import { Ssgoi } from '@ssgoi/react';
import { config } from '@ssgoi/react/presets';
import { fade, drill } from '@ssgoi/react/view-transitions';
const ssgoiConfig = {
// 使用弹簧预设
defaultTransition: fade({
physics: { spring: config.gentle }
}),
transitions: [
{
from: '/home',
to: '/about',
transition: fade({
physics: {
spring: {
stiffness: 300,
damping: 30,
doubleSpring: true // ease-in-out 效果
}
}
})
},
{
from: '/products',
to: '/products/*',
transition: drill({
direction: 'enter',
physics: {
inertia: {
acceleration: 20,
resistance: 1.5
}
}
})
}
]
};
在元素过渡中使用物理选项
import { transition } from '@ssgoi/react';
import { config } from '@ssgoi/react/presets';
// 使用弹簧预设
const fadeIn = transition({
physics: { spring: config.slow },
tick: (progress) => ({
opacity: progress,
transform: `translateY(${(1 - progress) * 20}px)`
})
});
// 使用自定义弹簧
const slideIn = transition({
physics: {
spring: {
stiffness: 200,
damping: 25,
doubleSpring: 0.4 // ease-in-out 效果
}
},
tick: (progress) => ({
opacity: progress,
transform: `translateX(${(1 - progress) * 50}px)`
})
});
物理引擎选择指南
每种物理引擎提供不同的动画感觉:
弹簧物理 (Spring)
- 效果: ease-out(快速开始,缓慢结束)
- 适合场景:
- 淡入/淡出
- 模态框打开/关闭
- 工具提示显示
- 元素出现/消失
- 优点: 自然平滑的减速,UI 中最广泛使用
双弹簧 (Double Spring)
- 效果: ease-in-out(缓慢开始,快速进行,缓慢结束)
- 适合场景:
- 长距离移动
- 页面过渡
- 重要的状态变化
- 优点: 优雅精致的感觉,开始和结束都平滑
惯性物理 (Inertia)
- 效果: ease-in(缓慢开始,快速结束)
- 适合场景:
- drill 过渡(放大/缩小)
- slide 过渡(方向性移动)
- 滚动效果
- 优点: 如用户直接操作的感觉,表达物理惯性
提示和最佳实践
1. 默认使用弹簧
大多数 UI 动画最适合使用弹簧物理:
fade({ physics: { spring: config.default } })
2. 方向性过渡使用惯性
当页面向特定方向移动时,惯性物理更自然:
drill({ direction: 'enter', physics: { inertia: { acceleration: 20, resistance: 1.5 } } })
3. 用双弹簧增加优雅感
在重要的页面过渡中使用 doubleSpring 可以创造更精致的感觉:
fade({ physics: { spring: { ...config.gentle, doubleSpring: true } } })
4. 从预设开始
在设置自定义值之前,先尝试预设:
// 从预设开始
physics: { spring: config.gentle }
// 需要时调整
physics: { spring: { ...config.gentle, stiffness: 250 } }
5. 保持一致性
在整个应用中为类似动画使用相同的物理配置:
const appPhysics = {
modal: { spring: config.stiff },
page: { spring: { ...config.gentle, doubleSpring: true } },
element: { spring: config.default }
};