开始
无障碍
动效永远不该挡住任何人使用界面:减少动效、键盘操作、指针与屏幕阅读器。
Animate UI 的原语就是 Radix UI、Base UI 与 React Aria 的无障碍原语,只是上面加了动效。角色、ARIA 属性、焦点管理与键盘交互完全保持原库的行为:动画不会改变辅助技术看到什么,也不会改变它什么时候看到。
减少动效
当系统要求减少动效(prefers-reduced-motion: reduce)时,每个原语都会去掉位移,只保留有助于理解的部分:
- 浮层、菜单与对话框在原位淡入,不缩放、不滑动;
- 披露面板直接改变高度;
- 指示器、滑块与高亮直接跳到新位置;
- 图标与循环效果不再播放。
不需要任何配置,实时跟随系统设置,也尊重应用级的<MotionConfig reducedMotion="always">。要在应用层决定,可以设置AnimateUIProvider 的 reducedMotion:'never' 保留完整动效,'always'在所有地方减少。
<AnimateUIProvider reducedMotion="never">{children}</AnimateUIProvider>键盘
键盘用户移动得很快,所以由键盘驱动的操作不会等待动画:方向键高亮的项可以立即被选中,高亮自己滑过去;用方向键选中的 radio 或从键盘选中的标签页同样不等待。焦点由原库管理,与没有 Animate UI 时一致;菜单关闭后立即把焦点还给触发器,而不是等退场动画结束。
指针与触摸
悬停效果只在支持精确指针的设备上运行((hover: hover) and (pointer: fine)),所以触屏点按不会留下卡住的悬停状态。拖拽(抽屉、滑块、Toast)跟随手指,不增加额外延迟。
屏幕阅读器
关闭时仍保留在 DOM 中的内容(forceMount、keepMounted)会在退场播放完后被设为inert 或隐藏,因此不会被键盘到达,也不会被朗读。
时间
动画使用弹簧与短补间、强 ease-out,大部分位移在一开始就完成,界面立即响应;退场比入场更快。如果产品需要另一种节奏,AnimateUIProvider可以在一处改变所有时长:
<AnimateUIProvider tempo={0.8}>{children}</AnimateUIProvider>上线前检查
- 在系统开启“减少动效”后完整走一遍主要流程;
- 只用键盘完成打开、选择、关闭;
- 确认关闭后的浮层不会被 Tab 到达;
- 在触屏设备上检查没有残留的悬停状态;
- 用
animate-ui audit找出没有减少动效路径的文件。
对应官方文档 2026-10-18 版本。