所以随着chrome 63的发布,我们得到了新的overscroll-behavior
属性。过去,我们使用overflow:hidden
来达到目的,但是这个新属性使在移动设备上滚动的错误更加明显。
如果你在Android上使用chrome去谷歌自己的演示,你可以看到这个错误。
在聊天框中,如果您向下滚动并尝试向上滚动而不从屏幕上抬起手指,您将看到除非您向上然后向下滚动,否则您不能。 同样,如果您要一直向上滚动然后抬起手指,然后尝试向上滚动然后向下滚动而不抬起手指,它会卡住。无论是否使用过度滚动行为,所有子项都会发生这种情况。并且不仅限于 y 轴,它也发生在 X 上。
如您所知,这对用户来说非常烦人。
我能想到的唯一解决方案(尚未实现)是监听滚动事件,当用户将元素一直滚动到底部时,将滚动调整 0.1px,这样用户永远无法真正到达元素的底部,但这将是非常昂贵的,我们知道滚动事件并不总是在移动设备上立即触发,从而导致捕捉效果(而且我没有知道它会导致什么其他影响,例如破坏用户的滚动运动,就好像他们刚刚抬起手指一样)。
也来自谷歌对contain
的辩护
包含 - 防止滚动链接。卷轴不会传播到 祖先,但显示节点内的局部效果。例如 安卓上的翻滚发光效果或橡皮筋效果 iOS 在用户达到滚动边界时通知用户。注意: 使用过度滚动行为:包含在 HTML 元素上阻止 过度滚动导航操作。
这根本不会发生,因此规范被破坏了。
据我所知,这发生在所有版本的移动版chrome上,无论是网络视图,网站还是全屏添加到主页都无关紧要。
如果有人知道是否有解决方法而不必完全更改应用程序的结构,如果有错误跟踪器,那也很棒。
更新: 这里正在处理错误
所以这是我使用的解决方法,它有效,但用户会看到一个小跳跃,但这是我可以忍受的权衡。
document.querySelector("#somediv").addEventListener("touchstart", function() {
var clientHeight = this.clientHeight;
var scrollHeight = this.scrollHeight;
var scrollTop = this.scrollTop;
var scroll = scrollHeight - scrollTop;
var scrollTo;
if( scroll == clientHeight ) scrollTo = scrollTop - 1;
if( scroll == scrollHeight ) scrollTo = scrollTop + 1;
if(scrollTo) return this.scrollTop = scrollTo;
});
Chrome 65 已解决此问题。