Я смотрю этот доклад: https://www.youtube.com/watch?v=cCOL7MC4Pl0
Докладчик рассказывает о задачах JS и рендеринге DOM.Он приводит следующий пример:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Task</title>
<style>
* {
box-sizing: border-box;
}
.box {
width: 50px;
height: 50px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box"></div>
<script>
var box = document.querySelector(".box");
box.addEventListener("click", () => {
box.style.transform = "translateX(500px)";
box.style.transition = "transform 1s ease-in-out";
box.style.transform = "translateX(250px)";
});
</script>
</body>
</html>
И пытается анимировать объект (по событию щелчка) от позиции 0 до позиции 500px, а затем от 500px до 250px.Другими словами, слева направо и справа до середины.
Он использует следующий код:
var box = document.querySelector(".box");
box.addEventListener("click", () => {
box.style.transform = "translateX(500px)";
box.style.transition = "transform 1s ease-in-out";
box.style.transform = "translateX(250px)";
});
Затем он объяснил, почему это не сработало, как ожидалось - потому чтобраузер будет делать все расчеты перед рендерингом / выполнением анимации.Здесь все хорошо.
Однако он говорит, что решает проблему, заключая последний box.style.transform = "translateX(250px)";
в двойной (вложенный) requestAnimationFrame()
вызов.Когда я попытался это сделать, он сделал точно так же, как и раньше .Это не сработало.Вот код:
box.style.transform = "translateX(500px)";
box.style.transition = "transform 1s ease-in-out";
requestAnimationFrame(() => {
requestAnimationFrame(() => {
box.style.transform = "translateX(250px)";
});
});
Что мне здесь не хватает?Как заставить браузер сначала выполнить операцию преобразования до 500px, а затем преобразовать его обратно в 250px?