개발/JavaScript 30

27. Click and Drag

Sangminnn 2017. 4. 26. 23:46
반응형

기본 코드

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Click and Drag</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <div class="items">
    <div class="item item1">01</div>
    <div class="item item2">02</div>
    <div class="item item3">03</div>
    <div class="item item4">04</div>
    <div class="item item5">05</div>
    <div class="item item6">06</div>
    <div class="item item7">07</div>
    <div class="item item8">08</div>
    <div class="item item9">09</div>
    <div class="item item10">10</div>
    <div class="item item11">11</div>
    <div class="item item12">12</div>
    <div class="item item13">13</div>
    <div class="item item14">14</div>
    <div class="item item15">15</div>
    <div class="item item16">16</div>
    <div class="item item17">17</div>
    <div class="item item18">18</div>
    <div class="item item19">19</div>
    <div class="item item20">20</div>
    <div class="item item21">21</div>
    <div class="item item22">22</div>
    <div class="item item23">23</div>
    <div class="item item24">24</div>
    <div class="item item25">25</div>
  </div>

<script>
</script>

  </body>
</html>

목표

클릭 후 드래그 시에 화면이 좌우로 움직일 수 있도록 이벤트를 설정해보자.

코드 분석

  const slider = document.querySelector('.items');
  let isDown = false;
  let startX;
  let scrollLeft;

늘 그렇듯이 먼저 사용할 변수에 대해서 선언해준다.
여기서 isDown이라는 내용은 마치 전류가 흘러들어올때만 회로를 연결해주어 전기가 통할 수 있도록 해주는 스위치 (?)처럼 클릭을 하고서 움직여야만 원하는 내용이 실행될 수 있도록 해주는 스위치같은 역할이다. 이 부분에 대해서는 진행하면서 다시 짚어보도록 하겠다.

slider.addEventListener('mousedown', (e) => {
    isDown = true;
    slider.classList.add('active');
    startX = e.pageX - slider.offsetLeft;
    scrollLeft = slider.scrollLeft;
  });
    slider.addEventListener('mouseleave', () => {
    isDown = false;
    slider.classList.remove('active');
  });
    slider.addEventListener('mouseup', () => {
    isDown = false;
    slider.classList.remove('active');
  });

  slider.addEventListener('mousemove', (e) => {
    if (!isDown) return;  
    e.preventDefault();
    const x = e.pageX - slider.offsetLeft;
    const walk = (x - startX) * 3;
    slider.scrollLeft = scrollLeft - walk;
  });

이번 챕터는 진행될 이벤트 안에 속성이 다 들어가있다.
이벤트리스너에서 보면 알 수 있듯이, 먼저 isDown true값을 주고, 미리 지정해놓은 active를 클래스리스트에 추가해주어 변화가 생기도록 해준다. 그리고 아래의 내용은 마지막 이벤트 리스너의 설명에서 계속 하겠다.

그 아래의 mouseleave, mouseup의 이벤트리스너는 위에서 언급한 것 처럼 isDown false값으로 바꾸어 준다.

이제 위에서부터 언급했던 스위치의 역할을 보자.

mousemove의 내용을 보면, isDown의 값이 false일 경우에는 더이상 진행하지않고 바로 리턴하는 것을 지정해두었다.
즉, mouseleave, mouseup이 발생할 경우 더 이상의 내용은 진행되지 않는다.
그리고 isDown true값인 mouseDown에서는 미리 선언해 놓은 startX scrollLeft값을 이용하여 드래그시에 항목이 넘어 갈 수 있도록 지정해준 것이다.

마무리

이 또한 웹페이지를 사용할 때 흔하게 보던 이벤트인데, 이렇게 진행되는걸 보니 역시 홈페이지의 별거 아닌것 같은 기능들도 쉽지 않은 것들이라는걸 알았다.
끝.

반응형