作者:全栈老李
更新时间:2025 年 5 月
适合人群:前端初学者、进阶开发者
版权:本文由全栈老李原创,转载请注明出处。
今天咱们聊聊前端动画那点事儿。不知道你们有没有遇到过这种场景:产品经理拍着桌子说"这个弹窗要优雅地淡入淡出",UI设计师拿着Figma指着某个按钮说"这里要有个灵动的弹性效果"。这时候如果你只会用CSS的transition和animation,可能就要被怼"太生硬了,不够丝滑"。(全栈老李就见过不少这样的翻车现场)
先别急着掏@keyframes
,CSS动画确实方便,但遇到以下情况就力不从心了:
这时候就得请出我们的JavaScript动画三件套:requestAnimationFrame
+ 时间戳 + 缓动算法。
这货是浏览器专门为动画准备的API,比setTimeout
不知道高到哪里去了。它的特点:
// 全栈老李的RAF基础用法示例
function animate(timestamp) {
// 在这里更新动画状态
console.log(`当前帧时间戳:${
timestamp}ms`);
if (!animationComplete) {
requestAnimationFrame(animate);
}
}
// 启动动画
requestAnimationFrame(animate);
一个完整的动画函数需要处理这几个关键点:
来看个实战例子:
/**
* 执行动画函数
* @param {
number} duration 动画持续时间(ms)
* @param {
function} easing 缓动函数
* @param {
function} update 属性更新函数
* 全栈老李的动画核心实现
*/
function animate({
duration, easing, update }) {
const startTime = performance.now(); // 记录开始时间
function run(time) {
// 计算进度(0-1)
let progress = <