首页 > 作文

深入理解HTML5定时器requestAnimationFrame的使用

更新时间:2023-04-03 03:52:02 阅读: 评论:0

前言

计时器一直是javascript动画的核心技术。而编写动画循环的关键是要知道延迟时间多长合适。一方面,循环间隔必须足够短,这样才能让不同的动画效果显得平滑流畅;另一方面,循环间隔还要足够长,这样才能泉州轻工学院确保浏览器有能力渲染产生的变化。

大多数电脑显示器的刷新频率是60hz,大概相当于每秒钟重绘60次。大多数浏览器都会对重绘操作加以限制,不超过显示器的重绘频率,因为即使超过那个频率用户体验也不会有提升。因此,最平滑动画的最佳循环间隔是1000ms/60,约等于16.6ms。

而ttimeout和tinterval的问题是,它们都不精确。它们的内在运行机制决定了时间间隔参数实际上只是指定了把动画代码添加到浏览器ui线程队列中以等待执行的时间。如果队列前面已经加入了其他任务,那动画代码就要等前面的任务完成后再执行。

requestanimationframe采用系统时间间隔,保持最佳绘制效率,不会因为间隔时间过短,造成过度绘制,增加开销;也不会因为间隔时间太长,使用动画卡顿不流畅,让各种网页动画效果能够有一个统一的刷新机制,从而节省系统资源,提高系统性能,改善视觉效果。

特点

requestanimationframe会把每一帧中的所有dom操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率。在隐藏或不可见的元素中,requestanimationframe将不会进行重绘或回流,这当然就意味着更少的cpu、gpu和内存使用量。requestanimationframe是由浏览器专门为动画提供的api,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了cpu开销。

用法

requestanimationframe方法将一个callback作为参数,回调函数会被传入一个参数,domhighrestimestamp,指示当前被 requestanimationframe() 排序的回调函数被触发的时间。返回值是一个请求 id,表示回调列表中唯一的标识。可以传这丰胸的好方法个值给 window.cancelanimationframe() 以取消回调函数。

requestid = window.requestanimationframe(callback);

利用这个api,可以将某些代码放到下一次重新渲染时执行,避免短时间内触发大量reflow。

例如页面滚动事件(scroll)的回调函数就很适合幸福是什么课文使用这个api, 将回调操作推迟到下一次重新渲染。但需要注意的是requestanimationframe 不管理回调函数,即在回调被执行前,多次调用带有同一回调函数的 requestanimationframe,会导致回调在同一帧中执行多次。最简单的,可以用节流函数来解决这个问题,也可以想办法让requestanimationframe的队列里同样的回调函数只有一个:

let scheduledanimationframe = fal;document.body.onscroll = () => {    if (scheduledanimationframe) return;    scheduledanimationframe = true;    window.requestani联想笔记本做系统mationframe(() => {        scheduledanimationframe = fal;        // do something    });};

当然,最佳的应用场景还是在帧动画里,可以大幅优化性能。

面试题

如何渲染几万条数据并不卡住界面

这道题考察了如何在不卡住页面的情况下渲染数据,也就是说不能一次性将几万条都渲染出来,而应该一次渲染部分 dom,那么就可以通过 requestanimationframe 来每 16 ms 刷新一次。

<!doctype html><html lang="en"><head>  <meta chart="utf-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <meta http-equiv="x-ua-compatible" content="ie=edge">  <title>document</title></head><body>  <ul>控件</ul>  <script>    ttimeout(() => {      // 插入十万条数据      const total = 100000      // 一次插入 20 条,如果觉得性能不好就减少      const once = 20      // 渲染数据总共需要几次      const loopcount = total / once      let countofrender = 0      let ul = document.querylector("ul");      function add() {        // 优化性能,插入不会造成回流        const fragment = document.createdocumentfragment();        for (let i = 0; i < once; i++) {          const li = document.createelement("li");          li.innertext = math.floor(math.random() * total);          fragment.appendchild(li);        }        ul.appendchild(fragment);        countofrender += 1;        loop();      }      function loop() {        if (countofrender < loopcount) {          window.requestanimationframe(add);        }      }      loop();    }, 0);  </script></body></html>

兼容性

一些老的浏览器是不支持这个api的,为了也能使用这个api, 可以自定义这个方法,挂载到window下面:

(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'] || window[vendors[x]+'cancelrequestanimationframe'];    }    if (!window.requestanimationframe)      皮肤功能  window.requestanimationframe = function(callback) {            var currtime = new date().gettime();            var timetocall = math.max(0, 16 - (currtime - lasttime));            var id = window.ttimeout(function() { callback(currtime + timetocall); },              timetocall);            lasttime = currtime + timetocall;            return id;        };    if (!window.cancelanimationframe)        window.cancelanimationframe = function(id) {            cleartimeout(id);        };}());

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。

本文发布于:2023-04-03 03:52:01,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/a626dd2e6033f28dfddee40402a677a7.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:深入理解HTML5定时器requestAnimationFrame的使用.doc

本文 PDF 下载地址:深入理解HTML5定时器requestAnimationFrame的使用.pdf

标签:回调   动画   函数   间隔
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图