防止身体元素在触摸设备上滚动

问题:

我有一个在iOS主屏幕上的Web应用程序,所以没有浏览器窗口,它的外观和function非常好。 我已经想出了如何让内部div元素做触摸滚动事件,并在iOS中使用动量/反弹样式,这是完美的…我现在遇到的问题是,反弹滚动(再次,只有iOS )正在搞乱页面上的任何固定元素或与网站相关的animation。

当我尝试以下:

document.ontouchmove = function(e) {e.preventDefault()}; 

问题停止,但现在我不能在我的应用程序的任何地方滚动。

我需要的:

我想要将身体完全locking到位…如果有人抓住我的侧边栏或导航栏,然后拉上页面,身体就会弹起! 但是,如果有人在内容区域内,完全没有问题 – 应用程序滚动完美,看起来不错。 如果我停止滚动侧边栏或导航栏或正文,应用程序中的所有滚动将无法正常工作,实质上是不起作用的。

tl; dr:身体在卷轴上反弹。 我想要一个滚动的内容区域,并不滚动任何其他地方。 身体不应该移动,但我认为在身体内滚动的元素应该。

作为一个旁注,我浏览了以下stream行的问题/解决scheme张贴(其他许多人):

1 2 3

我只是想在人们认为我没有做任何search之前发布这个消息……我已经在这个小时了,看到了比上面更多的解决scheme,但是我想得到上面列出的最受欢迎的解决scheme所以没有人认为这是一个重复的问题。

前几天我想到了这个,并且用这个方便的jsbin来演示我做了什么工作:

我的工作jsbin例子

当你在iPad上打开这个链接时,文本应该是可滚动的。 尝试拖动当前没有当前touchmove事件正在工作的屏幕的其余部分。

如果你玩弄它,你会注意到,只有内部的文本字段按预期移动。 这是通过将.scrollable类放在.scrollable类中来确定的。 .scrollable类占据了它的父容器的整个高度。

现在使容器更大的高度,如height: 500px 。 这里的目标是使其足够大,从而不会有足够小的空间,使iPad上的其他空白仍然存在。 尝试滚动或拉动它…没有touchmove事件被激发,屏幕保持原位。

我的JS确定一个对象被触摸后是否溢出。 如果是,它会滚动。 如果不是,则不发送滚动事件。

玩它,让我知道,如果我可以提供任何更好的例子,也如果你遇到任何错误…现在唯一的一个我知道的是,如果你真的想要打破它,并开始拉扯周围的网站当前touchmove事件正在被解雇,或者页面首先被加载…我不会把这些作为“bug”来计算,但是如果你也能find一个解决scheme,那么我就是所有人的耳朵!