@qghoul666

Почему не работает первый этап циклической анимации (setInterval) после первой итерации?

Нужно реализовать циклическую анимацию с помощью setInterval, суть в том чтобы окружность двигалась против часовой стрелки по углам страницы увеличивая размер на 15% на каждом этапе (ещё не реализовал, какие есть способы, пока из идей только увеличивать ширину и высоту?) и цикл завершался бы после 5 полных итераций.
Написал 4 функции для каждого этапа и создал переменную для контроля количества пройденных этапов.
Проблемы в том что на первой итерации всё проходит хорошо, а на последующих первый этап не работает, при этом 2-4 этапе проходят успешно (относительно). В чём может быть причина?
Полный код:
<!DOCTYPE HTML>
<html>
<head>
<title>task</title>
<style type="text/css">
.one {
   text-align: center; font-size: 20px; background-color: LightYellow; color: DarkGreen; z-index: 2; position: absolute; top:0px;  border: solid 2px black;
} 
.one {
  width: 10em; 
  margin: 1em auto;
  border-radius: 50%;
}
.one::before {
  content: "";
  display: inline-block;
  vertical-align: middle;
  padding-top: 100%;
}
</style>
</head>
<body>
<div class="one"> 1 </div>
<script>
    let one = document.getElementsByClassName('one')[0];
    let start = Date.now(); 
    let toStop = 0;
    let timer = setInterval(function() {
    let timePass = Date.now() - start;
    if(toStop > 4) {
            clearInterval(timer);
            return;
        } 
    else if (timePass <= 6500 && timePass > 0) { 
        drawLeft(timePass);
    }
    else if (timePass <= 9300 && timePass > 6500) {
        drawBottom(timePass);
    }
    else if (timePass <= 15800 && timePass > 9300) {
        drawRight(timePass);
    }
    else if (timePass <= 18600 && timePass > 15800) {
        drawTop(timePass);
    }
    else if (timePass > 18600) {
        start = Date.now();
        timePass=0;
        toStop++;
    }
    }, 20); 

    function drawLeft(timePass) { one.style.right = timePass / 4 + 'px'; }
    function drawBottom(timePass) { one.style.top = (timePass - 6500) / 4 + 'px'; }
    function drawRight(timePass) { one.style.left = (timePass - 9300) / 4 + 'px'; }
    function drawTop(timePass) { one.style.top = ((timePass - 18600) / 4) * -1 + 'px'; }
    </script>
</body>
</html>
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
LocKing
@LocKing
Не задавай вопросов — не услышишь лжи
Добавьте в функции drawLeft сброс позиции left, т.к. из-за неё не даёт уже возможности блоку менять положение
function drawLeft(timePass) { 
        one.style.right = timePass / 4 + 'px'; 
        one.style.left = 'auto'; 
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 17:06
15000 руб./за проект
19 апр. 2024, в 16:53
1000 руб./за проект
19 апр. 2024, в 16:45
5000 руб./за проект