详解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的动画按钮代码教程
Nov 23 HTML / CSS
css3的transform造成z-index无效解决方案
Dec 04 HTML / CSS
使用CSS禁止textarea调整大小功能的方法
Mar 13 HTML / CSS
关于HTML5的22个初级技巧(图文教程)
Jun 21 HTML / CSS
开发人员所需要知道的HTML5性能分析面面观
Jul 05 HTML / CSS
canvas使用注意点总结
Jul 19 HTML / CSS
HTML5进度条特效
Dec 18 HTML / CSS
利用canvas实现图片压缩的示例代码
Jul 17 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
Jul 29 HTML / CSS
background-position百分比原理详解
May 08 HTML / CSS
css中z-index: 0和z-index: auto的区别
Aug 23 HTML / CSS
CSS SandBox应用场景及常见问题
Jun 25 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动态图像的创建
2006/10/09 PHP
php+mysql数据库查询实例
2015/01/21 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
jQuery常用且重要方法汇总
2015/07/13 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
python中的字典详细介绍
2014/09/18 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
软件测试英文面试题
2012/10/14 面试题
介绍一下Ruby的特点
2013/01/20 面试题
请介绍一下WSDL的文档结构
2013/03/17 面试题
报关简历自我评价怎么写
2013/09/19 职场文书
教师听课评语大全
2014/12/31 职场文书
市场部经理岗位职责
2015/02/02 职场文书
辞职信范文大全
2015/03/02 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
离婚律师函范本
2015/05/27 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
教师培训学习心得体会
2016/01/21 职场文书
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python