h5 兼容性-ios 滚动问题及可能的方

算法漫游
• 阅读 3714

滚动事件

addEventListener 使用 passive 改善的滚屏性能

根据规范,passive 选项的默认值始终为false。但是,这引入了处理某些触摸事件(以及其他)的事件监听器在尝试处理滚动时阻止浏览器的主线程的可能性,从而导致滚动处理期间性能可能大大降低。

为防止出现此问题,某些浏览器(特别是Chrome和Firefox)已将文档级节点 Window,Document和Document.body的touchstart (en-US)和touchmove (en-US)事件的passive选项的默认值更改为true。这可以防止调用事件监听器,因此在用户滚动时无法阻止页面呈现。


var elem = document.getElementById('elem');
elem.addEventListener('touchmove', function listener() { /* do something */ }, { passive: true });
Copy to Clipboard

添加passive参数后,touchmove事件不会阻塞页面的滚动(同样适用于鼠标的滚轮事件)
您可以通过将passive的值显式设置为false来覆盖此行为,如下所示:


/* Feature detection */
/*特征检测*/
var passiveIfSupported = false;

try {
  window.addEventListener("test", null, Object.defineProperty({}, "passive", { get: function() { passiveIfSupported = { passive: true }; } }));
} catch(err) {}

window.addEventListener('scroll', function(event) {
  /* do something */
  // can't use event.preventDefault();
  // 不能使用 event.preventDefault()
}, passiveIfSupported );

在不支持addEventListener()的options参数的旧浏览器上,尝试使用它会阻止使用useCapture参数而不正确使用特征检测。

您无需担心基本scroll (en-US) 事件的passive值。由于无法取消,因此事件监听器无法阻止页面呈现。

问题-ios滚动卡顿不流畅?

解决方案

  1. body、局部滚动容器添加 -webkit-overflow-scrolling:touch

 -webkit-overflow-scrolling

auto:使用普通滚动, 当手指从触摸屏上移开,滚动会立即停止。
touch: 使用具有回弹效果的滚动,当手指从触摸屏上移开,内容会继续保持一段时间的滚动效果。继续滚动的速度和持续的时间和滚动手势的强烈程度成正比。同时也会创建一个新的堆栈上下文。
在移动端上,在你用overflow-y:scroll属性的时候,你会发现滚动的效果很很生硬,很慢,这时候可以使用-webkit-overflow-scrolling:touch这个属性,让滚动条产生滚动回弹的效果,就像ios原生的滚动条一样流畅。

问题-ios偶现滚动时最底部的内容被固定的tab菜单栏遮挡

尝试解决方案

  1. 父级元素的滚动容器添加 -webkit-overflow-scrolling:touch (未复现),但是这种方案, ios(13.1.3)最外层会默认出现滚动条,如不需出现滚动条的,需手动在最外层添加隐藏滚动条的样式
-webkit-scrollbar {
   display: none;
}
  1. 父级元素的底部添加paddingBottom,外层默认会增多一部分空白,不友好

问题-ios滚动到指定位置,出现部分组件渲染空白,滚动后正常显示,或滚动后部分元素渲染被截断

ios 11(13.1.3),当页面点击顶部的关键字或底部输入框输入关键字时,可出现查询的结果卡片,多次查询后,从顶部点击关键字直接滚动到最新的结果卡片时,结果卡片出现渲染异常(部分/全部元素渲染不出),来回滚动后,元素出现。

尝试解决方案

  1. 滚动到底部位置时,加一个定时器 (复现)
  2. 取消父级元素的overflow:hidden (复现)
  3. 强制渲染子元素的内容 (复现)
  4. 父级元素的滚动容器添加 -webkit-overflow-scrolling:touch (复现)
  5. 添加wil-change:scroll-position (复现)
  6. 父级元素及子元素添加最小高度 (复现,出现频率降低)
  7. 父元素滚动前设置-webkit-overflow-scrolling:touch, 滚动结束后设置-webkit-overflow-scrolling:touch (同一种组件未出现,2种组件交替出现时复现、无效)
  8. 父元素设置backface-visibility: hidden;transform: translate3d(0,0,0); (复现)
  9. 父元素取消z-index设置,同时添加-webkit-overflow-scrolling:auto; (同一种组件或不同种组件交替出现时,均不再出现)

    小结

    -webkit-overflow-scrolling:touch这个属性添加后可能会引起一些奇奇怪怪的bug,上述是可能是由于层级z-index的设置或者是组件元素的不一致(试过用同一种组件,但是取消了单个结果的轮播点切换,复现),导致在视觉上渲染被遮挡的问题。
    上述的几种情况是依据当时bug复现不同的表现而排查的步骤,最终还是得根据不同情况来修复问题。

问题-ios容器列表初始不能上滑加载更多数据,需下拉刷新后才能触发上滑加载更多

当设置了overflow-y:auto的滚动容器高度减少一定的像素时,复现该问题, 但是要注意减少的容器高度,不然会引起最后一个列表元素的部分内容被遮挡。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
4年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这