首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么window.requestAnimationFrame只运行一次步骤函数?

window.requestAnimationFrame是浏览器提供的一个API,用于优化动画效果的渲染。它接受一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。

window.requestAnimationFrame的工作原理是,浏览器每次重绘页面时会触发一个重绘事件,通常是每秒60次(60帧)左右。当调用window.requestAnimationFrame时,浏览器会在下一次重绘之前执行传入的回调函数,确保动画的更新和渲染发生在浏览器的重绘间隔内,以获得更流畅的动画效果。

由于window.requestAnimationFrame的设计初衷是用于动画效果的优化,因此它只会执行一次步骤函数。每次调用window.requestAnimationFrame时,只会注册一个回调函数,而不是多个。这样可以避免在每次重绘时执行多个回调函数,提高性能和效率。

总结起来,window.requestAnimationFrame只运行一次步骤函数是为了保证动画效果的流畅性和性能优化。

推荐的腾讯云相关产品:无

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么不要在 Linux 上运行开源软件?

这个特定的软件包含一个负载均衡的集群,一个运行数据库的集群,另外一个是 IP 服务器的集群。所有的都运行在 RHEL 或者 CentOS Linux 发行版当中。 跟钱走!...满足需求 在某些领域,在开源的 Linux 发行版上运行有专利的软件并不意外,这是很常见的。 “华尔街 99% 的应用都运行在有专利的产品上。...一些使用 Linux 的市场需要更多特定的软件,现有的开源软件并不能满足他们,这就是为什么软件开发者们为企业 Linux 应用提供了商业的解决方案。他补充道。...“这很平常,开源软件很适合大的市场,这就是为什么他有广泛而且通用的需求,不是很多人需要绝对的微秒级的时间,而且如果没有市场就会发出信号。”他指出。...Linux 纯粹主义是没有意义的 在 Linux 上运行完全免费开源的软件的观念是欠缺的,有时候你要运行专属软件。对于任何特定的行业都是这样。

1.6K10
  • Thinking--FastDom消除浏览器布局抖动

    显然,16ms 渲染一次是确保浏览器不卡顿的重点。如果没在 16ms 内进行一次渲染,则意味着该帧丢失了(掉帧)。 浏览器完成一次渲染,需要完成如下步骤: 处理 HTML 标记并构建 DOM 树。...详细了解该部分,可查看 前端优化–关键渲染路径 为什么会丢帧? javascript 为单线程,如果存在大量的 js 计算,会导致阻塞,绘制时间被延后,出现丢帧。 如何引起重绘?...() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。...该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。...队列在下一帧使用 window.requestAnimationFrame() 执行。

    56620

    JS深入浅出 - requestAnimationFrame

    window.requestAnimationFrame(callback) callback:下一次重绘之前更新动画帧所调用的函数。...2.2 内部执行机制 首先判断 document.hidden 属性是否可见(true),可见状态下才能继续执行以下步骤。 浏览器清空回调队列中的动画函数。...() 的回调函数触发时间是在浏览器下一次重绘之前,而浏览器大约每秒重绘60次,因此动画帧会在大约每16.6ms后执行一次。...cancelAnimationFrame() 取消对应请求 ID 的重绘任务,内部实现是将请求 ID 标记的回调函数的 cancelled 标识符置为 true,以此让浏览器忽略并跳过该回调函数的执行...特点 3.1 定时动画存在的问题 setTimeout / setInterval 不能保证回调的运行时刻:计时器只能保证何时将回调添加至浏览器的回调队列(宏任务),不能保证回调队列的运行时间,假设主线程被其他任务占用

    1.6K30

    JS:指定FPS帧频,requestAnimationFrame播放动画

    实际运行时,不需要我们关心定时器的问题,flash player会定时触发EnterFrame消息,推动Movieclip播放。 在js这一侧,需要我们设定一个定时器,并推动相应的绘制逻辑执行。...成熟做法: 引入requestAnimationFrame,这个方法是用来在页面重绘之前,通知浏览器调用一个指定的函数,以满足开发者操作动画的需求。 这个函数类似setTimeout,调用一次。...例如fps=10,每帧100ms,而现在每16ms(60fps)执行一次draw。16*7=112>100,需要7次才实际绘制一次。...Code for Drawing the Frame ...   } } tick(); 针对低版本浏览器再优化: 如果浏览器没有requestAnimationFrame函数,实际底层还只能用setTimeout...例如fps=10,每帧100ms,而现在每16ms(60fps)执行一次draw。16*7=112>100,需要7次才实际绘制一次

    3.7K20

    2020已经过去五分之四了,你确定还不来了解一下JS的rAF?

    该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行 浏览器兼容性 ?...相比于setTimeout的在固定时间后执行对应的动画函数,rAF用于指示浏览器在下一次重新绘制屏幕图像时, 执行其提供的回调函数。...详细用法 requestAnimationFrame语法如下: window.requestAnimationFrame(callback) 「参数;callback」 下一次重绘之前更新动画帧所调用的函数...的优点 为什么不使用settimeout?...setTimeout缺点: 「造成无用的函数运行开销:」 也就是过度绘制,同时因为更新图像的频率和屏幕的刷新重绘制步调不一致,会产生丢帧,在低性能的显示器动画看起来就会卡顿。

    1.1K30

    requestAnimationFrame的使用

    为什么你感觉不到这个变化?...具体一点讲就是,系统每次绘制之前会主动调用 rAF 中的回调函数,如果系统绘制率是 60Hz,那么回调函数就每16.7ms 被执行一次,如果绘制频率是75Hz,那么这个间隔时间就变成了 1000/75=...它能保证回调函数在屏幕每一次的绘制间隔中被执行一次,这样就不会引起丢帧现象,也不会导致动画出现卡顿的问题。...函数节流:在高频率事件(resize,scroll 等)中,为了防止在一个刷新间隔内发生多次函数执行,使用 rAF 可保证每个绘制间隔内,函数只被执行一次,这样既能保证流畅性,也能更好的节省函数执行的开销...一个绘制间隔内函数执行多次时没有意义的,因为显示器每16.7ms 绘制一次,多次绘制并不会在屏幕上体现出来。 优雅降级 由于 rAF 目前还存在兼容性问题,而且不同的浏览器还需要带不同的前缀。

    1K20

    深入理解 RequestAnimationFrame

    为什么你感觉不到这个变化?...以上两种情况都会导致 SetTinterval 的执行步调和屏幕的刷新步调不一致,从而引起 丢帧 现象, 那为什么步调不一致就会引起丢帧呢?...那么回调函数就每16.7ms被执行一次,如果刷新率是75Hz,那么这个时间间隔就变成了1000/75=13.3ms,换句话说就是,RequestAnimationFrame的步伐跟着系统的刷新步伐走,它能保证回调函数在屏幕每一次的刷新间隔中被执行一次...函数节流:在高频率事件( resize, scroll 等)中,为了防止在一个刷新间隔内发生多次函数执行,RequestAnimationFrame可保证每个刷新间隔内,函数只被执行一次,这样既能保证流畅性...,也能更好的节省函数执行的开销,一个刷新间隔内函数执行多次时没有意义的,因为显示器每16.7ms刷新一次,多次绘制并不会在屏幕上体现出来。

    1.4K10

    requestAnimationFrame,终结定时器动画时代!

    那你可知这是为什么呢? 为什么你感觉不到这个变化?...那是因为人的眼睛有视觉停留效应,即前一副画面留在大脑的印象还没消失,紧接着后一副画面就跟上来了,这中间间隔了16.7ms(1000/60≈16.7), 所以会让你误以为屏幕上的图像是静止不动的。...那就得来细数一下轮询了 Event Loop Event Loop的是计算机系统的一种运行机制。JavaScript语言就采用这种机制,来解决单线程运行带来的一些问题。...然后,当执行宏任务时,遇见定时器,那么便给定时器中的内容压入队列中,到下一次的Event Loop执行,接着去执行,微任务 最后,微任务执行完毕,清空执行栈,拿到队列中的下一次Event Loop的内容...该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行 requestAnimationFrame的优势是啥?

    1.4K20

    Pytest系列(30)- 使用 pytest-xdist 分布式插件,如何保证 scope=session 的 fixture 在多进程运行情况下仍然能运行一次

    将常用功能放到 fixture,可以提高复用性和维护性 做接口自动化测试的时候,通常我们会将登录接口放到 fixture 里面,并且 scope 会设置为 session,让他全局运行一次 但是当使用...pytest-xdist 的时候,scope=session 的 fixture 无法保证运行一次,官方也通报了这一问题 官方描述 pytest-xdist 的设计使每个工作进程将执行自己的测试集合并执行所有测试子集...produce_expensive_data() fn.write_text(json.dumps(data)) return data 若某个 scope = session 的 fixture 需要确保运行一次的话...直接套用,然后改需要改的部分即可(这个后面详细讲解) 官方原话:这项技术可能并非在每种情况下都适用,但对于许多情况下,它应该是一个起点,在这种情况下,对于 scope = session 的fixture 执行一次很重要...可以看到 fixture 执行了一次,不同进程下的测试用例共享一个数据 token 重点 读取缓存文件并不是每个测试用例都会读,它是按照进程来读取的 比如 指定三个进程运行,那么有一个进程会执行一次

    1.6K20

    前端: 如何渲染十万条数据

    提高渲染性能的解决方案有如下: 虚拟列表(也叫按需渲染或可视区域渲染) 时间分片 虚拟列表是最主流的解决方案,不渲染所有的数据,渲染可视区域中的数据。...document.createElement('li'); li.innerText = (Math.random() * total) ul.appendChild(li); } console.log('JS运行时间...:',Date.now() - now); setTimeout(()=>{ console.log('总运行时间:',Date.now() - now); },0) 0 2 虚拟列表 渲染可视区域中的数据...pageCount,curIndex + pageCount) },0) } loop(total,index); 此方法可以使用页面加载的时间变快,但是当我们快速滚动页面的时候,会发现页面出现闪屏或白屏的现象 为什么会出现闪屏现象呢...它能保证回调函数在屏幕每一次的刷新间隔中被执行一次,这样就不会引起丢帧现象。

    2.8K22

    【今天你更博学了么】一个神奇的前端动画 API requestAnimationFrame

    window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。...该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。 浏览器的重绘与回流 后续会单独出一篇文章来学习。...//html代码全文通用,所以在此贴出一次 requestAnimationFrame API <button id='begin' class="begin"...但是它执行了一次,怎么做动画呢?别急,再看看 MDN 怎么说。...注意:若你想在浏览器下次重绘之前继续更新下一帧动画,那么回调函数自身必须再次调用window.requestAnimationFrame() 原来在回调函数中要再次调用 requestAnimationFrame

    69520

    网页性能分析

    第七条,在必要的时候,才将元素的display属性为可见,因为不可见的元素不影响重排和重绘。另外,visibility : hidden的元素只对重绘有影响,不影响重排。...第九条,使用 window.requestAnimationFrame()、window.requestIdleCallback() 这两个方法调节重新渲染 五、刷新率 网页动画的每一帧(frame)都是一次重新渲染...可以使用window.requestAnimationFrame(),让读操作和写操作分离,把所有的写操作放到下一次重新渲染: function doubleHeight(element) { var...() ,推迟到下一次重新渲染: $(window).on('scroll', function() { window.requestAnimationFrame(scrollHandler); }...requestIdleCallback(fn); 上面代码中,只有当前帧的运行时间小于16.66ms时,函数fn才会执行。

    1K00

    requestAnimationFrame

    requestAnimationFrame介绍window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。...该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行语法:window.requestAnimationFrame(callback);参数:callback: 下一次重绘之前更新动画帧所调用的函数...是它执行了一次,怎么做动画呢?别急,再看看 MDN 怎么说。...注意:若你想在浏览器下次重绘之前继续更新下一帧动画,那么回调函数自身必须再次调用window.requestAnimationFrame()改下JSwindow.onload = function ()...浏览器优化为了提高性能和电池寿命,因此在大多数浏览器里,当requestAnimationFrame() 运行在后台标签页或者隐藏的 里时,requestAnimationFrame()

    9710
    领券