首页 > 其他分享 >理解requestAnimationFrame和cancelAnimationFrame

理解requestAnimationFrame和cancelAnimationFrame

时间:2023-02-28 21:01:20浏览次数:49  
标签:cancelAnimationFrame 浏览器 函数 requestAnimationFrame window 理解 webkit 回调


window.requestAnimationFrame() 方法告诉浏览器您希望执行动画并请求浏览器在下一次重绘之前调用指定的函数来更新动画。该方法使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。

注意:若您想要在下次重绘时产生另一个动画画面,您的回调例程必须调用 requestAnimationFrame()。

回调函数会被传入一个参数,DOMHighResTimeStamp,指示当前被 requestAnimationFrame() 排序的回调函数被触发的时间。即使每个回调函数的工作量的计算都花了时间,单个帧中的多个回调也都将被传入相同的时间戳。该时间戳是一个十进制数,单位毫秒,最小精度为1ms(1000μs)。

语法:

window.requestAnimationFrame(callback);

参数:callback


一个指定函数的参数,该函数在下次重新绘制动画时调用。这个回调函数只有一个传参,DOMHighResTimeStamp,指示requestAnimationFrame() 开始触发回调函数的当前时间(performance.now() 返回的时间)。

返回值:一个 long 整数,请求 ID ,是回调列表中唯一的标识。是个非零值,没别的意义。你可以传这个值给 window.cancelAnimationFrame() 以取消回调函数。

requestAnimationFrame()的特点:

  • requestAnimationFrame会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率
  • 在隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的CPU、GPU和内存使用量
  • requestAnimationFrame是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了CPU开销(举个例子比如:页面最小化了,或者被Tab切换了。页面是不会重绘的,自然,requestAnimationFrame也不会调用(没通知啊)。页面绘制全部停止,资源高效利用。)

兼容性:

PC端

Feature

Chrome

Firefox (Gecko)

Internet Explorer

Opera

Safari (WebKit)

Basic support

10 ​​webkit​​24 [3]

4.0 ​​moz​​ [1][4]

23 [2]

10.0

(Yes) ​​-o​​15.0

6.0 ​​webkit​​6.1

return value

23

​11.0​​ (11.0)

10.0

15.0

6.1

移动端:

Feature

Android

Android Webview

Firefox Mobile (Gecko)

IE Phone

Opera Mobile

Safari Mobile

Chrome for Android

Basic support

4.3 ​​webkit​​4.4

4.3 ​​webkit​​4.4

11.0 (11.0) ​​moz​​23

10.0

15.0

6.1 ​​webkit​​7.1

18 ​​webkit​​25 [3]

​requestID​

4.4

4.4

11.0 (11.0) ​​moz​

10.0

15.0

6.1 ​​webkit​​7.1

 

window.cancelAnimationFrame

取消一个先前通过调用window.requestAnimationFrame()方法添加到计划中的动画帧请求.

参数:

  • 先前调用window.requestAnimationFrame()方法时返回的ID.

注意:这是一个实验中的功能,此功能某些浏览器尚在开发中,请在不同浏览器中适合使用的前缀。

在 Chrome 中正确取消回调的调用目前是 window.cancelAnimationFrame()。


兼容性不是特别的理想,所以,下面进行了一个封装,解决兼容性问题:

(function() {
var lastTime = 0;
var vendors = ['webkit', 'moz'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || // name has changed in Webkit
window[vendors[x] + 'CancelRequestAnimationFrame'];
}

if (!window.requestAnimationFrame) {
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16.7 - (currTime - lastTime));
var id = window.setTimeout(function() {
callback(currTime + timeToCall);
}, timeToCall);
lastTime = currTime + timeToCall;
return id;
};
}
if (!window.cancelAnimationFrame) {
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}
}());





标签:cancelAnimationFrame,浏览器,函数,requestAnimationFrame,window,理解,webkit,回调
From: https://blog.51cto.com/u_15983333/6091816

相关文章

  • z-index负值深入理解
    补充点小知识:CSS3与新时代的层叠上下文:css3之前,可能我们说会影响层叠上下文的也就position属性了,那CSS3时代的到来,对层叠上下文规则带来了新的影响,css3时代会影响层叠上下文......
  • 理解和感悟
    上一篇的那一道题——思路:(简单来说)1,将.txt中的内容读取出来(就是普通的文件读取)2,通过split函数将读取到的String数据分段3,通过for(Stringst:split){……}对数据进行循......
  • 深浅拷贝理解与应用
    转载博客:https://baijiahao.baidu.com/s?id=1741494490514331505&wfr=spider&for=pc 执行结果:  总之:要想改变多层嵌套的可变类型的值,又想保证原有数据不变,用深拷......
  • 深入理解Spring的Bean定义对象BeanDefinition-面试重点
    Spring注解这篇文章中讲到了Spring的组件,组件加载到Spring容器中也就是Spring容器中的Bean对象,想要更深理解Spring中的Bean对象,那对这个BeanDefinition一定要有深入的了解,......
  • IM即时通讯开发如何正确理解HTTP短连接中的Cookie、Session和Token
    众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现。Http短连接主要用于从服务器读取各种持久化信......
  • 深度理解Redux原理并实现一个redux
    Redux的作用是什么Redux的作用在于实现状态传递、状态管理。在这里你可能会说了,如果是状态传递,那我props的传递不也是可以达到这样的效果吗?context上下文方案不也是可以达......
  • Apache Calcite 架构理解
    ApacheCalcite架构理解一、简介和架构二、SQL解析三、案例分析四、总结六、参考链接官网SQL解析和重构,Calcite简单使用【FlinkSQL】ApacheCalcite架构......
  • 如何快速理解多线程与多进程及相关知识点的运用?
    一、多线程与多线程的基本原理  在一台计算机中打开浏览器浏览网页时,可以发现打开多个网页,可以将其粗略理解为多线程。同时,在计算机浏览网页的同时打开QQ、微信等其他软......
  • SpringBoot中对拦截器和过滤器的理解
    1、两者的关系   2、过滤器的使用步骤实现Filter接口,并加上@WebFilter注解@Slf4j//filterName为该过滤器的名称;//urlPatterns对哪些url进行拦截@WebFil......
  • 深入理解JSON对象
    看了js高级程序设计这本书关于json的讲解,下面我把里面我认为比较重要的知识提炼出来,一方面给帮助自己理解,同时也分享给有需要的朋友json:是一种数据格式,不是一种编程语言jso......