详解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教程(8):CSS3透明度指南
Apr 02 HTML / CSS
CSS3媒体查询(Media Queries)介绍
Sep 12 HTML / CSS
CSS3中的transform属性进行2D和3D变换的基本用法
May 12 HTML / CSS
html5本地存储_动力节点Java学院整理
Jul 12 HTML / CSS
使用Html5、CSS实现文字阴影效果
Jan 17 HTML / CSS
HTML5中的强制下载属性download使用实例解析
May 12 HTML / CSS
HTML5之tabindex属性全面解析
Jul 07 HTML / CSS
html5 figure和figcaption的使用方法
Sep 10 HTML / CSS
详解如何使用rem或viewport进行移动端适配
Aug 14 HTML / CSS
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
Mar 31 HTML / CSS
纯CSS3实现div按照顺序出入效果
Jul 15 HTML / CSS
CSS中calc(100%-100px)不加空格不生效
May 07 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
关于时间计算的结总
2006/12/06 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
php解析url并得到url中的参数及获取url参数的四种方式
2015/10/26 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
2016/12/01 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
Vue分页器实现原理详解
2019/06/28 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
微信小程序使用自定义组件导航实现当前页面高亮
2020/01/02 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
实例Python处理XML文件的方法
2015/08/31 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
python3 字符串知识点学习笔记
2020/02/08 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
生产内勤岗位职责
2013/12/07 职场文书
银行介绍信范文
2014/01/10 职场文书
师范生求职自荐信
2014/06/14 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
用Python将库打包发布到pypi
2021/04/13 Python
Django migrate报错的解决方案
2021/05/20 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技