Основная проблема, вероятно, заключается в том, что $element
является неявной глобальной переменной, поэтому, когда несколько объектов .box имеют анимацию при наведении, идущую одновременно, они наступают на значение друг друга в глобальной переменной. Это должно быть var $element = $(this)
, чтобы правильно сделать его локальной переменной. Или необходимость в этом может быть полностью устранена, как я показал в предложенном мной коде ниже.
Кроме того, функция завершения не вызывается, когда анимация завершается с помощью .stop()
, поэтому, когда вы идете очень быстро, вы, скорее всего, остановите некоторые из ваших анимаций с помощью .stop()
, что приведет к тому, что функции завершения не будут вызываться. В зависимости от ситуации это может быть или не быть проблемой.
Возможно, вы также захотите посетить параметры, которые вы используете для .stop()
, потому что часто вы хотите по крайней мере использовать .stop(true)
, чтобы не только остановить текущую анимацию, но и удалить ее из очереди, чтобы она не действовал позже.
Я бы предложил эту реализацию:
$('.box').hover(function() {
$(this).stop(true).addClass('active').animate({ 'margin-top': '-49px' }, 500);
}, function() {
$(this).stop(true).animate({ 'margin-top': '0' }, 500, function() {
$(this).removeClass('active');
});
});