最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 滚动性能优化之 Passive Event Listeners 简介

    正文概述 掘金(singsong)   2020-12-15   628

    现代浏览器基本上都具有 线程化滚动功能(a threaded scrolling feature ),即使在运行计算量昂贵的 JavaScript 时,滚动也可以顺畅地运行。但此优化可能由于需要等待 touchstarttouchmovetouchend 等事件处理程序的结果而失效。这可能原因是在 touch 事件处理函数中调用 preventDefault() 来完全阻止滚动。

    addEventListener(
      document,
      'touchstart',
      function (e) {
        e.preventDefault(); // 完全阻止滚动
      },
      false
    );
    

    而浏览器这种阻止滚动行为其实是很少发生的,据统计表明:

    针对上述问题,网上提供了如下的优化方案:

    • 在 document 注册一个空的 touch 事件处理程序

      const touchHandler = function () {};
      document.addEventListener('touchmove', touchHandler);
      document.addEventListener('touchcancel', touchHandler);
      document.addEventListener('touchend', touchHandler);
      
    • 通过 CSS 样式 touch-action

      .classname {
        touch-action: none;
      }
      

    然而这种问题不仅仅发生在 touch 事件上,wheel 事件也存在相同的问题。为了解决这个问题,WHATWG 引入了 Passive Event Listeners

    Passive Event Listeners 是 DOM Spec 的新特性。Chrome 51,Firefox 49 和 landed in WebKit 也开始实现了 Passive Event Listeners 特性。它允许开发人员明确 Touch EventWheel Event 是否需要阻止滚动,来优化滚动性能。

    addEventListener(
      document,
      'touchstart',
      function (e) {
        e.preventDefault(); // 无效
      },
      { passive: true } // 明确告诉浏览器不会调用 preventDefault() 来阻止滚动
    );
    

    上述实例,调用了 e.preventDefault();,可能 console 面板打印如下提示信息:

    如果在 touchwheel 事件处理函数中调用 preventDefault(),同时没有开启 { passive: true }。此时可能 console 面板打印如下提示信息:

    对比优化效果视频

    如何检测 passive

    // Test via a getter in the options object to see if the passive property is accessed
    var supportsPassive = false;
    try {
      var opts = Object.defineProperty({}, 'passive', {
        get: function () {
          supportsPassive = true;
        },
      });
      window.addEventListener('testPassive', null, opts);
      window.removeEventListener('testPassive', null, opts);
    } catch (e) {}
    
    // Use our detect's results. passive applied if supported, capture will be false either way.
    elem.addEventListener('touchstart', fn, supportsPassive ? { passive: true } : false);
    

    参考文章

    • Passive event listeners
    • Passive event listeners explainer

    起源地下载网 » 滚动性能优化之 Passive Event Listeners 简介

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元