AI 摘要
下面的自定义 ease 曲线是我在 Animations on the web 课程中看到的,由 Benjamin De Cock 制作。如果内置缓和曲线不够强,你可以使用这些曲线。
结合 Tailwind 使用
:root { --ease-in-quad: cubic-bezier(0.55, 0.085, 0.68, 0.53); --ease-in-cubic: cubic-bezier(0.55, 0.055, 0.675, 0.19); --ease-in-quart: cubic-bezier(0.895, 0.03, 0.685, 0.22); --ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06); --ease-in-expo: cubic-bezier(0.95, 0.05, 0.795, 0.035); --ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.335); --ease-out-quad: cubic-bezier(0.25, 0.46, 0.45, 0.94); --ease-out-cubic: cubic-bezier(0.215, 0.61, 0.355, 1); --ease-out-quart: cubic-bezier(0.165, 0.84, 0.44, 1); --ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1); --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1); --ease-out-circ: cubic-bezier(0.075, 0.82, 0.165, 1); --ease-in-out-quad: cubic-bezier(0.455, 0.03, 0.515, 0.955); --ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1); --ease-in-out-quart: cubic-bezier(0.77, 0, 0.175, 1); --ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1); --ease-in-out-expo: cubic-bezier(1, 0, 0, 1); --ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.15, 0.86); }
import typograhpy from '@tailwindcss/typography'; import type { Config } from 'tailwindcss'; export default { content: ['./src/**/*.{ts,tsx}', './data/**/*.{md,mdx}'], theme: { extend: { // ... 其他扩展配置 ... transitionTimingFunction: { 'in-quad': 'var(--ease-in-quad)', 'in-cubic': 'var(--ease-in-cubic)', 'in-quart': 'var(--ease-in-quart)', 'in-quint': 'var(--ease-in-quint)', 'in-expo': 'var(--ease-in-expo)', 'in-circ': 'var(--ease-in-circ)', 'out-quad': 'var(--ease-out-quad)', 'out-cubic': 'var(--ease-out-cubic)', 'out-quart': 'var(--ease-out-quart)', 'out-quint': 'var(--ease-out-quint)', 'out-expo': 'var(--ease-out-expo)', 'out-circ': 'var(--ease-out-circ)', 'in-out-quad': 'var(--ease-in-out-quad)', 'in-out-cubic': 'var(--ease-in-out-cubic)', 'in-out-quart': 'var(--ease-in-out-quart)', 'in-out-quint': 'var(--ease-in-out-quint)', 'in-out-expo': 'var(--ease-in-out-expo)', 'in-out-circ': 'var(--ease-in-out-circ)', }, // ... 其他扩展配置 ... }, }, // ... 其他配置 ... } satisfies Config;
这样配置后,我们就可以在 tsx 文件中使用这些缓动函数了。例如:
<div className="transition-all duration-300 ease-out-quart">
这个 div 将使用 ease-out-quart 缓动函数进行过渡
</div>结合 Framer Motion 使用
下面代码中的 Spring animations 来自最近很火的 RSSNext/Follow 软件仓库,可以在官方的开源代码中找到。
import type { Spring, Easing } from 'motion/react' // Spring animations export const rebound: Spring = { type: 'spring', bounce: 0.25, stiffness: 140, damping: 8, } export const microDamp: Spring = { type: 'spring', damping: 24, } export const microRebound: Spring = { type: 'spring', stiffness: 300, damping: 20, } export const softSpring: Spring = { type: 'spring', stiffness: 120, damping: 20, } export const softBounce: Spring = { type: 'spring', damping: 10, stiffness: 100, } // Easing functions export const inQuad: Easing = [0.55, 0.085, 0.68, 0.53] export const inCubic: Easing = [0.55, 0.055, 0.675, 0.19] export const inQuart: Easing = [0.895, 0.03, 0.685, 0.22] export const inQuint: Easing = [0.755, 0.05, 0.855, 0.06] export const inExpo: Easing = [0.95, 0.05, 0.795, 0.035] export const inCirc: Easing = [0.6, 0.04, 0.98, 0.335] export const outQuad: Easing = [0.25, 0.46, 0.45, 0.94] export const outCubic: Easing = [0.215, 0.61, 0.355, 1] export const outQuart: Easing = [0.165, 0.84, 0.44, 1] export const outQuint: Easing = [0.23, 1, 0.32, 1] export const outExpo: Easing = [0.19, 1, 0.22, 1] export const outCirc: Easing = [0.075, 0.82, 0.165, 1] export const inOutQuad: Easing = [0.455, 0.03, 0.515, 0.955] export const inOutCubic: Easing = [0.645, 0.045, 0.355, 1] export const inOutQuart: Easing = [0.77, 0, 0.175, 1] export const inOutQuint: Easing = [0.86, 0, 0.07, 1] export const inOutExpo: Easing = [1, 0, 0, 1] export const inOutCirc: Easing = [0.785, 0.135, 0.15, 0.86]
使用示例:
import { motion } from 'motion/react' import { softSpring, outExpo } from './components/ui/constants/animation' function AnimatedComponent() { return ( <motion.div initial={{ opacity: 0, y: 50 }} animate={{ opacity: 1, y: 0 }} transition={softSpring} > Spring Animation </motion.div> ) } function EasingAnimatedComponent() { return ( <motion.div initial={{ opacity: 0, x: -50 }} animate={{ opacity: 1, x: 0 }} transition={{ duration: 0.6, ease: outExpo }} > Easing Animation </motion.div> ) }
Spring 动画优化
昨晚看到一篇文章:轻松制作用户界面弹簧动画:参数方法
可以对 Spring 动画进行优化,创造出更流畅的动画效果。
在之前的 animation.ts 文件中添加以下代码:
// 新增函数:生成优化的弹簧动画配置 export function createOptimizedSpring(perceptualDuration: number, bounce: number): Spring { const mass = 1 const stiffness = Math.pow((2 * Math.PI) / perceptualDuration, 2) * mass let damping: number if (bounce >= 0) { damping = ((1 - bounce) * 4 * Math.PI) / perceptualDuration } else { damping = (4 * Math.PI) / (perceptualDuration * (1 + bounce)) } return { type: 'spring', mass, stiffness, damping, } } // 使用新函数创建优化的弹簧动画 export const optimizedRebound = createOptimizedSpring(0.5, 0.25) export const optimizedMicroDamp = createOptimizedSpring(0.3, -0.5) export const optimizedMicroRebound = createOptimizedSpring(0.2, 0.1) export const optimizedSoftSpring = createOptimizedSpring(0.6, 0) export const optimizedSoftBounce = createOptimizedSpring(0.8, 0.3)
- 质量 (mass):
- 刚度 (stiffness):
- 阻尼 (damping):
这段代码创建了一个优化的弹簧动画配置,通过调整感知持续时间(perceptualDuration)和反弹程度(bounce)来控制动画的行为。这种方法允许你以更直观的方式定义弹簧动画,而不是直接操作质量、刚度和阻尼这些较为抽象的物理参数。
作者也提供了开发的2个相关工具:CSS Spring Easing Generator 和 tailwind spring plugin。
Ease 动画使用场景
-
ease-in(开始慢,然后加速):
- 元素离开屏幕或视图
- 淡出效果
- 下拉菜单关闭
- 模态框关闭
具体曲线选择:
- quad:适合轻微的加速效果
- cubic/quart:中等加速效果
- quint/expo:快速加速效果
- circ:非常快速的加速,适合戏剧性效果
-
ease-out(开始快,然后减速):
- 元素进入屏幕或视图
- 淡入效果
- 下拉菜单打开
- 模态框打开
- 弹出提示
具体曲线选择:
- quad:轻微的减速效果
- cubic/quart:中等减速效果
- quint/expo:快速减速效果
- circ:非常快速的减速,适合戏剧性效果
-
ease-in-out(开始慢,中间快,结束慢):
- 元素在屏幕上移动
- 颜色变化
- 大小缩放
- 旋转动画
- 页面切换过渡
具体曲线选择:
- quad:适合轻微的过渡效果
- cubic/quart:中等强度的过渡效果
- quint/expo:强烈的过渡效果
- circ:非常强烈的过渡效果,适合戏剧性的变化
一些具体的应用示例:
-
按钮悬停效果:使用
ease-out-quart可以让按钮快速放大然后缓慢停止。 -
页面滚动:使用
ease-in-out-cubic可以创造出平滑的滚动效果。 -
加载动画:使用
ease-in-out-quint可以为循环动画添加有趣的节奏。 -
菜单展开:使用
ease-out-expo可以让菜单快速展开并在结束时略微减速。 -
图片画廊切换:使用
ease-in-out-circ可以创造出戏剧性的图片切换效果。 -
表单验证反馈:使用
ease-in-quad可以为错误提示添加轻微的进入效果。 -
卡片翻转:使用
ease-in-out-cubic可以创造出自然的翻转动画。 -
进度条填充:使用
ease-out-quart可以让进度条快速开始并逐渐减速。
选择合适的缓动曲线可以大大提升用户界面的感觉和用户体验。根据动画的具体需求和上下文,你可以选择最合适的曲线来实现预期的效果。
Spring 动画使用场景
- 页面转场动画
- 使用
optimizedSoftSpring或optimizedMicroRebound可以为页面切换提供平滑的过渡效果。
- 弹出菜单或模态框
optimizedRebound适合用于菜单或模态框的打开动画,给用户一种轻快的感觉。
- 列表项动画
- 在加载列表时,使用
optimizedMicroDamp可以让列表项依次滑入,创造出流畅的加载效果。
- 按钮反馈
- 点击按钮时,用
optimizedMicroRebound制作轻微的按压效果,增强交互感。
- 滚动动画
- 使用
optimizedSoftBounce可以为滚动到页面顶部或底部时提供柔和的反弹效果。
- 展开/折叠动画
- 对于可折叠的内容面板,
optimizedSoftSpring可以创造出自然的展开和折叠动画。
- 拖拽释放效果
- 在拖拽界面元素后释放时,使用
optimizedRebound可以提供适度的回弹效果。
- 图表动画
- 在数据可视化中,使用
optimizedMicroDamp可以让图表元素平滑地进入视图。
- 表单验证反馈
- 当输入无效时,使用
optimizedMicroRebound可以为输入框添加轻微的抖动效果。
- 加载指示器
- 使用
optimizedSoftBounce可以创建循环的加载动画,如跳动的圆点。
- 卡片堆叠效果
- 在卡片式界面中,使用
optimizedSoftSpring可以创建平滑的卡片切换动画。
- 悬停效果
- 为按钮或卡片添加悬停效果时,
optimizedMicroRebound可以创造出轻微的放大或浮起效果。
在使用这些优化后的动画时,可以根据具体需求调整 createOptimizedSpring 函数的参数。例如,如果需要更快或更慢的动画,可以调整 perceptualDuration;如果需要更强或更弱的反弹效果,可以调整 bounce 值。
这些优化后的动画配置不仅可以提高动画的视觉吸引力,还能确保动画在不同设备上的一致性和可预测性。通过精心设计的动画,可以显著提升用户体验,使界面更加生动和易于理解。