减弱动效

组件如何跟随系统的减弱动效设置,以及如何按需强制播放或静止。

#默认行为

当用户在系统中开启「减弱动态效果」(prefers-reduced-motion: reduce)时,组件会自动降级,无需额外配置:

  • 入场类动画直接呈现最终状态,不再位移或淡入。
  • WebGL 背景只绘制一帧静止画面,不再持续渲染。
  • 循环的 CSS 动画停止播放。

#usePrefersReducedMotion

在自己的组件里读取同一份偏好,让整站行为保持一致。它也会读取外层 ReducedMotionProvider 的设置。

HeroVideo.tsx
import { usePrefersReducedMotion } from '@elyri/motion';

export function HeroVideo() {
  const reduced = usePrefersReducedMotion();
  return reduced ? <img src="/hero.jpg" alt="" /> : <video src="/hero.mp4" autoPlay muted loop />;
}

#ReducedMotionProvider

不改系统设置,强制某棵子树静止(reduced)或播放(reduced={false}),优先级高于系统偏好。适合缩略图墙、站内「关闭动画」开关等场景。

Thumbnail.tsx
import { Aurora, ReducedMotionProvider } from '@elyri/motion';

export function Thumbnail({ playing }: { playing: boolean }) {
  // 未悬停时强制静止,悬停后播放
  return (
    <ReducedMotionProvider reduced={!playing}>
      <Aurora />
    </ReducedMotionProvider>
  );
}
强制 reduced={false} 会无视用户的系统设置,请只在用户主动选择时使用。

#性能

  • WebGL 背景离开视口或页面切到后台时暂停渲染,回来后继续。
  • 渲染分辨率默认不超过 2 倍设备像素比,高分屏上也不会过度消耗 GPU。
  • 服务端渲染时偏好按「不减弱」输出,水合后切换为真实值,不会产生水合不一致。