-webkit-overflow-scrolling 属性
MDN中概述 入下
-webkit-overflow-scrolling 属性控制元素在移动设备上是否使用滚动回弹效果.
值选项
1、auto
使用普通滚动, 当手指从触摸屏上移开,滚动会立即停止
2、touch
使用具有回弹效果的滚动, 当手指从触摸屏上移开,内容会继续保持一段时间的滚动效果。继续滚动的速度和持续的时间和滚动手势的强烈程度成正比。同时也会创建一个新的堆栈上下文。
问题 BUG
1、使用了-webkit-overflow-scrolling:touch之后,页面偶尔会卡住不动。
复现场景:发现页面在滚动期间是不会出现卡住的问题,但是在滚动条到顶部或者底部的时候会出现这个问题
分析问题:如果在到达顶部/底部的时候不让它到达顶部/底部,是不是可以规避这个问题
解决办法: 在滑动的时候为滑动区域添加 scroll事件
监听滚动条是否到了底部/顶部 如果到了顶部/底部那么让scrollTop
[^1]相应的减少 1;
代码如下:
1 | // js 文件 |
2、使用了-webkit-overflow-scrolling:touch之后,弹窗会引发底部滑动(滚动穿透)。
复现场景:弹窗带有滚动内容 滑动到底部或者顶部会触发底层的滚动;
分析问题:滚动事件穿透,
解决办法: 弹窗显示的时候固定底部滚动并记录底层scrollTop值,并将底部内容设置为position: fixed;
height: 100%; 来达到固定底层的目的,然后就可以规避滚动穿透;
代码如下:
1
2
3
4
5
6 // css
/* 解决点击穿透滑动失效 */
.mask_show {
position: fixed;
height: 100%;
}
1 | // js部分 |
[^1]: 底部 scrollTop = scrollHeight- offsetHeight
offsetHeight:包括元素的边框、内边距和元素的水平滚动条(如果存在且渲染的话),不包含:before或:after等伪类元素的高度。
scrollHeight:值与元素视图填充所有内容所需要的最小值clientHeight相同。包括元素的padding,但不包括元素的border和margin。scrollHeight也包括 ::before 和 ::after这样的伪元素。
参考文档:滚动穿透问题的解决方案