详解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开启硬件加速的使用和坑
Aug 21 HTML / CSS
css3实现图片遮罩效果鼠标hover以后出现文字
Nov 05 HTML / CSS
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
Feb 27 HTML / CSS
使用CSS3设计地图上的雷达定位提示效果
Apr 05 HTML / CSS
详解CSS3中常用的样式【基本文本和字体样式】
Oct 20 HTML / CSS
Html5移动端弹幕动画实现示例代码
Aug 27 HTML / CSS
如何使用localstorage代替cookie实现跨域共享数据问题
Apr 18 HTML / CSS
HTML5 Notification(桌面提醒)功能使用实例
Mar 17 HTML / CSS
实例教程 利用html5和css3打造一款创意404页面
Oct 20 HTML / CSS
跨域修改iframe页面内容详解
Oct 31 HTML / CSS
HTML5自定义mp3播放器源码
Jan 06 HTML / CSS
html5中嵌入视频自动播放的问题解决
May 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
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
php判断访问IP的方法
2015/06/19 PHP
php 多文件上传的实现实例
2016/10/23 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
基于JS实现PHP的sprintf函数实例
2015/11/14 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
JavaScript 继承详解(五)
2016/10/11 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
全球性的奢侈品梦工厂:Forzieri(福喜利)
2019/02/20 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
《我不是最弱小的》教学反思
2014/02/23 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
西双版纳导游词
2015/02/03 职场文书
团委工作总结2015
2015/04/02 职场文书
基层党建工作简报
2015/07/21 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS