探究ios -webkit-overflow-scrolling:touch偶尔卡住或不能滑动的bug

本文深入探讨了在iOS Safari浏览器中使用-webkit-overflow-scrolling:touch属性时遇到的常见滚动Bug,包括页面在边界卡住、动态内容加载后无法滚动等问题,并提供了多种解决方案,如调整元素定位、增加子元素高度等。

探究ios -webkit-overflow-scrolling:touch偶尔卡住或不能滑动的bug

最常见的例子就是,

  • 在safari上,使用了-webkit-overflow-scrolling:touch之后,页面在上下边界处偶尔会卡住不动。
  • 在safari上,点击其他区域,再在滚动区域滑动,滚动条无法滚动的bug。
  • 通过动态添加内容撑开容器,结果根本不能滑动的bug。

在网上也看到了一些人在问这个问题,不过不多,国外倒是讨论的更多一点,描述如下。

总结了以下几种解决方案:

1.保证使用了该属性的元素上没有设置定位

如果出现偶尔卡住不动的情况,那么在使用该属性的元素上不设置定位或者手动设置定位为static

position: static

这样会解决部分因为定位(relative、fixed、absolute)导致的页面偶尔不能滚动的bug。

滑动到顶部继续手指往下滑,或者到底部继续往上滑,还是会触发卡住的问题(其实是整个页面上下回弹),说他算bug,其实就是ios8以上的特性,如果滚动区域大一点,用户不会觉得这是bug,如果小了,用户会不知道发生了什么而卡住了。

2. 如果添加动态内容页面不能滚动,让子元素height+1

如果在-webkit-overflow-scrolling:touch属性的元素上,想通过动态添加内容来撑开容器,触发滚动,是有bug 的,页面是会卡住不动的。例如下面的描述:

解决方案如下图:

方法就是在webkit-overflow-scrolling:touch属性的下一层子元素上,将height加1%或1px。从而主动触发scrollbar。

main-inner {
    min-height: calc(100% + 1px)
}

你也可以直接加伪元素上:

main:after {
    min-height: calc(100% + 1px)
}

这个方案不得不说真的好用。当然还有其他方案,不过要写js或者jq了,麻烦。

3. 为什么会有卡住不动的这个bug

这个bug产生于ios8以上(不十分肯定,但在ios5~7上需要手动使用translateZ(0)打开硬件加速)Safari对于overflow-scrolling用了原生控件来实现。对于有-webkit-overflow-scrolling的网页,会创建一个UIScrollView,提供子layer给渲染模块使用。

4. -webkit-overflow-scrolling:touch的其他坑

除此之外,这个属性还有很多bug,包括且不限于以下几种:

  • 滚动中 scrollTop 属性不会变化
  • 手势可穿过其他元素触发元素滚动
  • 滚动时暂停其他 transition
  • 会对可以移动元素的光标造成影响,包括文字选区和输入框内的光标。

直接上iScroll或者better-scroll

(注意) ios避免弹窗框的滑动穿透,注意在弹框的时候加上

$('body').css({'position':'fixed',"width":"100%","overflow":"hidden"});       在取消弹窗的时候恢复相应属性即可

内容参考了一位博友的,本来想放上链接发现找不到了-_-

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值