-webkit-overflow-scrolling:属性

之前在用css实现横向滚动时,用到了-webkit-overflow-scrolling:touch实现了滚动回弹效果,今天就彻底的认识下这个家伙以及它所带来的各种坑,并总结了一些排坑的办法。

     一.-webkit-overflow-scrolling是什么东西

         -webkit-overflow-scrolling控制元素在移动设备上面是否有滚动回弹效果,它可以设置成auto和touch

           auto: 使用普通滚动, 当手指从触摸屏上移开,滚动会立即停止。
    touch: 使用具有回弹效果的滚动, 当手指从触摸屏上移开,内容会继续保持一段时间的滚动效果。继续滚动的速度和持续的时间和滚动手势的强烈程度成正比。

           使用touch可以让滚动条有滚动回弹效果,就像是ios原生的滚动体验一样

 

   二.解决safari浏览器布局抖动的问题

       想实现一个布局为header、main、bottom的布局,其中头部和底部通过fixed固定,中间部分通过滚动条滑动。

       如果目的是实现只要中间的内容超过屏幕高度时,中间内容会自动滚动的效果的话,main部分加上上下的padding,然后不需要自己添加任何滚动条属性,当超出高度时,

  body会自动产生滚动条。这样我们的目的其实是实现了的。

     但是在safari上,当超出高度,页面往下滑时,浏览器底部的工具栏会随着页面一起晃动(向下滚动时会拉起底部工具栏),造成了很不好的体验。所以我们想在中间的main部分       加一个独立的滚动条

     解决方案一:

           在main上使用fixed定位,加上overflow-y属性。

     .main {
         position: fixed;
         top: 50px;
         bottom: 50px;
        overflow-y: scroll;
      }

         不过不推荐这个fixed方案,因为页面偶尔卡住不动,下面说到了这个问题。

     解决方案二:

           中间的main不设定位高度100%,再padding头部和尾部

           其中头部和底部的定位设为absolute会比设为fixed体验更好(况且fix布局在移动端本来就有各种各样的问题,还是尽量避开:) )。

           大致代码如下,仍是 overflow-y 和-webkit-overflow-scrolling,重点在于中间部分依照文本流布局。

          html, body { height: 100%; }

          .main { padding: 50px 0; height: 100%; overflow-y: scroll; -webkit-overflow-scrolling: touch; }

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

最常见的例子就是,

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

      相应的解决办法有,自己对应自己问题,找解决办法:

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

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

     position: static

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

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

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

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

 

展开阅读全文

没有更多推荐了,返回首页