详解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 19 HTML / CSS
一款CSS3实现多功能下拉菜单(带分享按)的教程
Nov 05 HTML / CSS
CSS3 text shadow字体阴影效果
Jan 08 HTML / CSS
CSS3实现多样的边框效果
May 04 HTML / CSS
Html5移动端获奖无缝滚动动画实现示例
Jun 25 HTML / CSS
5分钟弄清楚html5的drag and drop(小结)
Apr 10 HTML / CSS
让IE支持HTML5的方法
Dec 11 HTML / CSS
html5定位并在百度地图上显示的示例
Apr 27 HTML / CSS
HTML5 CSS3打造相册效果附源码下载
Jun 16 HTML / CSS
HTML5不支持frameset的两种解决方法
Nov 14 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
Jul 18 HTML / CSS
td 内容自动换行 table表格td设置宽度后文字太多自动换行
Dec 24 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查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
2014/04/25 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Python异常的检测和处理方法
2018/10/26 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
2018/12/24 Python
python画图的函数用法以及技巧
2019/06/28 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
SQL Server面试题
2013/04/04 面试题
计算机开发个人求职信范文
2013/09/26 职场文书
专科文秘应届生求职信
2013/11/18 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
报到证丢失证明
2014/01/11 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
党员一帮一活动总结
2014/07/08 职场文书
三好生演讲稿
2014/09/12 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
超市收银员岗位职责
2015/04/07 职场文书
车位出租协议书范本
2016/03/19 职场文书
MySQL sql_mode的使用详解
2021/05/08 MySQL
详解Flask开发技巧之异常处理
2021/06/15 Python