고지가 멀지 않았습니다! 얼른 30개 마치는 날이 기다려지네요..!
오늘은 Day 27 project를 정리해보려고 합니다.
정리할 주제는 블로그나 게시물 정리할때 흔히 보여서 자주 사용되는 기능입니다!
click
후drag
하여 게시물을 움직인다.
가로로 overflow 된 게시물을 클릭 드래그 하여 움직이게 하는 기능입니다!
const slider = document.querySelector(".items");
let isDown = false;
let startX;
let currentScrollLeft;
slider.addEventListener("mousedown", (e) => {
isDown = true;
slider.classList.add("active");
startX = e.pageX - slider.offsetLeft;
currentScrollLeft = 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;
slider.scrollLeft = currentScrollLeft - walk;
})
상단에 있는 코드에느 크게 4개의 eventListener
가 존재합니다.
mousedown
이벤트 : click
했을때의 마우스 위치 정보를 저장하고 관리합니다.mousemove
이벤트 : 본격적으로 게시물을 이동시킵니다. 1번에서 수집한 정보를 토대로 움직여요.mouseleave
이벤트 : 게시물에서 마우스가 벗어나면 drag
이벤트를 끝냅니다.mouseup
이벤트 : 3번과 동일해요이렇게 총 4개의 이벤트로 구성되어 있습니다. 하나하나 설명해볼게요
const slider = document.querySelector(".items");
let isDown = false;
let startX;
let currentScrollLeft;
slider
: 게시물이 있는 div
태그입니다.isDown
: 마우스가 클릭했을때 true
값을 가지는 flag입니다.startX
: 중요한 정보에요! click
하고 drag
를 하는 기능에서, click
을 했을 때 그 위치를 담고 있어요. 즉, 게시물을 기준으로 x좌표값입니다.currentScrollLeft
: 이 친구도 중요해요. 게시물이 가로로 긴 형태인데, 왼쪽으로부터 scroll 되어 있는 값이에요. 이 변수로 게시물을 움직입니다.mousedown
이벤트slider.addEventListener("mousedown", (e) => {
isDown = true;
slider.classList.add("active");
startX = e.pageX - slider.offsetLeft;
currentScrollLeft = slider.scrollLeft;
})
일단 mousedown
이벤트니 isDown
은 true
값을 가집니다.
active
클래스가 추가되면 scale
효과가 부여됩니다. css
효과입니다.
startX = e.pageX - slider.offsetLeft; currentScrollLeft = slider.scrollLeft;
상단에 2줄이 가장 핵심입니다.
startX
는 드래그하기 전에 클릭했을 때 e.pageX - slider.offsetLeft
의 값으로, 게시물을 기준으로의 (클릭했을 때) x 좌표를 가지고 있어요.
currentScrollLeft
는 클릭했을 때의 왼쪽으로부터 게시물이 얼마나 스크롤 되어있는지 초기값을 가지고 있겠죠!
mousemove
이벤트slider.addEventListener("mousemove", (e) => {
if(!isDown) return;
e.preventDefault();
const x = e.pageX - slider.offsetLeft;
const walk = x - startX;
slider.scrollLeft = currentScrollLeft - walk;
})
isDown
은 마우스가 클릭한 상태가 아니라면 false
로, 아무 반응 없이 return 합니다.
x
변수는 마우스가 클릭한 상태로 움직일때마다 e.pageX - slider.offsetLeft
값을 저장하여 게시물내에서 x좌표를 저장합니다.
walk
변수는 x
에서 startX
를 빼줍니다. 즉, 마우스를 움직일때마다 처음 클릭했을때, 초기 x좌표를 빼줍니다! 그 값을 사용하여 scrollLeft
를 조정해요.
똑같이 currentScrollLeft
에서 walk
를 빼줘서 그 값으로 slider.scrollLeft
프로퍼티를 조정해 게시물을 이동시켜요.
설명이 어려워서 그림으로 준비해봤어요!
약간 복잡하지만, 수학적인 지식이 가미되면 이해하기 쉬울겁니다 :)
마우스가 움직이는 모든 순간마다 currentScrollLeft
에서 walk
를 빼줘서, 이 값을 slider
의 scrollLeft
값으로 할당시켜 움직이게 합니다.
mouseleave
, mouseup
이벤트이 두개의 이벤트는 같습니다!
slider.addEventListener("mouseleave", () => {
isDown = false;
slider.classList.remove("active");
})
slider.addEventListener("mouseup", () => {
isDown = false;
slider.classList.remove("active");
})
단순히 isDown
변수를 false
로 바꾸주고 active
클래스를 제거합니다.
이렇게 오늘 주제인 게시물 클릭 앤 드래그를 정리해보았어요!
언젠가 포트폴리오 사이트를 만들때 쓰일 것 같아요!
틀린내용이나 수정할 내용이 있다면 언제든지 피드백 부탁드립니다!
감사합니다!🤗
총총!