@Vasya-prijevalskij

Как правильно анимировать элементы при помощи setInterval?

Всем привет
Столкнулся с такой проблемой:
Хочу анимировать несколько изображений поочередно. Суть анимации состоит в том, что изначально все изображения скрыты (visibility:hidden), но по истечению определенного времени, каждое изображение по порядку получает через js (visibility:visible) и появляется на странице, а потом снова исчезает. Т.е. например, изображение первое появляется через 2 сек после загрузки страницы, второе появляется через 2.5, а через 3 сек пропадает, третье изображение появляется через 3 сек (т.е. как пропало второе), и через 3.5 сек пропадает, четвертое появляется через 3,5 сек и через 4 пропадает. Также через 4 сек исчезает и первое изображение. В общем, такая анимация в виде лесенки некой, что-ли.

Написал функцию, которая добавляет visibility:visible методом setInterval к каждой картинке по отдельности. Т.е setInterval через 2 сек показал первую картинку, через 2,5 вторую, через 3 сек третью и тд. Также методом setInterval я и спрятал их снова, когда это было необходимо. Первая итерация срабатывает на ура, т.е. все картинки появились и исчезли в заданном порядке. Но уже вторая и далее итерации начинают лажать. Сначала картинки появляются не через пол секунды, как это было задано, а заметно позже. А через пару итераций вся конструкция вообще превращается в кашу и изображения появляются когда захотят.

В общем, всю голову сломал, а сделать не сделал. Надо чтобы изображения появлялись в строго заданном промежутке времени, исчезали также, а потом снова появлялись через тот же промежуток времени и так до бесконечности.

Если кто-то делал подобное, поделитесь, пожалуйста, кодом и подскажите куда копать.
  • Вопрос задан
  • 139 просмотров
Решения вопроса 2
dollar
@dollar
Делай добро и бросай его в воду.
...методом setInterval к каждой картинке по отдельности...

Вот здесь просчёт.

Нужно отсчитывать временной интервал следующей картинки от предыдущей, а не от общего начала. Потому что на самом деле нет гарантии, сколько времени будет длится очередной таймаут. Если вы укажете 500мс, то это лишь означает не менее 500с, а в теории может быть и 1 сек, и 2 сек, и вообще сколько угодно. И чем дольше анимация, тем больше накапливается мелких ошибок, и тем заметнее визуальный рассинхрон.

Подойдёт единый setInterval с общей логикой внутри. Либо цепочка из setTimeout, в которой одновременно запланирован только один.
Ответ написан
@Vasya-prijevalskij Автор вопроса
На email пришло уведомление о том, что кто-то ответил на вопрос и посоветовал библиотеку GSAP, но в этой ветке я почему-то ответа найти этого не могу
GSAP - отличная библиотека и я решил с её помощью свою проблему. Чекайте, рекомендую. Автору совета большое спасибо
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 11:14
65000 руб./за проект
19 апр. 2024, в 11:08
5000 руб./за проект
19 апр. 2024, в 10:59
150000 руб./за проект