唯品秀博客
首页 > 前端开发 > Javascript > 神奇的requestAnimationFrame【定时器】

神奇的requestAnimationFrame【定时器】

2019年01月14日 作者:管理员 1000次浏览

可能你还没见过这个东西是个啥,其实他就是类似于setTimeout和setInterval,然而它与setTimeout和setInterval又有所不同,requestAnimationFrame不需要设置时间间隔。这有什么好处呢?requestAnimationFrame有何神奇之处?本文将详细介绍HTML5新增的定时器requestAnimationFrame。

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

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

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

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

特点

  • 【1】requestAnimationFrame会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率
  • 【2】在隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的CPU、GPU和内存使用量
  • 【3】requestAnimationFrame是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了CPU开销
  • 【4】requestAnimationFrame可以在某些时候解决setTimeout和setInterval的bug,传统定时器在页面tab切换时候,定时器会进入一个假死状态,比如你电脑开了两个窗口,首先你打开有定时器的页面,然后定时器开始执行,假设每秒i+1,当i=10时候你切换到别的tab窗口,隔了一段时间看,i继续从=10开始累加。。。
  • 使用

    requestAnimationFrame的用法与settimeout很相似,只是不需要设置时间间隔而已。requestAnimationFrame使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。它返回一个整数,表示定时器的编号,这个值可以传递给cancelAnimationFrame用于取消这个函数的执行

    1
    2
    3
    4
    5
    var timer = requestAnimationFrame(function(){
        console.log(0);
    });
    console.log(timer);
    //结果1和0

    上面这段代码其中结果1则是requestAnimationFrame返回值,执行一遍返回1,如此类推,你可能疑惑为什么console.log(timer);中的timer没有加()也能执行,这得回到文章头部说到的你可以理解为requestAnimationFrame就是个定时器,定时器自然不需要手动去触发执行

    cancelAnimationFrame方法用于取消定时器

    1
    2
    3
    4
    5
    //控制台什么都不输出
    var timer = requestAnimationFrame(function(){
        console.log(0);
    });
    cancelAnimationFrame(timer);

    也可以直接使用返回值进行取消

    1
    2
    3
    4
    var timer = requestAnimationFrame(function(){
        console.log(0);
    });
    cancelAnimationFrame(1);

    「两年博客,如果觉得我的文章对您有用,请帮助本站成长」

    赞( 2 ) 打赏

    谢谢你请我吃鸡腿*^_^*

    支付宝
    微信
    2

    谢谢你请我吃鸡腿*^_^*

    支付宝
    微信

    上一篇:

    下一篇:

    共有 0 条评论 - 神奇的requestAnimationFrame【定时器】

    博客简介

    唯品秀博客: weipxiu.com,一个关注Web前端开发技术、关注用户体验、坚持更多原创实战教程的个人网站,愿景:成为宇宙中最具有代表性的前端博客,期待您的参与,了解更多...

    精彩评论

    友情链接

    他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!

    站点统计

    • 文章总数: 180 篇
    • 草稿数目: 2 篇
    • 分类数目: 13 个
    • 页面总数: 21 个
    • 评论总数: 850 条
    • 链接总数: 14 个
    • 标签总数: 357 个
    • 建站时间: 857 天
    • 注册用户: 463 人
    • 访问总量: 8682215 次
    • 最近更新: 2019年4月21日
    服务热线:
     173xxxx7240

     QQ在线交流

     旺旺在线