要素のスクロール オフセットを別の要素 (実際にはウィンドウ) と同期させる必要があり、Mobile Safari (iPad) でのスクロールの慣性的な「ロール オフ」フェーズで同期を行うのに問題があります。
いくつかの div がposition:fixed; overflow:hidden
あり、それらのスクロール オフセットをウィンドウの 1 つ (つまり、ボディ全体のスクロール) と同期させる必要があります。通常、次のようにコーディングします (jQuery):
var $win = $(window),
$div1 = $(...)
$win.scroll(function() {
$div1.scrollTop($win.scrollTop())
})
しかし、iPad でインターフェイスをテストしたところ、仮想ページを指でドラッグしているタッチ段階でも、指を離してページの速度が遅くなる慣性段階でも、div が更新されていないことに気付きました。停止します。
touchmove
イベントのハンドラーとイベントのハンドラーを登録することで、ドラッグフェーズで解決しましたscroll
。
しかし、慣性段階の問題を解決する方法が見つかりません。慣性運動が完全に停止し、最後にスクロール イベントが発生して所定の位置にスキップするまで、div は静止したままになります (ページの残りの部分とはゆっくりと同期しなくなります)。
「慣性スクロール」の問題を確認するには、iPad でスクロールしてみてください。残念ながら、iframe スクロールでの iPad の奇妙な動作のため、jsFiddle で動作させることができませんでした。
そのフェーズでポーリングを実行できれば、2 つの要素間の同期を維持できます。setTimeout
、setInterval
、およびで試しましrequestAnimationFrame
たが、どちらも慣性スクロール フェーズ中に起動しません。そのフェーズでは、すべての Javascript が停止するようです。
質問:
- 慣性スクロール フェーズ中に発生するタッチまたはスクロール イベントはありますか?
- その段階で Javascript コールバックを実行する方法はありますか?
- CSS または JS 以外の他の技術を使用して、2 つの要素 (両方ではなく X または Y のいずれか) のスクロール オフセットを同期する方法はありますか?