之前在用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。