调研探索
当动画受浏览器支持、平台能力或技术需求限制时…
适用于 Web、邮件、移动端等环境中,动画因兼容性、性能、框架或体积限制无法按原方案落地时。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
当动画受浏览器支持、平台能力或技术需求限通用
解决思路
- 运行时计算过于昂贵时,预计算动画;优先用 CSS keyframes(pose-to-pose)而不是 JS 逐帧(straight ahead)。
- 复杂形状导致渲染问题时,简化几何形状;优先用 CSS shapes 而不是 SVG paths;降低 3D 的 polygon counts。
- 跨设备计时不一致时,使用相对单位;在最慢的目标设备上测试;JS 动画考虑使用 requestAnimationFrame。
- 预算只允许必要动画时,优先保留主要动作;受限时首先删减次要动画。
- 屏幕空间有限时,原地动画;使用不影响布局的 transforms;在受限平台上考虑将 reduce-motion 作为默认。
- 优先使用 CSS 而不是 JavaScript,以获得更好的浏览器优化。
- 做渐进增强,确保核心功能在没有动画时也能工作。
- 做特性检测,在动画前检查能力。
- 准备回退状态,为不支持浏览器提供静态替代。
- 懒加载动画库,不要阻塞初始渲染。
- 列出目标浏览器/设备。
- 用 caniuse.com 检查特性支持。
- 在最旧的受支持浏览器上测试。
- 测量动画对 bundle size 的影响。
- 验证回退体验是否可接受。
- 在动画禁用时测试。
- 检查框架动画能力。
- 考虑服务端渲染替代方案(GIF、video)。
- 特性检测代码:const supportsAnimation = 'animate' in Element.prototype && CSS.supports('transform', 'translateZ(0)'); if (supportsAnimation) { element.animate(keyframes, options); } else { element.classList.add('final-state'); }
- 渐进增强代码:@supports (animation: name) { .element { animation: fadeIn 200ms ease-out; } }
- Email:使用 GIF 或静态图片。
- iOS Safari:测试 -webkit- 前缀。
- Older Android:降低动画复杂度。
- Low-end devices:使用 prefers-reduced-motion 作为代理。
适用边界 · 注意事项
- 当目标平台能力足够、性能/体积无约束且动画是核心体验时,不要过早采用静态/GIF/降级方案。
- 当问题根源是设计或需求本身,而不是浏览器/平台/技术限制时,不要用兼容降级掩盖。