详解webapp页面滚动卡顿的解决办法


Posted in HTML / CSS onDecember 26, 2018

手机浏览器在滚动当前页面(还可能是缩放页面)时,由于默认行为被阻止,导致页面被迫静止,导致用户使用体验差,感觉滚动页面有停顿感。

具体一点的解释:由于 touchstart 事件对象的 cancelable 属性为 true,也就是说它的默认行为可以被监听器通过 preventDefault() 方法阻止。但浏览器无法预先知道一个监听器会不会调用 preventDefault(),它能做的只有等监听器执行完后再去执行默认行为,而监听器执行是要耗时的,有些甚至耗时很明显,这样就会导致页面卡顿。即便监听器是个空函数,也会产生一定的卡顿,毕竟空函数的执行也会耗时。

addEventListener的useCapture参数

基本概念:xxx.addEventListener('事件名', function(xxx){xxx}, useCapture).

第一个参数表示事件名称(不含 on,如 "click");第二个参数表示要接收事件处理的函数;第三个参数为 useCapture.

下面就来看看这个东西是个啥意思,直接举例子说明更加直观。

<div id="level1">
  <div id="level2">
    <div id="level3">请在此点击</div>
  </div>
</div>
<div id="info">
</div>
var level1 = document.getElementById("level1");
var level2 = document.getElementById("level2");
var level3= document.getElementById("level3");
var info = document.getElementById("info");
outDiv.addEventListener("click", function () { info.innerHTML += "level1" + "<br>"; }, false);
middleDiv.addEventListener("click", function () { info.innerHTML += "level2" + "<br>"; }, false);
inDiv.addEventListener("click", function () { info.innerHTML += "level3" + "<br>"; }, false);

根据上述代码来看这个 useCapture 为 true 和 false的作用效果:

全为 false 时,触发顺序为:level3、level2、level1
全为 true 时,触发顺序为:level1、level2、level3
level1为 true,其他为 false 时,触发顺序为:level1、level3、level2
level2为 true,其他为 false 时,触发顺序为:level2、level3、level1
level3为 true,其他为 false 时,触发顺序为:level3、level2、level1
level1为 false,其他为 true时,触发顺序为:level2、level3、level1
level2为 false,其他为 true时,触发顺序为:level1、level3、level2
level3为 false,其他为 true时,触发顺序为:level1、level2、level3

由上述结果得出如下结论:

true 的触发顺序总是在 false 之前;
如果多个均为 true,则外层的触发先于内层;
如果多个均为 false,则内层的触发先于外层。

passive属性来控制事件行为

使用方式如下

addEventListener('事件名', function(xxx){xxx}, {
    capture: false,
    passive: false,
    once: false
})

三个属性都是布尔类型的开关,默认值都为 false。

capture:等价于以前的 useCapture 参数;
once:就是表明该监听器是一次性的,执行一次后就被自动 removeEventListener 掉;
passive:用于webapp的touch事件

据了解,在手机浏览器使用事件的时候,有 80% 的滚动事件监听器是不会阻止默认行为的,也就是说大部分情况下,浏览器是白等了。所以,passive 监听器诞生了,passive 的意思是“顺从的”,表示它不会对事件的默认行为说 no,浏览器知道了一个监听器是 passive 的,它就可以在两个线程里同时执行监听器中的 JavaScript 代码和浏览器的默认行为了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
css3选择器基本介绍
Dec 15 HTML / CSS
CSS实现定位元素居中的方法
Jun 23 HTML / CSS
CSS3哪些新特性值得称赞
Mar 02 HTML / CSS
css3新单位vw、vh的使用教程
Mar 23 HTML / CSS
CSS3 分类菜单效果
May 27 HTML / CSS
CSS3中新增的对文本和字体的设置
Feb 03 HTML / CSS
详解CSS3:overflow属性
Nov 17 HTML / CSS
html5调用摄像头功能的实现代码
May 07 HTML / CSS
Html5 Canvas 实现一个“刮刮乐”游戏
Sep 05 HTML / CSS
HTML5 Canvas自定义圆角矩形与虚线示例代码
Aug 02 HTML / CSS
AmazeUI 面板的实现示例
Aug 17 HTML / CSS
CSS中em的正确打开方式详解
Apr 08 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
Dec 21 #HTML / CSS
HTML5的postMessage的使用手册
Dec 19 #HTML / CSS
使用html2canvas.js实现页面截图并显示或上传的示例代码
Dec 18 #HTML / CSS
Canvas globalCompositeOperation
Dec 18 #HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
Dec 12 #HTML / CSS
手对手的教你用canvas画一个简单的海报的方法示例
Dec 10 #HTML / CSS
html5+css如何实现中间大两头小的轮播效果
Dec 06 #HTML / CSS
You might like
PHP写的求多项式导数的函数代码
2012/07/04 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
JQuery获取表格数据示例代码
2014/05/26 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
jQuery插件scroll实现无缝滚动效果
2015/04/27 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
搭建vue开发环境
2018/07/19 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
Python基于DES算法加密解密实例
2015/06/03 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
python 字典操作提取key,value的方法
2019/06/26 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
逃课检讨书
2015/01/26 职场文书
新郎结婚保证书
2015/02/26 职场文书
财政局个人总结
2015/03/04 职场文书
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫