跳到正文
目录与搜索
⌘K

开始

无障碍

动效永远不该挡住任何人使用界面:减少动效、键盘操作、指针与屏幕阅读器。

Animate UI 的原语就是 Radix UI、Base UI 与 React Aria 的无障碍原语,只是上面加了动效。角色、ARIA 属性、焦点管理与键盘交互完全保持原库的行为:动画不会改变辅助技术看到什么,也不会改变它什么时候看到。

减少动效

当系统要求减少动效(prefers-reduced-motion: reduce)时,每个原语都会去掉位移,只保留有助于理解的部分:

  • 浮层、菜单与对话框在原位淡入,不缩放、不滑动;
  • 披露面板直接改变高度;
  • 指示器、滑块与高亮直接跳到新位置;
  • 图标与循环效果不再播放。

不需要任何配置,实时跟随系统设置,也尊重应用级的<MotionConfig reducedMotion="always">。要在应用层决定,可以设置AnimateUIProvider 的 reducedMotion:'never' 保留完整动效,'always'在所有地方减少。

App.tsx
<AnimateUIProvider reducedMotion="never">{children}</AnimateUIProvider>

键盘

键盘用户移动得很快,所以由键盘驱动的操作不会等待动画:方向键高亮的项可以立即被选中,高亮自己滑过去;用方向键选中的 radio 或从键盘选中的标签页同样不等待。焦点由原库管理,与没有 Animate UI 时一致;菜单关闭后立即把焦点还给触发器,而不是等退场动画结束。

指针与触摸

悬停效果只在支持精确指针的设备上运行((hover: hover) and (pointer: fine)),所以触屏点按不会留下卡住的悬停状态。拖拽(抽屉、滑块、Toast)跟随手指,不增加额外延迟。

屏幕阅读器

关闭时仍保留在 DOM 中的内容(forceMount、keepMounted)会在退场播放完后被设为inert 或隐藏,因此不会被键盘到达,也不会被朗读。

时间

动画使用弹簧与短补间、强 ease-out,大部分位移在一开始就完成,界面立即响应;退场比入场更快。如果产品需要另一种节奏,AnimateUIProvider可以在一处改变所有时长:

App.tsx
<AnimateUIProvider tempo={0.8}>{children}</AnimateUIProvider>

上线前检查

  • 在系统开启“减少动效”后完整走一遍主要流程;
  • 只用键盘完成打开、选择、关闭;
  • 确认关闭后的浮层不会被 Tab 到达;
  • 在触屏设备上检查没有残留的悬停状态;
  • 用 animate-ui audit 找出没有减少动效路径的文件。

对应官方文档 2026-10-18 版本。