В отличие от опубликованных ответов, я бы не рекомендовал использовать window.setTimeout
, поскольку это не гарантирует, что таймеры синхронизируются c с конечными событиями анимации, которые иногда выгружаются в графический процессор. Если вы хотите быть более уверенным, , вам следует прослушать событие animationend
и разрешить его в самом обратном вызове, то есть:
let move_box_one = () => {
return new Promise((resolve, reject) => {
const el = document.getElementById('div_one');
const onAnimationEndCb = () => {
el.removeEventListener('animationend', onAnimationEndCb);
resolve();
}
el.addEventListener('animationend', onAnimationEndCb)
el.style.animation = 'move 3s forwards';
});
}
Более того, поскольку вы пишете несколько дублированных логик c для обоих блоков, вы можете абстрагировать все это в обобщенную c функцию, которая возвращает обещание:
// We can declare a generic helper method for one-time animationend listening
let onceAnimationEnd = (el, animation) => {
return new Promise(resolve => {
const onAnimationEndCb = () => {
el.removeEventListener('animationend', onAnimationEndCb);
resolve();
}
el.addEventListener('animationend', onAnimationEndCb)
el.style.animation = animation;
});
}
let move_box_one = async () => {
const el = document.getElementById('div_one');
await onceAnimationEnd(el, 'move 3s forwards');
}
let move_box_two = async () => {
const el = document.getElementById('div_two');
await onceAnimationEnd(el, 'move 3s forwards');
}
Кроме того, ваш move_boxes
функция немного запутанная. Если вы хотите запускать отдельные анимации перемещения ящиков асинхронно, объявите их как асинхронный метод c и просто ждите вызовов отдельных функций перемещения ящиков, например:
let move_boxes = async () => {
await move_box_one();
await move_box_two();
}
move_boxes().then(() => console.log('boxes moved'));
См. Пример проверки концепции ( или вы можете видеть это из этого JSFiddle, который я разветвил из вашего исходного):
// We can declare a generic helper method for one-time animationend listening
let onceAnimationEnd = (el, animation) => {
return new Promise(resolve => {
const onAnimationEndCb = () => {
el.removeEventListener('animationend', onAnimationEndCb);
resolve();
}
el.addEventListener('animationend', onAnimationEndCb)
el.style.animation = animation;
});
}
let move_box_one = async () => {
const el = document.getElementById('div_one');
await onceAnimationEnd(el, 'move 3s forwards');
}
let move_box_two = async () => {
const el = document.getElementById('div_two');
await onceAnimationEnd(el, 'move 3s forwards');
}
let move_boxes = async () => {
await move_box_one();
await move_box_two();
}
move_boxes().then(() => console.log('boxes moved'));
#div_one {
width: 50px;
height: 50px;
border: 10px solid red;
}
#div_two {
width: 50px;
height: 50px;
border: 10px solid blue;
}
@keyframes move {
100% {
transform: translateX(300px);
}
}
@keyframes down {
100% {
transform: translateY(300px);
}
}
<div id="div_one"></div>
<div id="div_two"></div>