본문 바로가기

개발/JavaScript 30

27. Click and Drag

반응형

기본 코드

<!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값을 이용하여 드래그시에 항목이 넘어 갈 수 있도록 지정해준 것이다.

마무리

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

반응형

'개발 > JavaScript 30' 카테고리의 다른 글

29. CountDown Timer  (0) 2017.04.27
28. Video Speed Controller  (0) 2017.04.27
26. Stripe Follow Along Nav  (0) 2017.04.26
25. Event Capture, Propagation, Bubbling and Once  (0) 2017.04.26
24. Sticky Nav  (0) 2017.04.26