用途:在添加或审查网页动画时,尊重系统的 prefers-reduced-motion: reduce 设置,把动画做优雅降级,而不是一刀切关闭。适用于用户反馈晕动症、WCAG 审查,或把 GSAP、Framer Motion、Lenis、Anime.js、CSS keyframes 等动画库接入无障碍产品时。
核心原则是分层而非全删:一级(视差、大面积位移、大元素缩放、3D 旋转、自动轮播与跑马灯、平滑滚动劫持、滚动钉住场景、运动路径)直接移除;二级(小位移、弹入)改为 ≤200ms 的短淡入淡出;三级(透明度、颜色、焦点环过渡、加载指示器、表意必需的动画)保留。
用法:CSS 层先写默认动画,再用 @media (prefers-reduced-motion: reduce) 覆盖,全局兜底用 animation-duration: 0.01ms、animation-iteration-count: 1、transition-duration: 0.01ms、scroll-behavior: auto,再叠加针对性覆盖以保住三级动画;也可用 prefers-reduced-motion: no-preference 正向开启复杂效果。JS 层用 matchMedia 读取同一信号并监听 change 事件,GSAP 用 gsap.matchMedia(),Lenis 在减少动态时不实例化,React 可用 useReducedMotion 钩子,SSR 初始值设为 false 并在 useEffect 中同步。
验证:交付单个可直接打开的 HTML 文件,含 ?t=N 冻结帧与 ?reduce=1 强制降级路径的 seek 工具,用 npx playwright screenshot 分别截取正常与 reduced 两种状态确认分层正确。
限制与注意:animation-duration 用 0.01ms 而非 0s,否则依赖 animationend/transitionend 的代码会失效;全局 * 重置会误删三级动画;需补 animation-iteration-count: 1 停止无限旋转;媒体查询管不到 JS/canvas/WebGL;系统设置切换不会刷新页面,需监听 change;自动播放超过 5 秒的动画即使未开启减少动态也须提供暂停控件(WCAG 2.2.2)。对应 WCAG 2.3.3(AAA)与 C39 技术。