防止滚动反弹的身体元素,但保持它的iOS中的子元素
最近我一直在研究移动webapp。 我正在优化移动优先,现在专门针对iOS的iPhone。 我不想要一个本地应用程序的精确外观,但我认为,作为本土的感觉是绝对重要的。 我已经做了标记和CSS来反映这个想法,留给我这个(注释以更好地理解我后面的问题):
这一切都没有问题,它也有一个本地的感觉,静态页眉和页脚,和一个可滚动的内部视图(感谢-webkit-overflow-scrolling: touch
)的优势。
任何使用iOS超过5分钟的人都会知道,当你向上或向下滚动时,你会得到一些不错的动量滚动。 另外,当你点击列表顶部时,你会得到一个不错的“反弹”效果:
我觉得这有助于定义iOS的感觉,这样一个小细节可以走很长的路。 幸运的是,当您在web应用程序中的可滚动元素的列表的顶部之下,并滚动到顶部时,您会得到相同的效果。 这是行动中的理想行为 :
但是,如果您位于列表的顶部,并尝试重新创build相同的弹跳行为(列于上面的Setting.app),我们会得到以下行为,这是不期望的 :
我已经看到了堆栈溢出的一些类似的 问题 ,但是这些都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);