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
값을 이용하여 드래그시에 항목이 넘어 갈 수 있도록 지정해준 것이다.
마무리
이 또한 웹페이지를 사용할 때 흔하게 보던 이벤트인데, 이렇게 진행되는걸 보니 역시 홈페이지의 별거 아닌것 같은 기능들도 쉽지 않은 것들이라는걸 알았다.
끝.