클릭하면 이동하는 상자 만들기

라용·2023년 5월 5일
0

코딩애니메이션 기초 강의를 듣고 있다. 오랜만에 다시 코딩을 하니 나름 재미도 있고, 예전에 했던 것들이 새록새록 생각나 복습하는 느낌도 든다. 기본적인 것들이지만, 기록하지 않으면 또 잊어버릴 거 같아 정리해둔다.
이번에 한 것은 박스가 우측으로 이동하는데, 클릭하면 멈추고, 다시 클릭하면 이동하는 애니메이션이다.

우선 html, css 파일을 준비하고

// html

<!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>
    <link rel="stylesheet" href="style.css" />
  </head>
  <div id="box"></div> // 움직일 박스 
  <body>
  </body>
</html>

// css

body {
  padding: 0;
  margin: 0;
}

#box {
  position: absolute;
  background-color: blue;
  width: 100px;
  height: 100px;
}

스크립트 태그를 작성한다. 우선 변수는 네가지

let box = document.getElementById("box"); // 박스를 id 값으로 선택하고
let xPos = 0; // x 좌표 값으로 사용할 숫자 변수를 만들고
let isSel = false; // 버튼 클릭시 온오프로 사용할 불린 변수를 만들고
let myAnimation = window.requestAnimationFrame(onAnimate);
// 애니메이션을 담은 변수를 만든다. 여기서 requestAnimationFrame 은 1초에 60frame 씩 동작하게 하는 윈도우 객체의 내장함수다. onAnimate 는 만들어줘야할 함수

우선 onAnimate 함수를 정의해준다. xPos 변수가 1씩 증가하고, 그 값이 box 의 left 값으로 계속 적용되어 좌표가 변경된다. 그리고 에니베이션 함수를 넣어주고

function onAnimate() {
  xPos += 1;
  box.style.left = xPos + "px";
  myAnimation = window.requestAnimationFrame(onAnimate);
}

클릭에 따라 동작하고 멈추고를 해주려면, 우선 이벤트 리스너를 연결하고 onClick 함수를 만들어준다. isSel 값으로 분기 처리를 해주고, 이때 cancelAnimationFrame 을 사용해서 애니메이션 동작을 멈출 수 있다.

box.addEventListener("click", onClick);

function onClick(e) {
if (isSel == false) {
    isSel = true;
    cancelAnimationFrame(myAnimation);
} else {
    isSel = false;
    myAnimation = window.requestAnimationFrame(onAnimate);
}
}

전체 코드는 아래와 같다.

<!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>
    <link rel="stylesheet" href="style.css" />
  </head>
  <div id="box"></div>
  <body>
    <script>
      let box = document.getElementById("box");
      let xPos = 0;
      let isSel = false;
      let myAnimation = window.requestAnimationFrame(onAnimate);

      box.addEventListener("click", onClick);

      function onClick(e) {
        if (isSel == false) {
          isSel = true;
          cancelAnimationFrame(myAnimation);
        } else {
          isSel = false;
          myAnimation = window.requestAnimationFrame(onAnimate);
        }
      }

      function onAnimate() {
        xPos += 1;
        box.style.left = xPos + "px";
        myAnimation = window.requestAnimationFrame(onAnimate);
      }
    </script>
  </body>
</html>

애니메이션 부르럽게 주는 방법 팁, 요즘은 라이브러리를 활용하면 되는데, 예전에는 아래처럼 쓰기도 했음

box.style.left = box.offsetLeft + (xPos - box.offsetLeft) * 0.1 + "px";
profile
Today I Learned

0개의 댓글