详解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 相关文章推荐
全面总结使用CSS实现水平垂直居中效果的方法
Mar 10 HTML / CSS
基于css3 animate制作绚丽的动画效果
Nov 24 HTML / CSS
CSS3的常见transformation图形变化用法小结
May 13 HTML / CSS
CSS3之2D与3D变换的实现方法
Jan 28 HTML / CSS
HTML5 device access 设备访问详解
May 24 HTML / CSS
HTML5和以前HTML4的区别整理
Oct 20 HTML / CSS
HTML5移动端手机网站开发流程
Apr 25 HTML / CSS
HTML5+WebSocket实现多文件同时上传的实例
Dec 29 HTML / CSS
HTML5+CSS3:3D展示商品信息示例
Jan 03 HTML / CSS
localStorage、sessionStorage使用总结
Nov 17 HTML / CSS
CSS3 制作的图片滚动效果
Apr 14 HTML / CSS
css清除浮动clearfix:after的用法详解(附完整代码)
May 21 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/10/09 PHP
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
jquery中$each()方法的使用指南
2015/04/30 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
python中List的sort方法指南
2014/09/01 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
python3 pygame实现接小球游戏
2019/05/14 Python
PyTorch基本数据类型(一)
2019/05/22 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Python发送邮件封装实现过程详解
2020/05/09 Python
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
优秀团员个人事迹材料
2014/01/29 职场文书
环保建议书400字
2014/05/14 职场文书
明星邀请函
2015/02/02 职场文书
世界遗产导游词
2015/02/13 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书