본문 바로가기
React/Disney

Document - row.js(슬라이드 기능 추가)

by hihijh826 2024. 1. 15.
728x90
반응형
SMALL

📍document 란? 

https://developer.mozilla.org/ko/docs/Web/API/Document

 

Document - Web API | MDN

Document 인터페이스는 브라우저가 불러온 웹 페이지를 나타내며, 페이지 콘텐츠(DOM 트리)의 진입점 역할을 수행합니다. DOM 트리는 <body>와 <table> (en-US) 및 여러 다른 요소를 포함합니다. Document는

developer.mozilla.org

- document 객체는 window 객체의 소속이며 웹 페이지 그 자체를 의미 .

- docuemt.getElement :  웹 페이지에 존재하는 html 요소에 접근하고자 할 때 이용

 

📍scrollLeft

- 콘텐츠가 왼쪽 가장가지리에서 부터 스크롤 되는 픽셀 수를 가져오거나 설정 

 

button.onclick = () => {
  document.getElementById("container").scrollLeft += 20;
};

- 이렇게 적으면 왼쪽에서부터 20 씩 스크롤이 움직임 

 

📍innerwidth

 

 

 

 

📍 슬라이드 기능 추가하는 방법

 왼쪽 화살표  누르면 슬라이드 기능으로 영화를 주르륵 볼 수 있도록 

<div className="slider__arrow-left">
<span
className="arrow"
onClick={() => {
document.getElementById(id).scrollLeft -= window.innerWidth - 80;
}}
>
{"<"}
</span>
</div>

 

1. 직접 DOM 조작

document.getElementById(sliderId).scrollLeft -= window.innerWidth - 80;

  <FontAwesomeIcon
            icon={faChevronLeft}
            onClick={() => {
                document.getElementById(sliderId).scrollLeft -= window.innerWidth - 80;
            }}
          />

단점

  • 유지보수성: 스크롤과 페이지 상태 업데이트를 분리하지 않기 때문에, 나중에 기능을 수정하거나 확장할 때 복잡해질 수 있습니다.
  • 재사용성 부족: 이 방식은 스크롤 방향에 따라 다르게 처리해야 할 경우 코드를 여러 번 작성해야 할 수 있습니다.
  • 상태 관리 부족: 페이지 상태를 업데이트하는 코드가 없기 때문에, 현재 페이지를 추적할 수 없습니다.

 

2. 함수로 추상화

const handleScroll = (direction) => {
  const itemListElement = document.getElementById(sliderId);
  const scrollAmount = window.innerWidth - 80;

  if (direction === 'left') {
    itemListElement.scrollLeft -= scrollAmount;
    setCurrentPage((prev) => Math.max(prev - 1, 0)); // 왼쪽으로 스크롤 시 페이지 감소
  } else {
    itemListElement.scrollLeft += scrollAmount;
    setCurrentPage((prev) => Math.min(prev + 1, Math.ceil(itemList.length / itemsPerPage) - 1)); // 오른쪽으로 스크롤 시 페이지 증가
  }
};

장점

  • 구조화: 스크롤과 페이지 상태 업데이트를 하나의 함수로 묶어 코드가 더 구조적이고 명확해집니다.
  • 유지보수성: 나중에 스크롤 기능을 확장하거나 수정할 때, 함수 내부의 로직만 수정하면 됩니다.
  • 재사용성: 같은 로직을 여러 곳에서 사용할 수 있으며, 다양한 방향의 스크롤을 쉽게 처리할 수 있습니다.
  • 상태 관리: 현재 페이지를 상태로 관리하므로, UI에 페이지 번호를 표시하거나 페이지 이동에 따른 로직을 쉽게 추가할 수 있습니다.

단점

  • 약간의 복잡성: 처음에는 함수 정의가 필요하므로, 약간의 복잡성이 추가될 수 있습니다.

 

☑️  ID 설정

위와 같은 것이 한 페이지에 여러개 있을 수 있으므로 Id를 설정 해야함

const Row = ({ title,index}) => {....

// 슬라이드의 ID를 설정
  const sliderId = `itemSlider-${index}`;
// <ItemList id={sliderId} > 해주는 이유
  // document.getElementById(sliderId).scrollLeft += window.innerWidth - 80;
  //위에서 sliderId는 앞서 설정한 ItemList의 ID입니다. 이 코드는 ItemList 요소를 DOM에서 선택하는 역할을 합니다.
  //즉, ItemList를 스크롤하기 위한 참조를 가져오는 것입니다.
  // itemSlider-0, itemSlider-1이 됨 
  // 각 슬라이더가 다른 아이템 리스트를 참조하게 하여, 화살표 클릭 시 올바른 슬라이더가 스크롤되도록 합니다.
  // 만약 설정하지 않으면 아래에 있는 row를 눌렀는데 위애 row가 움직일 수 있음 
728x90
반응형
LIST

'React > Disney' 카테고리의 다른 글

Firebase를 이용한 배포  (0) 2024.02.05
조건부 렌더링 (row.js)  (0) 2024.01.15
Firebase - localStorage  (0) 2024.01.11
Firebase - 로그아웃  (0) 2024.01.11
Firebase - Authentication  (0) 2024.01.10