2012-01-14 16 views
28

私はそれをしたいことは、しかし、私は、スクロールは、ユーザーを戦うためにしたくありませんユーザーに完全な制御権を与えることができます。ユーザースクロールでスクロールトップのjqueryアニメーションを停止できますか? Webページを自動的に特定の要素にスクロールするように、それがスクロールし、ユーザーがスクロールを開始した場合、私は自動化されたスクロールが停止するinput--

だから私はもともと私はこのような何かができると思った:

var animatable = $('body, html'); 
animatable.animate({scrollTop: $('#foo').offset()}, 1000); 

$(window).scroll(function() { animatable.stop(); }); 

しかし、問題はscrollTopスプライトのアニメーションがウィンドウのスクロールイベントハンドラをトリガしis--!したがって、アニメーションが始まり、すぐに停止します。

私はこれが可能です...私はそれがユーザーの入力によってトリガされます場合にのみ停止し、私のウィンドウのスクロールイベントハンドラを作ることができる方法を探していますか?

答えて

55

ダイオードのソリューションは、私のために動作しませんでした - スクロールを()アニメーションを直ちに停止を意味し、アニメーションやユーザーを区別しませんでした。 different postから、(この目的のために修正された)私のために、次の作品:

// Assign the HTML, Body as a variable... 
var $viewport = $('html, body'); 

// Some event to trigger the scroll animation (with a nice ease - requires easing plugin)... 
$('#element').click(function() { 
    $viewport.animate({ 
     scrollTop: scrollTarget // set scrollTarget to your desired position 
    }, 1700, "easeOutQuint"); 
}); 

// Stop the animation if the user scrolls. Defaults on .stop() should be fine 
$viewport.bind("scroll mousedown DOMMouseScroll mousewheel keyup", function(e){ 
    if (e.which > 0 || e.type === "mousedown" || e.type === "mousewheel"){ 
     $viewport.stop().unbind('scroll mousedown DOMMouseScroll mousewheel keyup'); // This identifies the scroll as a user action, stops the animation, then unbinds the event straight after (optional) 
    } 
});     
+2

魅力のように働きました。この質問にお返事いただきありがとうございます。あなたが ''イベントのリストにtouchstart'を追加し、イベント自体でそれを確認する必要がありますタッチスクリーンデバイスの場合 – ghayes

+9

... || e.type ==「 –

+0

@Benjammin touchstart''」 - 良いヒント、小さなnitpick - ではなく== '' –

関連する問題