2013-10-20 3 views
2

Я пытался сделать высоту изменения размера навигации, как показано здесь: http://www.kriesi.at/themes/enfold/JQuery медленная реакция scrollTop()

Я получил очень близко, как видно здесь на jsfiddle: http://jsfiddle.net/magnusbrad/4DK3F/12/

<div id="nav" class="header"> 
nav here 
<ul class="right"> 
    <li>item 1</li> 
    <li>item 2</li> 
    <li>item 3</li> 
</ul> 
</div> 

$(window).scroll(function() { 
if ($(document).scrollTop() === 0) { 
    $('#nav.header').animate({height:'140px'}, 500); 
    $('ul.right').animate({'line-height':'140px'}, 500); 
} else { 
    $('#nav.header').animate({height:'40px'}, 500); 
    $('ul.right').animate({'line-height':'40px'}, 500); 
} 
}); 

При прокрутке вниз анимация работает отлично, однако, когда вы прокручиваете назад до верхней части страницы, для обновления и выполнения инструкции else требуется 10 секунд. Что мне не хватает, чтобы сделать это быстрее, в реальном времени?

ответ

3

Проблема заключается в том, что .animate() добавляет в очередь каждый раз, когда ее вызывают. Так как вы прокручиваете верхнюю часть, другая анимация добавляется в очередь анимации для каждого события прокрутки. Затем, когда вы вернетесь в начало, анимация .animate({height:'140px'}, 500) добавляется в конец очереди, означая, что это произойдет только после того, как все другие анимации произойдут (каждый из них займет 500 миллисекунд). Конечно, вы не видите, что эти другие анимации происходят, потому что вы говорите jQuery, чтобы оживить те ценности, которые у них уже есть, и поэтому ничего визуально не происходит.

http://api.jquery.com/animate/

Try:

var atTop = !$(document).scrollTop(); 

$(window).scroll(function() { 

    if ($(document).scrollTop() === 0 && !atTop) { 

     $('#nav.header').animate({height:'140px'}, 500); 
     $('ul.right').animate({'line-height':'140px'}, 500); 

     atTop = true; 

    } else if (atTop) { 

     $('#nav.header').animate({height:'40px'}, 500); 
     $('ul.right').animate({'line-height':'40px'}, 500); 

     atTop = false; 

    } 
}); 

http://jsfiddle.net/4DK3F/32/

+0

Wow! Большое вам спасибо за быстрый ответ. Я ценю объяснение того, что происходит с .animate(). Можете ли вы быстро объяснить, почему вы сначала создали var, и используете console.log? – bradmagnus

+0

@bradmagnus О, вы можете игнорировать 'console.log' - я просто использовал это, пока я играл с ним. Что касается переменной 'top', я использую это, чтобы отслеживать, была ли позиция прокрутки ранее в верхней части или нет. Таким образом, я знаю, нужно ли ему анимировать. – BYossarian

+0

@bradmagnus Кроме того, глядя на тот сайт, с которым вы связались, я думаю, что эффект, который у них есть, на самом деле ближе к этому: http://jsfiddle.net/4DK3F/29/ – BYossarian

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