Что произойдет после завершения анимации
Одним из распространенных ошибок при реализации эффектов jQuery является предположение, что выполнение следующего метода в цепочке будет ждать завершения анимации.
$("div.hidden").fadeIn(1500).addClass("lookAtMe");
Важно понимать, что .fadeIn()
выше только запускает анимацию. Как только анимация запущена, ее выполнение происходит за счет быстрого изменения CSS-свойств в цикле setInterval()
на JavaScript. Когда вы вызываете .fadeIn()
, он запускает цикл анимации и затем возвращает jQuery-объект, передавая его дальше в .addClass()
, которое в свою очередь добавит стильный класс lookAtMe
, пока цикл анимации только начинается.
Чтобы отложить действие до завершения анимации, вам нужно использовать функцию обратного вызова для анимации. Вы можете указать функцию обратного вызова для анимации в качестве второго аргумента, передаваемого любому из методов анимации, обсуждаемых выше. Для кода выше мы можем реализовать обратный вызов следующим образом:
// Плавно показать все скрытые абзацы; затем добавить к ним стильный класс (правильно с использованием функции обратного вызова для анимации)
$("div.hidden").fadeIn(1500, function () {
// this = DOM-элемент, который только что завершил анимацию
$(this).addClass("lookAtMe");
});
Обратите внимание, что вы можете использовать ключевое слово this для ссылки на DOM-элемент, который анимируется. Также обратите внимание, что функция обратного вызова будет вызываться для каждого элемента в jQuery-объекте. Это означает, что если ваш селектор не возвращает элементов, функция обратного вызова для анимации никогда не будет выполнена! Вы можете решить эту проблему, проверив, вернул ли ваш выбор какие-либо элементы; если нет, вы можете просто сразу выполнить функцию обратного вызова.
// Выполнить функцию обратного вызова, даже если не было элементов для анимации
var someElement = $("#nonexistent");
var cb = function () {
console.log("готово!");
};
if (someElement.length) {
someElement.fadeIn(300, cb);
} else {
cb();
}
Вы можете обновить вкладку Web 8080, чтобы просмотреть веб-страницу.