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/code/9814">
<img src="https://img.php.cn/upload/webcode/000/000/011/176001660518224.jpg" alt="云模块网站管理系统3.1.03">
</a>
<div class="aritcle_card_info">
<a href="/xiazai/code/9814">云模块网站管理系统3.1.03</a>
<p>云模块_YunMOK网站管理系统采用PHP+MYSQL为编程语言,搭载自主研发的模块化引擎驱动技术,实现可视化拖拽无技术创建并管理网站!如你所想,无限可能,支持创建任何网站:企业、商城、O2O、门户、论坛、人才等一块儿搞定!永久免费授权,包括商业用途; 默认内置三套免费模板。PC网站+手机网站+适配微信+文章管理+产品管理+SEO优化+组件扩展+NEW Login界面.....目测已经遥遥领先..</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="云模块网站管理系统3.1.03">
<span>0</span>
</div>
</div>
<a href="/xiazai/code/9814" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="云模块网站管理系统3.1.03">
</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号