Что я делаю и что неправильно
Когда я нажимаю кнопку, появляется слайдер. (вот пример того, как он выглядит, не обращать внимания на этот код)
Ползунок показывает анимацию. Когда анимация закончена, я должен включить HTML-страницу, загруженную с сервера. Мне нужно применить HTML в слайдере после анимации, в противном случае анимация остановится (DOM пересчитан).
Мой алгоритм
- Запустите запрос, чтобы HTML отображался внутри слайдера.
- Запустите анимацию
-
Подождите, пока данные будут готовы и, который будет завершен.
Почему? Если я применяю HTML во время анимации, он останавливает анимацию, а новый HTML добавляется в DOM. Поэтому я жду, когда оба закончится до шага 4.
- Применение HTML внутри слайдера
Вот укороченный код:
// Start loading data & animate transition
var count = 0;
var data = null;
++count;
$.get(url, function (res) {
data = res;
cbSlider();
});
// Animation starts here
++count;
$(document).on('transitionend', '#' + sliderId, function () {
$(document).off('transitionend', '#' + sliderId);
cbSlider()
});
function cbSlider() {
--count;
// This condition is only correct when both GET request and animation are finished
if (count == 0) {
// Attempt to enforce the frame to finish (doesn't work)
window.requestAnimationFrame(() => { return });
$('#' + sliderId + ' .slider-content').html(data);
}
}
Подробный вопрос
transitionend
называется слишком ранним. Это делает последний анимированный фрейм слишком длинным (477.2мс) и последний кадр не отображается в событии transitionend
.
Из документации Google я могу сказать вам, что шаг Paint и Composite Пиксельный трубопровод называется после Event(transitionend)
:
Возможно, я слишком задумываюсь над этим.
Как мне обрабатывать такие виды анимаций?
Как я могу подождать, пока анимация будет полностью закончена и отображена?