从左到右然后从右到左的动画div

问题描述 投票:0回答:1

我正在看这个话题: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?

javascript animation dom
1个回答
0
投票

在第二个语句中使用此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>

最后声明,

© www.soinside.com 2019 - 2024. All rights reserved.