requestAnimationFrame(rAF)是专为JavaScript动画设计的API,它在下一次屏幕重绘前执行回调,比setInterval更精准节能;需递归调用自身实现持续动画,并推荐基于时间戳计算位移以保障匀速。

JavaScript 动画的核心是让元素在短时间内连续、平滑地更新样式,requestAnimationFrame(简称 rAF)就是为这个目的专门设计的 API —— 它让浏览器决定何时执行动画帧,比 setTimeout 或 setInterval 更精准、更节能、更契合屏幕刷新节奏。
浏览器通常以约 60fps(每秒 60 帧)刷新画面,即每 ~16.7ms 渲染一帧。rAF 会自动把回调函数安排在**下一次屏幕重绘之前**执行,保证动画与刷新率同步;而 setInterval(fn, 16) 只是“尽力每 16ms 调用一次”,实际可能跳帧、卡顿,还可能在页面不可见时继续运行,浪费资源。
rAF 接收一个回调函数,返回一个 ID(类似 setTimeout),可用于取消动画:
requestAnimationFrame(callback) 启动动画帧cancelAnimationFrame(id) 中止动画示例:让一个 div 水平移动 200px
立即学习“Java免费学习笔记(深入)”;
const box = document.getElementById('box');
let pos = 0;
let animationId;
<p>function animate() {
pos += 2;
if (pos >= 200) {
box.style.left = '200px';
return; // 动画结束,不继续调用
}
box.style.left = pos + 'px';
animationId = requestAnimationFrame(animate); // 下一帧继续
}</p><p>animationId = requestAnimationFrame(animate);</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/xiazai/js/8047">
<img src="https://img.php.cn/upload/jscode/000/000/010/170917380392835.jpg" alt="HTML5纸片折成礼盒动画特效">
</a>
<div class="aritcle_card_info">
<a href="/xiazai/js/8047">HTML5纸片折成礼盒动画特效</a>
<p>HTML5纸片折成礼盒动画特效是一款适合圣诞节或任何节日使用的css实现的圣诞节礼物动画效果。</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="HTML5纸片折成礼盒动画特效">
<span>17</span>
</div>
</div>
<a href="/xiazai/js/8047" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="HTML5纸片折成礼盒动画特效">
</a>
</div>
<p>// 暂停/取消示例:
// cancelAnimationFrame(animationId);
上面例子是“每帧固定位移”,但不同设备帧率可能波动(比如低端机掉到 30fps),导致速度不一致。更健壮的做法是基于**时间差**计算位移:
示例(匀速移动 200px,耗时 2 秒):
const box = document.getElementById('box');
const duration = 2000; // 总时长 ms
const targetX = 200;
let startTime = null;
<p>function animate(timestamp) {
if (!startTime) startTime = timestamp;
const elapsed = timestamp - startTime;
const progress = Math.min(elapsed / duration, 1); // 0~1
const currentX = progress * targetX;</p><p>box.style.transform = <code>translateX(${currentX}px)</code>;</p><p>if (progress < 1) {
requestAnimationFrame(animate);
}
}</p><p>requestAnimationFrame(animate);
transform 和 opacity 动画属性,它们能触发 GPU 加速,性能远好于修改 left/top 或 width/height
offsetTop、getBoundingClientRect),会触发强制同步布局(layout thrashing)element.animate(),但 rAF 仍是底层控制、物理模拟(如缓动、拖拽、粒子)的首选基本上就这些。掌握 rAF 的递归调用逻辑和时间驱动思维,就能写出流畅、兼容、可维护的 JS 动画。
以上就是javascript动画如何实现_如何使用requestAnimationFrame?的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号