@ForSureN1
frontend dev

Как зациклить setTimeOut?

Добрый день, пишу простенький preloader, есть мыльные пузырьки, в тегах img, все они лежат в одном dive, то есть есть массив с пузырями, так вот, мне нужно чтобы поочередно добавлялся класс от первого к последнему, с этим я справился, так же справился с тем, чтобы одновременно все классы удалились с анимацией, но вот как теперь это все зациклить я не могу понять, заранее благодарю.
let preloadImg = document.querySelectorAll('.pr-bub');

let arrayBub = Array.from(preloadImg)

let reverseArray = arrayBub.reverse();

reverseArray.forEach((bub, index, array) => {
    setTimeBub(bub, index);
    if ((index + 1) == array.length) {
        setTimeout(() => {
            reverseArray.forEach(item => {
                item.classList.remove('animationPreBub')
            })
            setTimeBub(bub, index);
        }, 300 * index)
    }
})

function setTimeBub(bub, index) {
    setTimeout(() => {
        bub.classList.add('animationPreBub')
    }, 300 * index)
}
  • Вопрос задан
  • 241 просмотр
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
const preloadImages = document.querySelectorAll('.pr-bub');
const preloadImagesAnimationInterval = setInterval((state) => {
    const item = preloadImages[state.index];
    item.classList.toggle('animationPreBub', state.addClass);
    state.index--;
    if (state.index < 0) {
        state.addClass = !state.addClass;
        state.index = preloadImages.length - 1;
    }
}, 300, {
    addClass: true,
    index: preloadImages.length - 1,
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ForSureN1 Автор вопроса
frontend dev
Разобрался собственно сам, запутался в вызовах тайм аута, и вынес в отдельную функцию которая при index === array.lenght очищает все классы, и опять же вызывает сама себя :)
let preloadImg = document.querySelectorAll('.pr-bub');

let arrayBub = Array.from(preloadImg)

let reverseArray = arrayBub.reverse();

function setClassBub() {
    reverseArray.forEach((bub, index) => {
        setTimeout(() => {
            bub.classList.add('animationPreBub')
            if (index === (reverseArray.length - 1)) {
                setTimeout(() => {
                    reverseArray.forEach((item) => {
                        item.classList.remove('animationPreBub')
                    })
                }, 200)

                setClassBub();
            }
        }, 300 * (index + 1))
    })
}

setClassBub();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы