移动端开发——关于局部区域滚动总结---实战系列

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

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

-webkit-overflow-scrolling 属性控制元素在移动设备上是否使用滚动回弹效果. auto: 使用普通滚动, 当手指从触摸屏上移开,滚动会当即中止。 touch: 使用具备回弹效果的滚动, 当手指从触摸屏上移开,内容会继续保持一段时间的滚动效果。继续滚动的速度和持续的时间和滚动手势的强烈程度成正比。同时也会建立一个新的堆栈上下文。java

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

偶尔会卡住或不能滑动

比较常见的问题有:git

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

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

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

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

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

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

若是出现偶尔卡住不动的状况,那么在使用该属性的元素上不设置定位或者手动设置定位为static,这样会解决部分由于定位(relative、fixed、absolute)致使的页面偶尔不能滚动的bug。微信小程序

可是滑动到顶部继续手指往下滑,或者到底部继续往上滑,仍是会触发卡住的问题(实际上是整个页面上下回弹),说他算bug,其实就是ios8以上的特性,若是滚动区域大一点,用户不会以为这是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,包括且不限于如下几种:

  • 滚动中 scrollTop 属性不会变化
  • 手势可穿过其余元素触发元素滚动
  • 滚动时暂停其余 transition

最后

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

做者简介:李成文,芦苇科技web前端开发工程师,擅长网站建设、微信小程序开发、小游戏制做、企业微信制做、H5建设,专一于前端框架、交互设计、图像绘制、数据分析等研究。

我的博客:LCW blog

欢迎和咱们一块儿并肩做战: web@talkmoney.cn 访问 www.talkmoney.cn 了解更多

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

相关文章
相关标签/搜索