Анимация div слева направо, а затем справа налево - PullRequest
0 голосов
/ 28 сентября 2019

Я смотрю этот доклад: 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?

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

В видео произошла ошибка.

Это правильный фрагмент кода:

box.addEventListener("click", () => {
  box.style.transform = "translateX(500px)";

  requestAnimationFrame(() => {
    requestAnimationFrame(() => {
      box.style.transition = "transform 1s ease-in-out";
      box.style.transform = "translateX(250px)";
    });
  });
});
0 голосов
/ 28 сентября 2019

Используйте этот setTimeout во втором операторе, в противном случае оба оператора с выполняются один за другим очень быстро, поэтому вы не получили желаемый результат.

<!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";
        setTimeout(function(){
        box.style.transform = "translateX(250px)";
        },1000);
      });
    </script>
  </body>
</html>

последнее утверждение,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...