2012-12-11 12 views
5

要素がJavascript経由でMobile Safariでスクロールを停止したかどうかを検出することは可能ですか?要素が運動量のスクロールを停止したかどうかを検出しますか?

私は、-webkit-overflow-scrolling:touchを使用して勢いをスクロールする要素を持っています。勢いがスクロールに影響を与えた後も、要素がスクロールを停止したかどうかを検出する必要があります。

これは可能ですか? onscrollイベントを使用することは、アプリ内で行うべきではありません。

答えて

8

スワイプの速度を計算して、何らかのしきい値に基づいてモーメントスクロールが発生するかどうかを調べることができます。私はいくつかのテストを行い、約0.25ピクセル/ msの値が良いと思われます。

注:速度が低い場合でも勢いがスクロールすることがあります。私が記録した運動量のスクロールを引き起こす最も低い速度は0.13(非常に短いデルタ時間で)だったので、100%完璧な解決策が必要な場合は、探し続ける。

このコード例では、オーバースクロールも検出して処理します。

JQueryを使用。私の場合は

var scrollWrapper = $('#myWrapper'); 
var starTime, startScroll, waitForScrollEvent; 
scrollWrapper.bind('touchstart', function() { 
    waitForScrollEvent = false; 
}); 

scrollWrapper.bind('touchmove', function() { 
    startTime = new Date().getTime(); startScroll = scrollWrapper.scrollTop(); 
}); 

scrollWrapper.bind('touchend', function() { 
    var deltaTime = new Date().getTime() - startTime; 
    var deltaScroll = Math.abs(startScroll - scrollWrapper.scrollTop()); 
    if (deltaScroll/deltaTime>0.25 
     || scrollWrapper.scrollTop()<0 
     || scrollWrapper.scrollTop()>scrollWrapper.height()) { 
    // will cause momentum scroll, wait for 'scroll' event 
    waitForScrollEvent = true; 
    } 
    else { 
    onScrollCompleted(); // assume no momentum scroll was initiated 
    } 
    startTime = 0; 
}); 

scrollWrapper.bind('scroll', function() { 
    if (waitForScrollEvent) { 
    onScrollCompleted(); 
    } 
}); 
+0

これは素晴らしいです!私は内部のdivをスクロール可能にすることに苦労してきました。そして、その勢いを有効にすることによって、私が持っていたすべてのスナップロジックがウィンドウの外に出ました。 2つのカンマが不足していて、ラッパー変数が定義されていません。そうでなければ素晴らしいです! – Chris

+0

うれしいことがありましたらうれしいです。エラーを指摘してくれてありがとう。 – dagge

+0

非常にいいです。それのデモを作成します。それは他の人がすぐに結果を確認するのに便利かもしれません。 –

3

これは完全に働いた:スクロールが停止したとき

var timer; 
$(scrollWrapper).on('scroll',function(e){ 
    if(timer){ 
     clearTimeout(timer); 
    } 
    timer = setTimeout(function(){ 
     $(this).trigger('scrollFinished'); 
    }, 55) 
}) 



$(scrollWrapper).on('scrollFinished',function(){ 
     // will be called when momentum scroll is finished 
    }) 

は 'scrollfinished' イベントを公開します。

+1

興味深いテクニック、いくつかの特定のユースケースについては、(私の場合のように)受け入れられた答えよりも優れています。 +1 – Mtz

+0

偉大な単純な解決策、私はより大きな数にtimeOutの長さを微調整しなければならなかった – Arjan