0

0

如何用javascript实现动画_css动画和requestanimationframe谁更优【教程】

狼影

狼影

发布时间:2026-01-19 19:46:02

|

691人浏览过

|

来源于php中文网

原创

必须用 requestAnimationFrame 的情况是 CSS 无法实现的动画:贝塞尔曲线+随机扰动的粒子运动、拖拽中动态参数的缓动回弹、需逐帧读取布局信息(如 getBoundingClientRect)、与 Web Audio 精确同步的音画帧对齐。

如何用javascript实现动画_css动画和requestanimationframe谁更优【教程】

纯 CSS 动画在绝大多数场景下比 requestAnimationFrame 手写 JS 动画更优——它更省电、更流畅、更易维护,且天然支持硬件加速浏览器优化。只有当动画逻辑依赖运行时数据(比如鼠标位置、滚动偏移、物理模拟)或需精确控制暂停/跳帧/动态插值时,才该用 requestAnimationFrame

什么时候必须用 requestAnimationFrame

不是“想自定义就用”,而是被 CSS 能力卡住时的必要选择:

  • transformopacity 无法表达的运动逻辑,例如:粒子系统中每个点按贝塞尔曲线+随机扰动移动
  • 动画状态需实时响应用户输入,例如:拖拽中跟随鼠标做缓动回弹,且回弹参数随拖拽距离动态变化
  • 需要逐帧读取并修改 DOM 布局(如 getBoundingClientRect()),再基于结果决定下一帧行为——CSS 无法读取布局信息
  • 与 Web Audio API 同步播放音效+视觉反馈,要求帧精度对齐(requestAnimationFrame 时间戳可与 audioContext.currentTime 对齐)

CSS 动画的隐藏性能陷阱

很多人以为加了 will-change: transform 就万事大吉,实际容易踩坑:

  • 滥用 will-change:对非频繁变化的元素设置,反而触发不必要的图层提升和内存开销
  • 动画属性选错:用 left/top 触发重排(layout),而应始终用 transform: translateX()opacity
  • 过度嵌套动画:父容器设 animation,子元素又设独立动画,可能因图层合并失败导致掉帧
  • 未关闭非必要动画:页面不可见时(visibility: hiddendisplay: none)仍运行 CSS 动画,浪费 GPU 资源

验证方式:打开 Chrome DevTools → Rendering → 勾选 “FPS Meter” 和 “Paint Flashing”,观察是否持续高亮、帧率是否稳定在 60fps。

Imagine By Magic Studio
Imagine By Magic Studio

AI图片生成器,用文字制作图片

下载

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

requestAnimationFrame 的正确写法和常见错误

直接调 requestAnimationFrame 不等于写出高性能动画。关键在避免强制同步布局和冗余计算:

function animate(lastTime) {
  const now = performance.now();
  const delta = Math.min(now - lastTime, 16); // 防止丢帧过大
<p>// ✅ 在 rAF 回调里只做「读取」或「写入」,不要混用
const rect = element.getBoundingClientRect(); // 读取布局(仅此处)</p><p>// ✅ 所有样式更新集中到一次重排前完成
element.style.transform = <code>translateX(${easeInOutCubic(delta / DURATION) * 100}px)</code>;</p><p>// ❌ 错误:在读取后又立即读取(触发二次 layout)
// element.offsetWidth; // 不要这样</p><p>if (isAnimating) {
requestAnimationFrame(animate);
}
}
  • 永远用 performance.now() 而非 Date.now(),前者精度更高、不受系统时间调整影响
  • 避免在回调中调用 getComputedStyleoffsetHeight 等触发重排的 API,除非你明确需要当前布局快照
  • element.animate()(Web Animations API)替代手动 requestAnimationFrame,它底层复用 CSS 动画引擎,支持时间轴控制且更省资源

真正难的不是选哪个 API,而是判断动画是否真的需要脱离 CSS 生命周期——多数所谓“复杂动画”,其实只是没拆解清「驱动源」和「表现层」。一旦把数据流(如 scrollY、mouseX)抽出来作为输入,渲染层依然可以交给 CSS。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

1058

2023.08.11

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

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

840

2023.11.06

chrome什么意思
chrome什么意思

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

1058

2023.08.11

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

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

840

2023.11.06

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

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

530

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

6228

2023.08.17

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.2万人学习

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

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