2009-11-02 2 views
4

У меня есть несколько ссылок на странице с целью «перейти на верх», что достигается прокруткой страницы вверху с приятной анимацией. Я заметил, что иногда, пока страница прокручивается, пользователь, например, захочет прокрутить назад, но это невозможно. Экран будет только заикаться, но будет продолжать анимацию, пока не достигнет вершины.Вызов Прокрутка только при прокрутке пользователя, а не при анимации()

Я хочу, чтобы остановить анимацию, если пользователь пытается прокрутить, поэтому я написал этот код:

$('#gototop').click(function() { 
    $('body').animate({scrollTop:0},3000); 
    $(window).scroll(function() { 
     $('body').stop(); 
}); 
    return false; 
}) 

Этот код является проблематичным, так как одушевленных() подсчитывает как скроллинг, поэтому только движется крошечное бит до того, как он остановится.

Я также попробовал key-down в качестве опции, но прокрутка мыши не регистрируется в качестве ключа.

Можно ли вызвать функцию прокрутки, когда пользователь свитки, а не animate()?

+0

Я уверен, что это выглядит красиво, и я заинтересован в решении этой проблемы, но как вопрос личных предпочтений я не как анимированная прокрутка –

+0

@Michael Haren: Понятно, но иногда клиенты любят анимацию: D –

+0

@Brandon Wang, достаточно справедливо –

ответ

5

Вы можете написать свой собственный код для установки значения анимации и установить флаг, указывающий, что изменение происходит от анимации.

Например: (непроверенная)

var scrollAnimating = false 
jQuery.fx.step.scrollTop = function(E) { 
    scrollAnimating = true; 
    E.elem.scrollTop = E.now; 
    scrollAnimating = false; 
}; 

$('#gototop').click(function() { 
    $('body').animate({scrollTop:0},3000); 
    $(window).scroll(function() { 
     if (!scrollAnimating) 
      $('body').stop(); 
    }); 
    return false; 
}) 

Вы можете сделать то же самое для scrollLeft.

Обратите внимание, что я предполагаю, что установка scrollTop является повторным вызовом, так что событие scroll запускается внутри линии E.elem.scrollTop = E.now. Если он не реентерабелен (это может быть только в некоторых браузерах), событие будет запущено после того, как scrollAnimating вернется к false. Чтобы исправить это, вы можете сбросить scrollAnimating внутри события scroll.

+0

Это не работает, потому что пользователь хочет прокручивать, когда прокрутка страницы ... –

+0

Что значит? – SLaks

+0

Это должно остановить анимацию, как только она получит событие 'scroll', которое не происходит из анимации. (Проверяя 'scrollAnimating') – SLaks

-2

Выяснил это! Осмотревся в Интернете, я нашел что-то под названием Document.addEventListener для Mozilla и document.onmousewheel для IE и Opera, которые будут захватывать прокрутки событий.

$('#gototop').click(function() { 
    $('body').animate({scrollTop:0},3000); 

    if(window.addEventListener) document.addEventListener('DOMMouseScroll', stopScroll, false); 
    document.onmousewheel = stopScroll; 

    function stopScroll() {$('body').stop()}; 

    return false; 
}) 
+0

Существует много способов прокрутки (перетащить выделение, перетащить полосу прокрутки, клавиши со стрелками, автопрокрутку); AFAIK, это будет только ловить колесико. – SLaks

+0

@SLacks: true, но большинство пользователей будут использовать только колесо прокрутки. На многих веб-сайтах реализованы анимационные прокрутки, и редко они думают о пользователях, которые хотят прокручивать их на полпути: это компромисс между юзабилити и раздуванием. –

+0

@SLacks: Не обращайте внимания на то, что я сказал раньше, ваше решение отлично работает. Приношу свои извинения за то, что я был заносчивым и не тестировал ваш пример. Мне еще многое предстоит узнать. –

0

У меня была такая же проблема, но я нашел решение прямо на документации jQuery. В анимационном методе есть свойство, позволяющее установить функцию обратного вызова после завершения анимации.

http://api.jquery.com/animate/#animate-properties-duration-easing-complete

Вот код:

$('#gototop').click(function() { 

    //This will help you to check 
    var animationIsFinished = false; 

    $('body').animate({scrollTop:0},3000,"swing",function(){ 

     //this function is called when animation is completed 
     animationIsFinished = true; 

    }); 
    $(window).scroll(function() { 
     //Check if animation is completed 
     if (!animationIsFinished){ 
      $('body').stop(); 
     } 
    }); 
    return false; 
}) 
+1

Добро пожаловать в SO. Спасибо, что ответили. Пожалуйста, закончите тур и наслаждайтесь SO ;-) – ZF007

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