【踩坑记录】iOS中页面模块不可滚动

2,808 阅读3分钟

问题

在iOS的H5页面需要同时支持横向和纵向的滚动,iOS12.x以及以下版本,有横向滚动的模块会出现纵向滚动不了的情况,页面感觉就像卡死的情况一样。

ios.gif

分析

滚动问题,一般可能会有两种情况:

  1. JS阻止了相关事件,导致滑动未被正确响应;
  2. CSS样式影响,例如设置了overflow:hidden导致页面不可滚动;

是否是JS事件影响?

针对是否因为JS中某些事件导致的,可以查看dom的相关的事件,然后移除事件即可验证:

飞书20211111-164524.png 实践证明并没有什么作用。

是否是CSS样式导致?

如何判断是否是 CSS 样式引起的,可在使用iOS模拟器进行调试,然后将可能影响的属性都重置一下。针对这个问题,将表格以上的overflow属性都移除或禁用了一下,结果发现可纵向滚动了,但是横向滚动又不可用了。

ios1.gif

所以初步判断可能是样式问题导致,两者不兼容,尝试设置 overflow-x: scroll,但横向滚动可行,纵向会不行,发现overflow-y会被自动设置为auto, 经过反复实验,发现只有当overflow-yvisible纵向滚动才没有问题。关于为什么设置overflow-x会影响到overflow-y具体可以看:stackoverflow.com/questions/6… 。一度陷入到迷茫,停滞不前,不知道咋搞。

原来如此

不知所措,Google搜索;然而却没有相关的文章,惨。。。搜索一些文章至少还是有些输入,并且重新看了看overflow的一些属性,并再某一个博文中,收获一个观点:overflow:auto / scroll,会构建一个 scrollView。然后再联想到之前经常遇到的弹窗中滚动会引发body的滚动。事情出现了些转机,表格其实可以纵向滚动,只是高度刚好是内容高度。

ios2.gif

所以问题是某一个模块的滚动到底时,没有冒泡到父元素,而该页面又是flex布局,只有内容区域可滚动,从而导致页面卡住了。

解决方案

能准备描述问题时,答案就不会太远了。

对该问题解决方案其实可以有两个:

  1. 限制需要滚动模块的高度,尽可能的小,至少有个地方可继续滚动页面;
  2. 改变滚动方式,使用body作为滚动容器;

为了体验,还是选择第二种方式,模块滚动到底会冒泡到window上面,使用body作为滚动容器,等价window上滚动。

ios3.gif

总结

遇到问题需要准确定义问题,明确问题后,解决方案其实就比较简单了。同时需要灵活使用各种工具,例如解决这个问题:有些调试技巧(iOS模拟器、Safari DevTools的使用),有些联想能力(Google的使用)。有问题并不可怕,尤其是前端可复现,解决起来就简单多了,有问题重点是需要准确的定义描述问题。