[CHAM] 드래그 슬라이드 만들기

2022. 10. 13. 17:36·개인프로젝트/CHAM
728x90
반응형

처음엔 그냥 swiper에서 긁어올까 생각도 했지만 나중엔 긁어다 쓰더라도 한번은 직접 만들어보고자 직접 만들었다.

슬라이드 또한 재사용성이 가능하도록 슬라이드와 내용물을 따로 컴포넌트화 시켰다.

 

드래그 단계화

드래그를 하는데 우선 3가지 단계로 나누었다.

 1 : MouseDown

 2 : MouseMove

 3 : MouseUp

 

1. MouseDown

index와 left는 state값으로 관리하여 값이 바뀔때마다 rerender 시켜주었다.

먼저 MouseDown으로 드래그를 시작한다는 것을 표시했다.

MouseUp을 했을때 transition을 주고 싶어서 MouseDown과 MouseUp의 transition속성을 따로 관리했다.

const [index, setIndex] = useState(0);
const [left, setLeft] = useState(0);
const slideWrapper = useRef(null);
let posX = 0;
let setDrag = false;
let setMove = 0;
const dragStart = (e) => {
    // 마우스 드래그 할때 오류뜰때 있는데 잡기 위함
    e.preventDefault();
    posX = e.clientX;
    setDrag = true;
    slideWrapper.current.style.transition = "0s";
};

2. MouseMove

드래그 할때는 마우스가 움직인 거리와 똑같이 움직이게끔 설정했다.

const drag = (e) => {
    e.preventDefault();
    if (setDrag === true) {
      setMove = e.clientX - posX;
      slideWrapper.current.style.left = left + setMove + "px";
    }
};

3. MouseUp

const dragEnd = (e) => {
    e.preventDefault();
    slideWrapper.current.style.transition = "1s";

    if (Math.abs(posX - e.clientX) > 200 && setDrag) {
      if (posX > e.clientX && index < length - 1) {
        setIndex((state) => state + 1);
      }
      if (posX < e.clientX && index > 0) {
        setIndex((state) => state - 1);
      }
      if (index === 0) {
        slideWrapper.current.style.left =
          -slideWrapper.current.children[0].getBoundingClientRect().width *
            index +
          "px";
      }
      if (index === +length - 1) {
        slideWrapper.current.style.left =
          -slideWrapper.current.children[0].getBoundingClientRect().width *
            index +
          "px";
      }
    } else {
      slideWrapper.current.style.left =
        -slideWrapper.current.children[0].getBoundingClientRect().width *
          index +
        "px";
    }
    setDrag = false;
  };

슬라이드 안의 내용물 컴포넌트의 width값을 불러오기 위해 getBoundingClientRect 함수를 사용했다.

마우스가 일정범위 움직이지 않으면 넘어가지 않게끔 설정했고 마우스를 놓면 transition 효과를 주기 위해

따로 transition을 넣었다.

 

728x90
반응형

'개인프로젝트 > CHAM' 카테고리의 다른 글

[CHAM] 하위 컴포넌트에서 값 받아오기, 주기  (0) 2022.10.19
[CHAM] image 올리기  (0) 2022.10.14
[CHAM] label 위치 옮기기  (0) 2022.10.12
[CHAM] style.display 적용이 안됨  (0) 2022.10.12
[CHAM] 모달창 만들기  (0) 2022.10.12
'개인프로젝트/CHAM' 카테고리의 다른 글
  • [CHAM] 하위 컴포넌트에서 값 받아오기, 주기
  • [CHAM] image 올리기
  • [CHAM] label 위치 옮기기
  • [CHAM] style.display 적용이 안됨
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    node.js
    블록체인
    하이퍼레저
    CSS
    js
    React
    명령어
    erc20
    ERC721
    30일 챌린지
    go
    go언어
    도커
    nodejs
    컨테이너
    html
    node
    mysql
    30일챌린지
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[CHAM] 드래그 슬라이드 만들기
상단으로

티스토리툴바