Circusdei, ваш текущий код намного сложнее, чем нужно.Пожалуйста, прежде чем делать что-то еще, рассмотрите обратные вызовы завершения jQuery и цепочки анимации - см. animate () в документации jQuery .
Чтобы что-то произошло, когда анимация jQuery завершена, нет необходимости ожидать завершения с отдельной setTimeout
;вместо этого укажите «полную» функцию обратного вызова.Например, первый случай может быть переписан следующим образом ...
javascript:
case "top":
slide.animate({top: verticalGutter+'px'}, slideTimeIn, 'easeInOutQuad', function(){
slide.animate({top: (verticalGutter+extraSlide)+'px'}, slideTimeFloat, 'easeOutQuint', function(){
slide.animate({
top: (viewportHeight-slideHeight)+'px',
opacity: 0
}, slideTimeOut);
});
});
break;
Обратите внимание, как функции обратного вызова «что делать, когда он закончен» задаются как последний аргументвнешние две анимации.Самая внутренняя анимация не имеет обратного вызова.
Это (в несколько раз), вместе с устранением ненужных перевода строки, значительно сократит ваш код.Он станет более читабельным и может даже избавиться от неприятного артефакта красных / синих линий в Chrome.
РЕДАКТИРОВАТЬ: На самом деле это может быть еще проще.Поскольку тема последовательных анимаций одинакова во всех трех случаях, jQuery позволяет вам создать цепочку анимации следующим образом:
javascript:
case "top":
slide.animate({
top: verticalGutter+'px'
}, slideTimeIn, 'easeInOutQuad').animate({
top: (verticalGutter+extraSlide)+'px'
}, slideTimeFloat, 'easeOutQuint').animate({
top: (viewportHeight-slideHeight)+'px',
opacity: 0
}, slideTimeOut);
break;
РЕДАКТИРОВАТЬ 2: См. http://pastebin.com/aHxUsL78 чтобы понять, насколько этот код может упроститься.