
前端动画优化别再让你的动画卡顿了各位前端同行咱们今天聊聊前端动画优化。别告诉我你还在使用 JavaScript 做动画那感觉就像在跑步机上跑步却被人拽着腿——根本跑不快。为什么你需要优化动画最近看到一个项目使用 JavaScript 做动画结果页面卡顿得跟幻灯片似的我差点当场去世。我就想问你是在做动画还是在做幻灯片动画是提升用户体验的重要手段卡顿的动画会严重影响用户体验。反面教材// 反面教材使用 JavaScript 做动画 function animate() { const element document.getElementById(box); let position 0; const interval setInterval(() { if (position 100) { clearInterval(interval); } else { position; element.style.left position px; // 触发重排 element.style.top position px; // 触发重排 } }, 16); }毒舌点评这代码我看了都替你的用户着急。使用 JavaScript 做动画每次都修改 left 和 top 属性触发重排你是想让用户的手机变成暖手宝吗前端动画优化的正确姿势1. 使用 CSS 动画CSS 动画由浏览器的合成线程处理比 JavaScript 动画更流畅。/* 正确姿势使用 CSS 动画 */ .box { position: relative; width: 100px; height: 100px; background: red; animation: move 1s ease-in-out forwards; will-change: transform; /* 告诉浏览器提前准备 */ } keyframes move { from { transform: translateX(0); } to { transform: translateX(100px); } }毒舌点评早这么做你的动画早流畅了。CSS 动画由浏览器的合成线程处理不阻塞主线程这多好啊2. 使用 transform 和 opacitytransform 和 opacity 属性不会触发重排是做动画的最佳选择。/* 正确姿势使用 transform 和 opacity */ .box { transition: transform 0.3s ease, opacity 0.3s ease; will-change: transform, opacity; } .box:hover { transform: translateX(100px) scale(1.1); opacity: 0.5; }毒舌点评早这么做你的动画早流畅了。transform 和 opacity 不会触发重排性能更好这多好啊3. 使用 requestAnimationFrame如果必须使用 JavaScript 做动画使用 requestAnimationFrame 而不是 setInterval。// 正确姿势使用 requestAnimationFrame function animate() { const element document.getElementById(box); let position 0; function update() { position; element.style.transform translateX(${position}px); if (position 100) { requestAnimationFrame(update); } } requestAnimationFrame(update); }毒舌点评早这么做你的动画早流畅了。requestAnimationFrame 与浏览器渲染同步避免掉帧这多好啊4. 使用 CSS transitions对于简单的交互动画使用 CSS transitions 比 CSS animations 更简单。/* 正确姿势使用 CSS transitions */ .button { background: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; transition: all 0.3s ease; will-change: transform, box-shadow; } .button:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } .button:active { transform: translateY(0); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); }毒舌点评早这么做你的按钮早有反馈了。CSS transitions 简单易用效果好这多好啊5. 使用硬件加速使用 transform: translateZ(0) 或 transform: translate3d(0, 0, 0) 触发硬件加速。/* 正确姿势使用硬件加速 */ .box { transform: translateZ(0); /* 触发硬件加速 */ will-change: transform; }毒舌点评早这么做你的动画早流畅了。硬件加速利用 GPU 处理动画性能更好这多好啊实战技巧前端动画优化指南使用 CSS 动画由浏览器的合成线程处理比 JavaScript 动画更流畅使用 transform 和 opacity这些属性不会触发重排性能更好使用 requestAnimationFrame与浏览器渲染同步避免掉帧避免使用 left/top这些属性会触发重排影响性能使用 will-change告诉浏览器提前准备提高动画性能使用硬件加速使用 transform: translateZ(0) 触发硬件加速简化动画复杂的动画会影响性能尽量简化避免在动画期间进行布局操作会导致卡顿使用 CSS variables方便控制动画参数测试动画性能使用浏览器开发工具监控动画性能前端动画优化不是可选的是必须的。别再让你的动画卡顿了——优化一下你的动画会更流畅用户体验会更好。