@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 я и спрятал их снова, когда это было необходимо. Первая итерация срабатывает на ура, т.е. все картинки появились и исчезли в заданном порядке. Но уже вторая и далее итерации начинают лажать. Сначала картинки появляются не через пол секунды, как это было задано, а заметно позже. А через пару итераций вся конструкция вообще превращается в кашу и изображения появляются когда захотят.

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

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

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

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

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

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

Похожие вопросы