私は現在$(window).bind('scroll', foo);
を使用して$(window).scrollTop()
を監視し、視差効果を作成するためにさまざまなことをしています。
すべてのデスクトップブラウザーで、ユーザーがスクロールするピクセルごとにfoo()
が呼び出されます。 iOSのSafariでは、スクロールが終了した後にのみスクロールイベントが発生します。
IOSでスワイプ中に関数が呼び出されるようにするために$(window).bind('touchmove', foo);
を追加しました。ユーザーが指を離すと、ページはスクロールし続けますが、イベントの発生は停止します。
何か案は?
「Skrollr」JavaScriptライブラリの使用を強くお勧めします。これは、私がこれまで見つけた中で最高のモバイルスクロールアニメーションオプションであり、すばやく簡単に起動して実行できます。アニメーションを作成し、スクロールの開始位置と終了位置に基づいてCSSを操作します。ほとんどの標準CSSプロパティに必要な数のデータスクロール位置とアニメーションを作成します。
次の例では、背景色が500ピクセルのスクロールの過程でアニメーション化されます。
<div data-0="background-color:rgb(0,0,255);" data-500="background-color:rgb(255,0,0);">WOOOT</div>
Gitでリポジトリをチェックアウトします: https://github.com/Prinzhorn/skrollr
Skrollrデモの例: http://prinzhorn.github.io/skrollr/
素晴らしい現実の例: http://www.fontwalk.de/03/
私があなたの質問を見たとき、私はこれのためにポリフィルをすることを計画していました(もしそれが存在しないなら?)。残念ながら、私にはほとんど時間がありませんでした。
アイデアは、setInterval
を開始することです。これはontouchstart
で開始され、document.body.scrollTop
は前回から変更されています。 20ミリ秒ごと。そうであれば、手動でscrollイベントを送出します。それ以外の場合は、明らかにスクロールが発生していないため、clearInterval
です。
これは簡単です。 (私よりも)時間に余裕がある場合は、これらのガイドラインを試してみてください。
編集:さて、さらに読むと、同じアイデアが他の回答でも提案されているようです。 iPadでスクロールしている間、インターバルが停止していることは確かですか?
AppleのiPhone 5cのWebページでは、指を画面に触れたままスクロールしてもスクロールし続けるように見える視差スクロール効果を使用しています。そのため、スクロール中はJavaScriptを完全に無効にすることはできません。 Tumult Hypeもこの機能を提供しています。
これはそのままでは不可能ですが、いわば、 iscroll を使用して実行できます。
したがって、iOSのiScrollとAndroidモバイルデバイス/タブレット)を使用し、デスクトップデバイスの現在の方法を使用します。
iScrollには、「onScrollMove」、「onBeforeScrollEnd」、「onTouchEnd」などの特定のイベントで呼び出されるコールバック関数の多くのオプションがあります。残念ながら、「すべての位置変更(変更を含む)」でコールバックを実行するオプションはありませんユーザーが画面へのタッチを停止した後のスクロールの勢いが原因です。」しかし、追加するのは簡単です。
IScrollソースの127行目付近の「// Events」コメントの近くに、新しい変数を追加します。
onPosChange: null
次に、308行目あたりの「_pos」関数の最後に、次の行を追加します。
if (this.options.onPosChange) this.options.onPosChange.call();
(「onPosChange」オプションに渡された関数が存在する場合は、それを呼び出すだけです)。
それが完了すると、次のコード例はid = "iscroll_container"を使用してdivのiScrollを設定し、変更するたびにYオフセットをコンソールに出力します。
var myScroll;
function loaded() {
myScroll = new iScroll('iscroll_container', { onPosChange: actOnScroll });
}
document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);
//Use this for high compatibility (iDevice + Android)
document.addEventListener('DOMContentLoaded', function () { setTimeout(loaded, 200); }, false);
function actOnScroll(){
console.log('got a scroll move! Vert offset is: ' + myScroll.y);
}
注、 Ben the Bodyguard Parallax Site はiPadでiScrollを使用して動作します(iscrollのはるかに古いバージョンを使用しており、ここで説明したとおりに実行しません)。
また、 Life of Pi Parallax Site はiPadで非常にうまく動作します-どのように動作するかはわかりませんが、少なくともそれが可能であることを証明しています!
私が知っているように、ほとんどのモバイルデバイスでスクロールしている間、JavaScriptの実行はありません。いくつかの回避策(iscrollなど)があります。 Iscrollはcss-technique "transform"を使用しています。ただし、スクロール中にJavaScriptを実行する方法はありません。スムーズスクロールアルゴリズムは高すぎると思います。
これはjQuery自体のバグである可能性があります: http://bugs.jquery.com/ticket/6446
このチケットはしばらくオープンしていて、iOS 4に関係していますが、おそらく純粋なJavaScriptでスクロール位置を計算することを検討する必要があります。