본문 바로가기
공부

element 이동 완료 추적하기

by 츠키둥구리 2021. 10. 12.

실무에서 에니메이트가 끝나는 그 순간에 이어서 무슨 작업을 하고 싶을 때가 있다.

a라는 요소가 top:0에서 top:100으로 이동되고난 바로 직후, 하고싶은 거라던지 말이다.

 

여태까지는 다른 꼼수로 해당 문제를 우회했었는데

다음과 같은 방법으로 직접적으로 해결했다.

 

 

먼저

setAnimateAndWatch라는 함수에 매개변수를 3개 셋팅한다. 

el: 타겟 elementdirection:여기서는 top,bottom,left,rightvalue:100px이라면 100

 

그리고 내부에서 해당 매개변수를 이용해 로직을 만든 Promise를 리턴한다.코드는 아래와 같다. 목표 위치 도달후, el을 반환해준다.

      const setAnimateAndWatch = (el, direction, value) => {
        const AnimateAndWatchPromise = new Promise((resolve, reject) => {
          const AnimateAndWatch = () => {
            rectEl.style[direction] = `${value}px`;
            const rect = el.getBoundingClientRect();
            if (rect[direction] == value) {
              console.log("목표위치 도달, 추적종료");
              resolve(el);
            } else {
              console.log("추적중");
              console.log(rect);
              requestAnimationFrame(AnimateAndWatch);
            }
          };
          AnimateAndWatch();
        });
        return AnimateAndWatchPromise;
      };

 

 

전체 사용 예시는 아래와 같다.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .rect {
        display: block;
        width: 100px;
        height: 100px;
        transition: 1s;
        position: absolute;
        background: red;
        top: 0;
        left: 200px;
      }
    </style>
  </head>
  <body>
    <div class="rect"></div>
    <button>start</button>
    <script>
      const rectEl = document.querySelector(".rect");
      const btnEl = document.querySelector("button");

      const setAnimateAndWatch = (el, direction, value) => {
        const AnimateAndWatchPromise = new Promise((resolve, reject) => {
          const AnimateAndWatch = () => {
            rectEl.style[direction] = `${value}px`;
            const rect = el.getBoundingClientRect();
            if (rect[direction] == value) {
              console.log("목표위치 도달, 추적종료");
              resolve(el);
            } else {
              console.log("추적중");
              console.log(rect);
              requestAnimationFrame(AnimateAndWatch);
            }
          };
          AnimateAndWatch();
        });
        return AnimateAndWatchPromise;
      };

      btnEl.addEventListener("click", () => {
        const AnimateAndWatch = setAnimateAndWatch(rectEl, "top", 300);
        AnimateAndWatch.then(console.log);
      });
    </script>
  </body>
</html>

 

코드펜 : https://codepen.io/morpheus0725/pen/porvrBz

댓글