Web动画指南

CSS 动画

/* 定义关键帧 */ @keyframes slideIn { from { transform: translateY(-20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } /* 应用动画 */ .modal { animation: slideIn 300ms ease-out both; } .badge { animation: pulse 2s ease-in-out infinite; } /* 多个动画 */ .element { animation: slideIn 0.3s ease, pulse 2s 0.3s infinite; }

Web Animations API (WAAPI)

const el = document.querySelector('.box'); const animation = el.animate([ { transform: 'translateX(0)', opacity: 1 }, { transform: 'translateX(400px)', opacity: 0 } ], { duration: 1000, easing: 'ease-in-out', fill: 'forwards', iterations: 1 }); // 控制播放 animation.pause(); animation.play(); animation.reverse(); animation.cancel(); // 完成回调 animation.finished.then(() => console.log('动画完成!')); animation.onfinish = () => el.remove();

时间函数

函数描述感觉
linear匀速机械感
ease慢-快-慢自然(默认)
ease-in慢启动物体离开
ease-out慢结束物体进入
ease-in-out两端慢物体穿越
cubic-bezier()自定义曲线任意感觉

性能最佳实践

/* 只对 GPU 合成属性制作动画 */ /* 好的做法 — 不触发布局/绘制 */ .anim { transform: translateX(100px) scale(1.1); opacity: 0.5; filter: blur(4px); } /* 不好的做法 — 触发布局 */ .bad-anim { top: 100px; /* 布局 */ width: 200px; /* 布局 */ } /* 提示浏览器准备合成层 */ .will-animate { will-change: transform, opacity; } /* 动画结束后移除以释放内存 */ element.addEventListener('animationend', () => { element.style.willChange = 'auto'; });