我有一个基于web的应用程序,其中包括一个组件,用户可以用他们的手指上下滚动。我使用事件的preventDefault
方法来防止在iOS设备上触摸移动移动整个屏幕的默认行为。
不幸的是,这似乎不再适用于我今天早上刚刚升级到的iOS 5。我不得不假设这只是在iOS 5中不同的做法,但我还没有能够找到提供说明的资源。
更新#1:我还没能找到我的具体问题的答案,但我能够稍微调整我的代码,以使用-webkit-overflow-scrolling
样式(设置为“touch”的值),并实现时髦的惯性滚动功能(内容滚动速度取决于您的滑动速度,如果达到边界,将“橡皮筋弹回”)。看起来很酷..。
更新#2:我现在有了另一个奇怪的问题。出于某种奇怪的原因,溢出滚动行为有时会变得混乱,您必须在包含的元素上左右拖动手指,才能使其内容上下移动。我还没有弄清楚为什么会发生这种情况--有谁有什么想法吗?
发布于 2012-06-15 17:32:11
我找到了一个非常简单的解决方案。当事件命中允许滚动的元素时,只需标记事件即可。在文档的事件侦听器上,只需检查是否设置了标志,只有在未设置标志时才停止事件:
this.$scrollableEl.on('touchmove', function(event){
event.comesFromScrollable = true;
// when you have containers that are srollable but
// doesn't have enough content to scroll sometimes:
// event.comesFromScrollable = el.offsetHeight < el.scrollHeight;
});
$(document).on('touchmove', function(event){
if (!event.comesFromScrollable){
event.preventDefault();
}
});
您也可以改用event.stopImmediatePropagation,这样就不需要文档元素上的eventListener了,但在我的例子中,这违反了zepto.js tap
:
this.$scrollableEl.on('touchmove', function(event){
event.stopImmediatePropagation();
});
发布于 2011-10-14 14:55:47
首先,我可以使用以下代码验证e.preventDefault()是否禁用了iOS 5中的所有滚动:
document.ontouchmove = function(e){ e.preventDefault(); }
然而,不幸的是,这禁用了overflow上的滚动:scroll div。(如果任何人有一个解决方案,让内部元素滚动打开,请分享。)
关于update#2,我注意到当一个可滚动元素嵌套在另一个可滚动元素(包括页面本身)中时,会出现奇怪的行为。有时设备会犹豫用户想要在哪个元素上滚动。特别是,我在使用position:fixed时注意到了这个问题。我的解决方案是确保正文有100%的高度,并且在可能的情况下,可滚动元素使用position:absolute。
https://stackoverflow.com/questions/7756684
复制相似问题