서론
- 케러셀을 반응형으로 구현하기 위해서 style파일 뿐만 아니라 tsx파일에서도 브라우저의 넓이가 필요했기 때문에
window.innerWidth
를 사용하여 브라우저의 넓이를 받아와서 반응형으로 구현했습니다.
// ImageSlider.tsx const [winX, setWinX] = useState(window.innerWidth); const resizeWindow = () => { setWinX(window.innerWidth); }; useEffect(() => { window.addEventListener('resize', resizeWindow); return () => { window.removeEventListener('resize', resizeWindow); }; }, []);
- 제가 구현한것은 기존에는 현재의 index + 1, index + 2, index + 3인 Card에 active 속성을 true로 할당해서 가운데 3개의 카드만 정상적인 색상으로 출력되도록 하는 것 입니다.

- 반응형을 위해서 브라우저의 넓이가 1280px 이하일 때는 현재의 index만 정상적인 색상으로 출력되도록 하였습니다.

const isActive = (idx: number) => { if (winX <= 1280) { return currentIndex + 2 === idx + 1; } for (let i = 1; i <= 3; i++) { if ((currentIndex + i) % (bookmarkCount + 1) === idx) { return true; } } return false; }; return ( <S.SliderContainer> <S.CardList ref={sliderRef}> {bookmarks.map((cardInfo, idx) => ( <S.CardWrapper key={cardInfo.id * idx + 1} active={isActive(idx)}> <Card data={cardInfo} /> </S.CardWrapper> ))} </S.CardList> </S.SliderContainer> )

- next.js에서는 SSR을 지원하고 SSR에서는 window 객체가 없기 때문에 not defined 에러가 발생하게 됩니다.
- 이를 해결하기 위해 3가지 방법을 사용할 수 있지만 간단하게 사용할 수 있는 useEffect를 사용하여 해결하였습니다.
- useEffect는 DOM이 생성된 뒤에, 즉 마운트 된 이후에 실행되기 때문에, useEffect에서 window 객체를 호출하여 해결했습니다.
const [winX, setWinX] = useState(1440); // 기본값은 원하는 넓이로 useEffect(() => { setWinX(window.innerWidth); }, []);