作家
登录

高性能滚动scroll及页面渲染优化

作者: 来源: 2017-04-26 09:25:20 阅读 我要评论

  •  
  •         } 
  •  
  •     }; 
  •  
  • }; 
  •  
  • // 实际想绑定在 scroll 事宜上的 handler 
  •  
  • function realFunc(){ 
  •  
  •     console.log("Success"); 
  •  
  •  
  • // 采取了撙节函数 
  •  
  • window.addEventListener('scroll',throttle(realFunc,500,1000));  
  • 膳绫擎简单的撙节函数的例子可以拿到浏览器部属一下,大年夜概功能就是如不雅在一段时光内 scroll 触发的距离一向短于 500ms ,那么能包管事宜我们欲望调用的 handler 至少在 1000ms 内会触发一次。

    应用 rAF(requestAnimationFrame)触发滚动事宜

    膳绫擎介绍的颤抖与撙节实现的方法都是借助了准时器 setTimeout ,然则如不雅页面只须要兼容高版本浏览器或应用在移动端,又或者页面须要寻求高精度的效不雅,那么可以应用浏览器的原生办法 rAF(requestAnimationFrame)。

    window.requestAnimationFrame() 这个办法是用来在页面重绘之前,通知浏览器调用一个指定的函数。这个办法接收一个函数为参,该函数会在重绘前调用。

    rAF 常用于 web 动画的制造,用于精确控制页面的帧刷新衬着,让动画效不雅加倍流畅,当然它的感化不仅仅局限于动画制造,我们可以应用它的特点将它视为一个准时器。(当然它不是准时器)

    平日来说,rAF 被调用的频率是每秒 60 次,也就是 1000/60 ,触发频率大年夜概是 16.7ms 。(当履行复杂操作时,当它发明无法保持 60fps 的频率时,它会把频率降低到 30fps 来保持帧数的稳定。)

    简单而言,应用 requestAnimationFrame 来触发滚动事宜,相当于膳绫擎的:

    这个时刻,我们欲望即使页面在赓续被滚动,然则滚动 handler 也可以以必定的频率被触发(譬如 250ms 触发一次),这类场景,就要用到另一种技能,称为撙节函数(throttling)。

    1. throttle(func, xx, 1000/60) //xx 代表 xx ms内不会反复触发事宜 handler 

    简单的示例如下:

    1. var ticking = false; // rAF 触发锁 
    2.  
    3.  
    4. function onScroll(){ 
    5.  
    6.   if(!ticking) { 
    7.  
    8.     requestAnimationFrame(realFunc); 
    9.  
    10.     ticking = true
    11.  
    12.   } 
    13.  
    14.  
    15.  
    16. function realFunc(){ 
    17.  
    18.     // do something... 
    19.  
    20.     console.log("Success"); 
    21.  
    22.     ticking = false
    23.  
    24.  
    25. // 滚动事宜监听 
    26.  
    27. window.addEventListener('scroll', onScroll, false);  

    膳绫擎简单的应用 rAF 的例子可以拿到浏览器部属一下,大年夜概功能就是在滚动的过程中,保持以 16.7ms 的频率触发事宜 handler。

    应用 requestAnimationFrame 优缺抱病存,起首我们不得不推敲它的兼容问题,其次因为它只能实现以 16.7ms 的频率来触发,代表它的可调节性十分差。然则比拟 throttle(func, xx, 16.7) ,用于更复杂的场景时,rAF 可能效不雅更佳,机能更好。

    总结一下

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)