@media (prefers-reduced-motion) 可检测用户“减少动画”偏好,返回布尔信号;需用 animation-duration: 0.01ms、transition-duration: 0.01ms 等重置所有动效属性,并加 !important 保证覆盖。
如何用
检测用户动画偏好
现代操作系统(macOS、Windows、iOS、Android)都提供“减少动画”开关,开启后会向网页传达信号。CSS 通过
查询就能捕获这个设置,无需 JavaScript 干预。
注意:该媒体查询返回的是布尔值,只判断是否“启用减少动画”,不区分“关闭/自动/强制”等中间状态——浏览器只暴露一个二元信号。
在 macOS 中对应「系统设置 → 辅助功能 → 显示 → 减少运动」
Windows 是「设置 → 辅助功能 → 视觉效果 → 简化动画」
iOS/iPadOS 是「设置 → 辅助功能 → 动作 → 减少动态效果」
部分 Linux 桌面环境(如 GNOME)也支持,但需启用
等配置
怎么写才真正禁用掉 CSS 动画和过渡
光写
不够,关键是要覆盖掉原有动画逻辑。常见错误是只设
,却漏掉
或
的副作用。
推荐做法是统一重置所有可能触发视觉变化的属性:
立即学习
“
前端免费学习笔记(深入)
”;
用
而非
:某些浏览器(如旧版 Safari)对
的动画仍会触发渲染流水线,
更稳妥
必须加
:否则容易被组件库或内联样式覆盖
避免只针对特定类名:用通配符
或
+
更可靠
JavaScript 里怎么同步响应这个偏好
CSS 媒体查询本身不触发 JS 事件,但可以监听
的变化。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
直接读取当前状态:
不要用
:语法错误,正确值只有
(规范定义)
监听变化要主动调用
,Safari 14+ 才支持,旧版需用
服务端无法直接获取该值:它纯客户端,不能通过 User-Agent 或 HTTP Header 可靠判断
哪些动画最容易被忽略但必须处理
很多团队只关注
、
这类显性动效,却漏掉隐式触发的视觉反馈:
的 outline 动画(比如
渐变)
第三方 UI 库的 tooltip、dropdown 展开(如 Bootstrap 的
类、Ant Design 的
过渡)
滚动锚点平滑滚动:
必须在媒体查询中设为
背景渐变切换、
微调、甚至
的扩散动画
最省事的方式是在根元素上加一个 data 属性,再用 CSS 层叠控制:
然后写
——比全局重置更可控,也方便做灰度发布。
真正难的不是写几行 CSS,而是把动效从设计系统里“解耦”出来:每个可动画的组件都要预留
分支,而不是等上线后被 a11y 审计打回来再补。
@media (prefers-reduced-motion)@media (prefers-reduced-motion)gtk-enable-animations=0@media (prefers-reduced-motion)animation: nonetransitiontransform@media (prefers-reduced-motion) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}0.01ms0s0s0.01ms!important*:rootinheritwindow.matchMediaconst motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
if (motionQuery.matches) {
// 用户启用了减少动画
}'(prefers-reduced-motion: true)'reducemotionQuery.addEventListener('change', handler)addListenerfadeslide:focus-visibleoutline-offsetfadezoomscroll-behavior: smoothautoopacitybox-shadowdocument.documentElement.dataset.motion = motionQuery.matches ? 'reduced' : 'normal';[data-motion="reduced"] .tooltip { transition: none; }reduced-motion