2013-08-26 2 views
36

Я установил фрагмент, который прокручивает раздел страницы в виде, когда он щелкнут, проблема в том, что если пользователь хочет прокрутить в середине анимации, прокрутка будет заикаться.JQuery .animate() остановить прокрутку при прокрутке пользователя вручную?

Как остановить анимацию jquery, если пользователь прокручивает вручную?

ответ

109

Изменить вашу функцию к этому:

var page = $("html, body"); 

$("section").click(function(e) { 

    page.on("scroll mousedown wheel DOMMouseScroll mousewheel keyup touchmove", function(){ 
     page.stop(); 
    }); 

    page.animate({ scrollTop: $(this).position().top }, 'slow', function(){ 
     page.off("scroll mousedown wheel DOMMouseScroll mousewheel keyup touchmove"); 
    }); 

    return false; 
}); 

Это будет:

  • Остановить анимацию, если пользователь прокручивает вручную (только во время анимации)
  • не мешает вашей нормальной JQuery анимации, например некоторые другие ответы были бы

Некоторые дополнительная информация:

Почему вы обязательными для всех этих событий? "scroll mousewheel и т. д."

Существует много разных типов событий прокрутки. Вы можете прокручивать вниз с помощью мыши, клавиатуры, сенсорного экрана и т. Д. При этом мы обязательно поймаем все из них.

Что такое var page = $("html, body");? Могу я просто использовать $("html, body") всюду?

Если вы используете один и тот же селектор более одного раза, целесообразно кэшировать их в variable. Будет легче писать/использовать и иметь лучшую производительность, чем при каждом повторном вычислении селектора.

Где я могу найти дополнительную информацию об .animate() и .stop()?

Вы можете прочитать документацию jQuery для .animate() и .stop(). Я также рекомендую прочитать около animation queue's, так как .stop() работает по этому принципу.

+0

Это должно помочь: http://stackoverflow.com/questions/2457246/jquery-click-function-exclude-children –

+2

Я обнаружил, что мне пришлось удалить «прокрутку» и «keyup» из того, что было связано, потому что '.stop()' запускался при первоначальном нажатии на '$ ('section')' (используя этот пример) – Crimbo

0
$("your selector").scroll(function(){ 
$('html,body').stop(); 
}); 

ссылка stop

0

Попробуйте

$('html,body').scroll(function() { 
    $(this).stop(true, false); 
}); 

Он также удалит все другие анимации из очереди элемента, но это не будет «прыгать» до конца текущей анимации прокрутки.

+0

Я считаю, что это помешает его оригинальной анимации прокрутки. –

4

Я хотел бы сделать это с помощью регистрирующих пользовательских событий

$('body,html').bind('scroll mousedown wheel DOMMouseScroll mousewheel keyup touchmove', function (e) { 
    if (e.which > 0 || e.type == "mousedown" || e.type == "mousewheel" || e.type == "touchmove") { 
    $("html,body").stop(); 
    } 
}); 

Вот a good tutorial.

Смежные вопросы