react-slick를 이용해 캐로셀을 구현해봤습니다.
yarn add react-slick
import styled, { createGlobalStyle } from "styled-components";
1️⃣const Global = createGlobalStyle`
.slick-slide {
display: inline-block;
}
`;
const SlickWrapper = styled.div`
height: calc(100% - 44px);
background: #090909;
`;
const Indicator = styled.div`
text-align: center;
& > div {
width: 75px;
height: 30px;
line-height: 30px;
border-radius: 15px;
background: #313131;
display: inline-block;
text-align: center;
color: white;
font-size: 15px;
}
`;
react-slick
의 기본 클래스인 slick-slide
을 지정해 줍니다. styled-components
를 사용하면 임의로 클래스 이름을 정의하기 때문에 지정된 이름으로 스타일을 하기 위해 createGlobalStyle
을 이용해 Global
컴포넌트로 생성합니다. 이 Global
컴포넌트는 해당 컴포넌트 아무 곳이나 선언하면 됩니다.const ImagesZoom = ({ images, onClose }) => {
1️⃣const [currentSlide, setCurrentSlide] = useState(0);
return (
<SlickWrapper>
<div>
<Slick
2️⃣initialSlide={0} // 초기 인덱스
3️⃣beforeChange={(slide, newSlide) => setCurrentSlide(newSlide)} // 슬라이드 인덱스를 이용해
4️⃣infinite // 무한이 반복
5️⃣arrows={false} // 화살 없애기
6️⃣slidesToShow={1} // 하나씩 보여주기
7️⃣slidesToScroll={1} // 하나씩 스크롤 하기
>
8️⃣{images.map((image) => (
<ImgWrapper key={image.src}>
<img src={image.src} alt={image.src} />
</ImgWrapper>
))}
</Slick>
// 밑에 몇번째 이미지인지 보여주기 위해
9️⃣<Indicator>
<div>
{currentSlide + 1} /{images.length}
</div>
</Indicator>
</div>
</SlickWrapper>
);
};
beforeChange
로 밑에 있는 Indicator
을 매끄럽게 구현합니다. 필요 없다면 afterChange
속성을 사용해도 됩니다.