Вроде все происходит нормально, но если проводить мышкой по элементу быстро вверх и вниз, анимация будет повторятся столько раз, сколько вы провели мышкой вверх и вниз.
Что делать?
в
jQuery
есть такое понятие, как очередь. В очереди помещаются все анимационные эффекты, которые должны произведены на странице. Вот и получается, если наводить три раза мышь, то в очередь записывается, что эффект выполняется три раза последовательно, друг за другом. тут два пути выхода:- воспользоваться методом
stop()
. у него есть два параметра первый -clearQueue
(необязательный). если он имеетtrue
, очищается очередь от всех анимационных эффектов. и второй параметрgotoEnd
(необязательный) - доводит текущий анимационный эффект до конца, после чего вся очередь очищается. для Вашего случая, мне кажется подойдётstop(false, true)
. - и второй, более элегантный способ! есть метод
.queue()
, который позволяет создавать свои очереди и изменять уже существующие. Есть метод.dequeue()
, который позволяет очищать наши (и не только очереди). Как я уже говорил Ваши анимационные эффекты записываются в очередь. Во внутреннюю очередь jQuery, носящую имяfx
. следовательно, именно эту очередь нам и надо очистить. Вот и получаем, что сначала Вам надо добавить в очередь действие, а затем его удалить оттуда.
Значит решение достаточно простое. Если предыдущий эффект не был закончен до наступления нового события наведения - доводим предыдущий эффект до конца, а очередь очищаем. С анимационным эффектом поступаем так: помещаем его в очередь
fx
, делаем необходимые действия, затем удаляем его из очереди .dequeue('fx')
. Этими шагами Вы добьётесь, что очередь всегда будет пуста.
Пример
$(function(){
$('#navigation-text-menu ul li a').hover(function(){
$(this)
.stop(true)
.queue('fx',
function(){
$(this)
.css({'backgroundColor': '#165b95'})
.animate({paddingLeft: '50px'}, 500)
.dequeue('fx');
});
}, function(){
$(this)
.stop(true)
.queue('fx',
function(){
$(this)
.css({'backgroundColor': '#2b2a2a'})
.animate({paddingLeft: '0px' }, 500)
.dequeue('fx');
});
});
});
Отмена выполнения всех анимаций
Установив это свойство в true, вы отключите все анимации, которые можно выполнять с помощью jQuery. Для того, что бы анимации заработали вновь, необходимо установить это свойство обратно в false.
Простой пример:
jQuery.fx.off = true; $('#foo').slideUp().fadeIn(); // вызов этих, и всех последующих анимаций ни к чему не приведет
Комментарии
Отправить комментарий