【发布时间】:2013-02-24 14:55:05
【问题描述】:
我需要使一个元素的滚动偏移量与另一个元素(实际上是窗口)保持同步,但在 Mobile Safari (iPad) 上滚动的惯性“滚降”阶段,我无法做到这一点。
我有几个带有position:fixed; overflow:hidden 的 div,我需要使它们的滚动偏移量与窗口的滚动偏移量保持同步(即整个正文滚动。)通常我会这样编码(jQuery):
var $win = $(window),
$div1 = $(...)
$win.scroll(function() {
$div1.scrollTop($win.scrollTop())
})
但是在 iPad 上测试界面时,我注意到 div 在触摸阶段(用手指拖动虚拟页面时)都没有更新,在惯性阶段(当您放开页面时)也没有更新减速到停止。
我通过为touchmove 事件和scroll 事件注册处理程序解决了拖动阶段的问题。
但我找不到解决惯性阶段问题的方法。 div 保持静止(并缓慢地与页面的其余部分不同步),直到惯性运动完全停止,此时滚动事件最终被触发并跳入位置。
尝试在 iPad 上滚动它以查看“惯性滑行”问题。不幸的是,由于 iPad 在 iframe 滚动方面的奇怪行为,我无法让它在 jsFiddle 上工作。
如果我可以在那个阶段运行轮询,我可以在两个元素之间保持同步。我试过setTimeout、setInterval 和requestAnimationFrame,但在惯性滚动阶段它们都不会触发。似乎所有 Javascript 在该阶段都停止了。
问题:
- 在惯性滚动阶段是否触发了任何触摸或滚动事件?
- 是否有任何方法可以在该阶段运行 Javascript 回调?
- 有没有办法使用 CSS 或 JS 以外的其他技术同步两个元素(X 或 Y,而不是两者)的滚动偏移量?
【问题讨论】:
-
将div元素作为子元素添加到滚动层是否可行?
-
“滚动层”是什么意思?被滚动的元素是窗口,也就是整个主体。固定的 div 在 body 内部,是的,但它们有
position:fixed。 -
我基本上是在了解我在这里得到的信息developer.apple.com/library/ios/#documentation/WindowsViews/…
-
我添加了一个重现问题的工作演示。请忽略大量的 HTML 和 CSS。如果您希望查看元素结构及其 CSS,您可以使用浏览器的检查器,但实际上,理解问题所需的一切都在我的问题中表达了。谢谢。
标签: ipad scroll mobile-safari touchmove