0

0

HTML5的requestAnimationFrame顺滑吗_HTML动画卡顿吗【评说】

看不見的法師

看不見的法師

发布时间:2026-01-19 19:57:09

|

877人浏览过

|

来源于php中文网

原创

requestAnimationFrame 本身不卡顿,卡顿源于回调中执行大量DOM查询、强制同步布局、未节流事件、频繁变更动画目标等错误用法;它与VSync对齐、后台暂停、提供高精度时间戳,但无法避免重排重绘;应优先用CSS动画,仅在需精确帧控(如物理模拟)时使用,并依赖time参数而非固定帧率假设。

html5的requestanimationframe顺滑吗_html动画卡顿吗【评说】

requestAnimationFrame 本身不卡顿,但用法不对就卡

requestAnimationFrame浏览器原生提供的、与屏幕刷新率同步的回调机制,理论帧率可达 60fps(16.67ms/帧)。它本身没有性能开销,也不“导致”卡顿——卡顿永远来自你塞进去的逻辑。常见错误包括:

  • 在回调里执行大量 DOM 查询(如反复调用 document.getElementById
  • 触发强制同步布局(例如读取 offsetTop 后立刻改 style.left
  • 未节流的事件监听器(如 scroll 中不断调用 requestAnimationFrame 却不防抖)
  • 动画目标频繁变更却未取消上一帧(导致多帧并发更新同一元素)

比 setTimeout 顺滑,但不是万能解药

setTimeout(fn, 16) 相比,requestAnimationFrame 的优势在于:

  • 浏览器可将其调度与垂直同步(VSync)对齐,避免丢帧
  • 页面非激活时自动暂停(标签页切走后不耗资源)
  • 支持更精准的时间戳(raf(time) 中的 time 是高精度单调递增时间)

但它不会帮你优化重排重绘。如果你动画依赖 transformopacity,那大概率顺滑;如果靠修改 top/left + position: relative,再用 requestAnimationFrame 也救不回来。

真实卡顿场景:布局抖动 + 频繁 GC

最典型的卡顿组合是:

无涯·问知
无涯·问知

无涯·问知,是一款基于星环大模型底座,结合个人知识库、企业知识库、法律法规、财经等多种知识源的企业级垂直领域问答产品

下载
  • 每帧读取 element.getBoundingClientRect()(触发重排)
  • 紧接着设置 element.style.transform = ...(触发重绘)
  • 又在下一帧重复——形成“读-写-读-写”循环,强制浏览器每帧都做布局计算
  • 再加上每次创建新对象(如 { x: ..., y: ... })未复用,引发频繁垃圾回收(GC)

这种情况下,即使用了 requestAnimationFrame,Performance 面板也会显示大量黄色的 “Layout” 和 “Recalculate Style” 块。
let lastX = 0;
const el = document.querySelector('.box');
function animate() {
  // ✅ 安全:只读一次 layout,且缓存
  const rect = el.getBoundingClientRect();
  const x = rect.left + 2;

  // ✅ 安全:仅用 transform,触发合成层
  el.style.transform = `translateX(${x}px)`;

  // ❌ 危险:如果这里加一句 console.log(el.offsetTop),就会强制同步布局
  lastX = x;
  requestAnimationFrame(animate);
}
requestAnimationFrame(animate);

要不要用 requestAnimationFrame?看你的动画是否需要精确帧控

简单淡入、位移动画,CSS @keyframes + will-change: transform 更轻量;
需要响应鼠标轨迹、物理模拟、或与音频/传感器时间轴对齐时,requestAnimationFrame 才不可替代。

容易被忽略的一点是:它不保证“每帧都执行”,比如设备性能不足、页面后台运行、或显示器刷新率动态切换(如 MacBook Pro 的 ProMotion),time 参数才是你做插值的唯一可信依据,别硬写 if (frameCount++ % 3 === 0) 这类假设固定帧率的逻辑。

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

相关专题

更多
html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

506

2023.10.23

HTML与HTML5的区别
HTML与HTML5的区别

HTML与HTML5的区别:1、html5支持矢量图形,html本身不支持;2、html5中可临时存储数据,html不行;3、html5新增了许多控件;4、html本身不支持音频和视频,html5支持;5、html无法处理不准确的语法,html5能够处理等等。想了解更多HTML与HTML5的相关内容,可以阅读本专题下面的文章。

427

2024.03.06

html5从入门到精通汇总
html5从入门到精通汇总

想系统掌握HTML5开发?本合集精选全网优质学习资源,涵盖免费教程、实战项目、视频课程与权威电子书,从基础语法到高级特性(Canvas、本地存储、响应式布局等)一应俱全,适合零基础小白到进阶开发者,助你高效入门并精通HTML5前端开发。

21

2025.12.30

html5新老标签汇总
html5新老标签汇总

HTML5在2026年持续优化网页语义化与交互体验,不仅引入了如<header>、<nav>、<article>、<section>、<aside>、<footer>等结构化标签,还新增了<video>、<audio>、<canvas>、<figure>、<time>、<mark>等增强多媒体与

18

2025.12.30

html5空格代码怎么写
html5空格代码怎么写

在HTML5中,空格不能直接通过键盘空格键实现,需使用特定代码。本合集详解常用空格写法:&nbsp;(不间断空格)、&ensp;(半个中文空格)、&emsp;(一个中文空格)及CSS的white-space属性等方法,帮助开发者精准控制页面排版,避免因空格失效导致布局错乱,适用于新手入门与实战参考。

73

2025.12.30

html5怎么做网站教程
html5怎么做网站教程

想从零开始学做网站?这份《HTML5怎么做网站教程》合集专为新手打造!涵盖HTML5基础语法、页面结构搭建、表单与多媒体嵌入、响应式布局及与CSS3/JavaScript协同开发等核心内容。无需编程基础,手把手教你用纯HTML5创建美观、兼容、移动端友好的现代网页。附实战案例+代码模板,快速上手,轻松迈出Web开发第一步!

153

2025.12.31

HTML5建模教程
HTML5建模教程

想快速掌握HTML5模板搭建?本合集汇集实用HTML5建模教程,从零基础入门到实战开发全覆盖!内容涵盖响应式布局、语义化标签、Canvas绘图、表单验证及移动端适配等核心技能,提供可直接复用的模板结构与代码示例。无需复杂配置,助你高效构建现代网页,轻松上手前端开发!

25

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

35

2025.12.31

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

0

2026.01.19

热门下载

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

精品课程

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

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 20.8万人学习

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

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