页面滚动性能优化之passive

passive有何用?

正如标题所言,passive就是为了让浏览器的页面滚动起来更加丝滑,飞一般的感觉~

?

passive怎么用


看完还是不懂,不着急,看下述慢慢道来

?

passive的前世今生

对于addEventListener(),大家都是认识的,为dom添加触发事件,那么,今天的故事就从这里开始。
在早期addEventListener是这样的:

addEventListener(type, listener, useCapture)

其中useCapture:是否允许事件捕捉,但是很少会传true,然后就变成可选项了:

addEventListener(type, listener[, useCapture ])

而,到了现在

addEventListener(type, listener, {
    capture: false, //捕获
    passive: false, // 这是啥子?你猜!
    once: false    //只触发一次
})
于是,我们的主角passive就出现了!

?

为什么passive能优化页面的滚动性能?

这个我们就要从chrome渲染说起了
?

1. 简述chrome的线程化渲染框架

1.1 chrome的线程化渲染框架的两个线程:

  • 内核线程(Main/Render Thread):负责DOM树构建、元素的布局、图层绘制记录部分(main-thread side)、JavaScript的执行
  • 合成线程(Compositor Thread):图层绘制实现部分(impl-side)、图层图像合成

    从上图可知,页面Frame#1在内核线程中完成js执行、布局和绘制后,经过一个周期合成线程去执行Frame#1页面图像的合成。

?

1.2 那么,对于用户输入事件分类:

  • 一种是在内核线程处理的事件
  • 另外一种是直接由合成线程处理的事件

?

2 你肯定会问,那么有什么区别呢?

在内核线程处理的事件:需要经过内核线程处理的输入事件要在内核线程执行逻辑,遇到内核线程在忙,无法立即响应。

如用户的大部分输入事件都跟页面元素有关系,一旦页面元素注册了对应事件的监听器,监听器的逻辑代码(JavaScript)必须在内核线程中执行(V8引擎运行在内核线程),因此这种输入事件经常无法立即得到响应。

直接由合成线程处理的事件:不经过内核线程就能快速处理的输入事件为手势输入事件(滑动、捏合)。

最骚的是,虽然手势事件可以不在内核线程处理,但是手势事件的产生还是离不开内核线程。

?

3 页面卡顿的原因?

手势事件有个属性 cancelable,作用是告诉浏览器该事件是否允许监听器通过 preventDefault() 方法阻止,默认为true。如果在touch事件内部调用preventDefault(),事件默认行为被取消,页面也就静止不动了。但是浏览器并不知道touch事件内部是否调用了preventDefault(),

浏览器只有等内核线程执行到事件监听器对应的JavaScript代码时,才能知道内部是否会调用preventDefault函数来阻止事件的默认行为,所以浏览器本身无法优化这种场景。

手势输入事件是由连续的普通输入事件组成的,在这种场景下,无法快速产生,会导致页面无法快速执行滑动逻辑,从而让用户感觉到页面卡顿。

?
而Chrome团队从统计数据中分析得出,注册了mousewheel/touch相关事件监听器的页面中,80%的页面内部都不会调用preventDefault函数来阻止事件的默认行为。对于这80%的页面,即使监听器内部什么都没有做,相对没有注册mousewheel/touch事件监听器的页面,在滑动流畅度上,有10%的页面增加至少100ms的延迟,1%的页面甚至增加500ms以上的延迟。Chrome团队认为对于统计中的这80%的页面来说,他们都是不希望因为注册mousewheel/touch相关事件监听器而导致滑动延迟增加的。
?

4. passive的诞生

?
所以,passive 监听器诞生了,passive 的意思是“顺从的”,表示它不会对事件的默认行为说 no,浏览器知道了一个监听器是 passive 的,它就可以在两个线程里同时执行监听器中的 JavaScript 代码和浏览器的默认行为了。
?
经过上面的分析,我们了解到了Passive Event Listeners特性实际上是为了解决浏览器页面滑动流畅度而设计的,它通过扩展事件属性passive让Web开发者来告知浏览器监听器是否会阻止事件的默认行为,从而让浏览器可以更智能地决策并优化,这其中涉及到了Chrome的多线程渲染框架、输入事件处理等知识。

原文地址:https://www.cnblogs.com/fe-linjin/p/11317975.html

时间: 2024-11-09 00:43:43

页面滚动性能优化之passive的相关文章

前端页面的性能优化

减少HTTP请求 文件合并 合并css或js文件使要下载的文件数减少 css sprites 使用图片精灵将大量的背景图片整合到一张图片,然后用background-image和background-position控制背景图片的位置定位到要显示的图片,适用于数量多,体积小的图表等图片. 行内图片(base64格式) 将图片转化为base64格式直接嵌入html内部 服务端设计配置 跨域分离组件 分离组件可以最大化并行下载,但要确保只用不超过2-4个域,因为存在DNS查找的代价.例如,可以把HT

UITableView滚动性能优化

影响 UITableView 滚动的流畅性的原因 1.在代理方法中做了过多的计算占用了 UI 线程的时间 2.Cell里的图片吃GPU(在tableView:cellForRowAtIndexPath:中) 3.Cell 中 view 的组织复杂 关于第一点,首先要明白 tableview 的代理(这里指 datasource 和 delegate 的那套方法,下同)方法的调用顺序,和时机.对于一般的应用会有如下顺序: 1.向代理要 number Of Rows. 2.对于每行向代理要 heig

web前端页面性能优化小结

转自blueidear:http://bbs.blueidea.com/thread-2936073-1-1.html PS:结合了精英的思想和自己的一些小小的总结~ 影响用户访问的最大部分是前端的页面.网站的划分一般为二:前端和后台.我们可以理解成后台是用来实现网站的功能的,比如:实现用户注册,用户能够为文章发表评论等等.而前端呢?其实应该是属于功能的表现. 而我们建设网站的目的是什么呢?不就是为了让目标人群来访问吗?所以我们可以理解成前端才是真正和用户接触的. 除了后台需要在性能上做优化外,

web 前端页面性能优化总结

影响用户访问的最大部分是前端的页面.网站的划分一般为二:前端和后台.我们可以理解成后台是用来实现网站的功能的,比如:实现用户注册,用户能够为文章发表评论等等.而前端呢?其实应该是属于功能的表现. 而我们建设网站的目的是什么呢?不就是为了让目标人群来访问吗?所以我们可以理解成前端才是真正和用户接触的. 除了后台需要在性能上做优化外,其实前端的页面更需要在性能优化上下功夫,只有这样才能给我们的用户带来更好的用户体验.不仅仅如此,如果前端优化 得好,他不仅可以为企业节约成本,他还能给用户带来更多的用户

移动前端系列——移动页面性能优化.

随着移动互联网的发展,我们越发要关注移动页面的性能优化,今天跟大家谈谈这方面的事情. 首先,为什么要最移动页面进行优化? 纵观目前移动网络的现状, 移动页面布局越来越复杂,效果越来越炫,直接导致了文件越来越大,下载和运行速度越来越低,而速度低会造成不良影响,据统计: 71%的用户期望移动页面跟pc页面一样快,74%的用户能容忍的响应时间为5秒,所以我们必须保证移动端页面有足够的速度. 移动页面的速度跟三个因素有关,分别是:移动网络带宽速度,设备性能(CPU,GPU,浏览器),页面本身. 目前主流

web页面性能优化

web前端页面性能优化 网站的划分一般为二:前端和后台.我们可以理解成后台是用来实现网站的功能的,比如:实现用户注册,用户能够为文章发表评论等等.而前端呢? 其实应该是属于功能的表现.并且影响用户访问体验的绝大部分来自前端页面.网站前端的用户体验决定了用户是否想要去使用网站的功能,而网站的功 能决定了用户是否会一票否决前端体验.如果前端优化得好,他不仅可以为企业节约成本,而且因为增强的用户体验,还给公司带来更多的用户.那么我 们应该如何对我们前端的页面进行性能优化呢? 浏览器访问优化 浏览器请求

(二)Android性能优化系列---Improving Layout Performance(一)(转载自:http://xhmj12.iteye.com/blog/2064258)

Android性能优化系列---Improving Layout Performance(一) Layouts是Android应用里直接影响用户体验的一个关键部分.如果Layout设计的不好,可能导致你的应用大量的内存占用从而导致UI响应很慢.Android SDK提供了工具帮助你分析你的Layouts的性能问题.结合这个工具同时查看本文,你能实现滑动流畅.占用内存最小的用户界面. Use the <merge> Tag 某些时候,自定义可重用的布局包含了过多的层级标签,比如我们需要在Line

阿里巴巴 web前端性能优化进阶路

Web前端性能优化WPO,相信大多数前端同学都不会陌生,在各自所负责的站点页面中,也都会或多或少的有过一定的技术实践.可以说,这个领域并不缺乏成熟技术理论和技术牛人:例如Yahoo的web站点性能优化黄金法则,以及大名鼎鼎的优化大师Steve Souders.本文并非一篇讨论性能优化技术方法的文章,而更多的是对中文站搜索List页面持续两年多的前端性能优化实践的思路总结.希望对正在从事这个领域研究的前端同学能有所帮助. 简单的说,我们的性能优化实践分为三个阶段:初探期.立规期.创新期, 每个阶段

web前端性能优化总结

网站的划分一般为二:前端和后台.我们可以理解成后台是用来实现网站的功能的,比如:实现用户注册,用户能够为文章发表评论等等.而前端呢?其实应该是属于功能的表现.并且影响用户访问体验的绝大部分来自前端页面. 而我们建设网站的目的是什么呢?不就是为了让目标人群来访问吗?所以我们可以理解成前端才是真正和用户接触的.除了后台需要在性能上做优化外,其实前端的页面更需要在性能优化上下功夫,只有这样才能给我们的用户带来更好的用户体验.就好像,好多人问,男人在找女朋友的时候是不是只看外表,一些智慧的男人给出了这样