广州芦苇科技web前端

广州芦苇科技web前端

在移动端开发的时候经常会碰到区域滚动的需求,当然实现起来也是非常简单的,给需要滚动的元素定高然后添加一个overflow-y:scorll自然就可以滚动了,但是添加这个属性之后,使用chrome或者其他浏览器工具调试时是支正常的,但是到手机上时滚动效果就十分的奇怪,滚动会让人感觉有卡顿感。这个时候使用一个属性就可以解决这个问题。-webkit-overflow-scrolling:touch,这个属性会让滚动条产生回弹效果,让滚动没有那么生硬。

在MDN上是这么定义这个属性的:

然而是不是设置了这个属性之后就万事大吉了呢?也不全是这样子的,其实这个属性也还是有一些坑的。

偶尔会卡住或不能滑动

比较常见的问题有:

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

在网上也能看到别人也遇到过同样的问题。

偶尔卡住的问题,解决方案网上众说纷纭,遇到了很多相同的说法,比如如果卡住不动的话,就加一个z-index,就能解决该问题的说法。

在试了很多次之后,这种说法没有一次解决过这个问题。这个说法能够传播出来,可能是使用者当时在使用的时候遇到了-webkit-overflow-scrolling:touch点透或者层级的问题。所以该方案不具有适用性。

下面总结一下几种比较好的解决方案:

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

如果出现偶尔卡住不动的情况,那么在使用该属性的元素上不设置定位或者手动设置定位为static,这样会解决部分因为定位(relative、fixed、absolute)导致的页面偶尔不能滚动的bug。

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

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

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

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

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

这个bug产生于ios8以上(不十分肯定,但在ios5~7上需要手动使用translateZ(0)打开硬件加速)

Safari对于overflow-scrolling用了原生控件来实现。对于有-webkit-overflow-scrolling的网页,会创建一个UIScrollView,提供子layer给渲染模块使用。

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

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

最后

如果项目中区域滚动部分不是特别多的话直接使用-webkit-overflow-scrolling:touch也不会有太大的问题,但是如果这个需求很多的话可以考虑使用better-scroll这个库来做移动端区域滚动。

个人博客:LCW blog

欢迎和我们一起并肩作战: [email protected]访问 www.talkmoney.cn 了解更多

提供广东钉钉开发,专业的企业微信外包,高性价比的微信小程序建设,靠谱的小游戏制作,高质量的H5开发

01-14 22:43