防止滚动反弹的身体元素,但保持它的iOS中的子元素

最近我一直在研究移动webapp。 我正在优化移动优先,现在专门针对iOS的iPhone。 我不想要一个本地应用程序的精确外观,但我认为,作为本土的感觉是绝对重要的。 我已经做了标记和CSS来反映这个想法,留给我这个(注释以更好地理解我后面的问题):

Webapp标记

这一切都没有问题,它也有一个本地的感觉,静态页眉和页脚,和一个可滚动的内部视图(感谢-webkit-overflow-scrolling: touch )的优势。

任何使用iOS超过5分钟的人都会知道,当你向上或向下滚动时,你会得到一些不错的动量滚动。 另外,当你点击列表顶部时,你会得到一个不错的“反弹”效果:

在Settings.app中弹出列表

我觉得这有助于定义iOS的感觉,这样一个小细节可以走很长的路。 幸运的是,当您在web应用程序中的可滚动元素的列表的顶部之下,并滚动到顶部时,您会得到相同的效果。 这是行动中的理想行为

在Web应用程序中向下滚动会产生这种弹跳效果

但是,如果您位于列表的顶部,并尝试重新创build相同的弹跳行为(列于上面的Setting.app),我们会得到以下行为,这是不期望的向下滚动会为应用程序的整个Chrome产生弹跳效果

我已经看到了堆栈溢出的一些类似的 问题 ,但是这些都select禁用弹跳。 我想知道是否可以保持弹跳,但总是让它发生在body section section#main ,而不是webapp的chrome上 。 我不使用jQuery,所以我更喜欢直接使用JavaScript(尽pipe如此,CSS解决scheme的优点)。

这里有一个包含所有代码(Sinatra,HAML和Sass;当前分支是so )的GitHub仓库 ,或者是一个带有破碎图像和链接的JSFiddle ,但是在iPhone上显示问题(最好添加到主屏幕来testing) 。

旧信息:我解决了这个问题: http : //www.hakoniemi.net/labs/scrollingOffset/nonbounce.html

新的信息:这是现在可以从这里find一个jQuery插件: http : //www.hakoniemi.net/labs/nonbounce/ 。

有几个问题 ,比如在应用这些function时丢失了缩放function,或者dynamic更新不能stream畅地运行。

但现在最简单的方法是定义: <div class="nonbounce">...</div>然后$.nonbounce();

我遇到了同样的问题,并提出了这个解决scheme:

http://demo.josefkjaergaard.com/stackoverflow/element_scroll/index.html

基本上我防止滚动内容处于其最大位置。这防止了主体滚动被激活。

它可以工作,但在缓解结束时确实会产生一点点。 多一点工作,这种行为可能会被相反方向的内容抵消。

这个伪代码如何:

 document.body.addEventListener("ontouchstart", function(event) { if(document.getElementById("main").scrollTop > 0) return; event.preventDefault(); event.stopPropagation(); }, false);