0

0

javascript动画如何创建_requestAnimationFrame为何更好?

幻影之瞳

幻影之瞳

发布时间:2026-01-07 20:11:05

|

698人浏览过

|

来源于php中文网

原创

requestAnimationFrame 更适合动画因其自动对齐浏览器刷新节奏、具备页面不可见时自动暂停的节流能力,且提供高精度时间戳用于精准帧控。

javascript动画如何创建_requestanimationframe为何更好?

requestAnimationFrame 为什么比 setTimeout 更适合做动画

因为 requestAnimationFrame 会自动对齐浏览器的刷新节奏(通常是每秒 60 帧),而 setTimeout 是基于系统时钟计时,容易出现掉帧、卡顿或“撕裂”。它还具备自动节流能力——页面不可见时(比如切到其他 tab),requestAnimationFrame 会被浏览器暂停,省电又省资源。

常见错误现象:setTimeout(..., 16) 看似想模拟 60fps,但实际执行时机不可控,连续多次调用后误差累积,动画越来越拖慢;更糟的是,用户滚动页面或触发重排时,setTimeout 仍强行执行,造成大量无意义计算。

  • 不要手动算 16ms:浏览器刷新率不总是 60Hz(比如高刷屏是 120Hz,对应约 8.3ms)
  • 不要嵌套多个 setTimeout 模拟循环:这会绕过浏览器的帧调度机制
  • requestAnimationFrame 回调接收一个时间戳参数(DOMHighResTimeStamp),应优先用它计算 delta,而不是依赖 Date.now()

如何正确写一个 requestAnimationFrame 动画循环

核心是“递归调用 + 时间差控制”,不是简单地在回调里再调一次 requestAnimationFrame 就完事。你需要记录上一帧时间,根据当前帧时间差决定是否更新状态,否则动画速度会随帧率浮动(比如在低性能设备上变慢)。

let lastTime = 0;
function animate(currentTime) {
  if (!lastTime) lastTime = currentTime;
  const deltaTime = currentTime - lastTime;
  lastTime = currentTime;
<p>// 例如:让元素每秒移动 100px
const speed = 100; // px/s
element.style.transform = <code>translateX(${(speed * deltaTime / 1000).toFixed(2)}px)</code>; </p><p>requestAnimationFrame(animate);
}
requestAnimationFrame(animate);

注意点:

立即学习Java免费学习笔记(深入)”;

  • 必须用传入的 currentTime(不是 Date.now()),它是高精度单调递增时间戳
  • 避免在回调中做重排(如读取 offsetTop)或重绘(如频繁改 style),否则触发同步布局,严重拖慢帧率
  • 如果动画需暂停/恢复,保存 requestId 并用 cancelAnimationFrame 控制

requestAnimationFrame 和 CSS 动画该选哪个

优先用 CSS 动画(transition@keyframes),因为它们由浏览器渲染线程直接驱动,不经过 JS 主线程,性能更高、更省电。JS 的 requestAnimationFrame 只应在需要动态计算(比如跟随鼠标、物理模拟、滚动联动)时使用。

使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件

如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Andr​​oid友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Andr​​oid应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更

下载

典型误用场景:

  • 只做简单位移/缩放/透明度变化,却用 JS + requestAnimationFrame 手动更新 style → 应改用 transition
  • requestAnimationFrame 中反复读写同一元素的 offsetLeftstyle.left → 强制同步布局,直接干掉 60fps
  • requestAnimationFrame 驱动 SVG transform 却没开启 will-change 或 contain → 浏览器无法启用 GPU 加速

兼容性与降级处理要不要做

现代浏览器(Chrome 24+、Firefox 23+、Safari 6.1+、Edge 10+)都支持 requestAnimationFrame,IE10+ 有带前缀的 msRequestAnimationFrame,但 IE 已退出主流支持。除非明确要兼容 IE9 及更早版本,否则无需降级到 setTimeout

如果真要兼容,可用这个轻量 fallback:

const raf = window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            window.msRequestAnimationFrame ||
            function(callback) {
              return setTimeout(callback, 1000 / 60);
            };

但要注意:这个 fallback 在低帧率设备或后台 tab 中不会自动降频,可能持续消耗 CPU。真正关键的动画逻辑(比如游戏、可视化)建议直接放弃 IE9–。

最常被忽略的一点:很多人以为只要用了 requestAnimationFrame 就一定丝滑,其实它只是“调度器”,动画是否流畅,最终取决于每一帧内做的操作是否轻量——比如 layout thrashing、强制同步重排、未优化的 canvas 绘制,都会让 requestAnimationFrame 失效。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1057

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

838

2023.11.06

edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

1729

2023.08.21

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

397

2024.03.05

如何解决Edge打开但没有标题的问题
如何解决Edge打开但没有标题的问题

若 Microsoft Edge 浏览器打开后无标题(窗口空白或标题栏缺失),可尝试以下方法解决: 重启 Edge:关闭所有窗口,重新启动浏览器。 重置窗口布局:右击任务栏 Edge 图标 → 选择「最大化」或「还原」。 禁用扩展:进入 edge://extensions 临时关闭插件测试。 重置浏览器设置:前往 edge://settings/reset 恢复默认配置。 更新或重装 Edge:检查最新版本,或通过控制面板修复

1038

2025.04.24

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

530

2023.06.20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号