Carousel
Carousel (캐러셀)
Embla를 기반으로 동작과 스와이프가 포함된 캐러셀 컴포넌트예요. 여러 콘텐츠를 슬라이드 형태로 보여주고 싶을 때 유용해요.
출처: 문서
본문
소개 (About)
캐러셀 컴포넌트는 Embla Carousel 라이브러리로 만들어졌어요.
설치 (Installation)
npx shadcn@latest add carousel
npm install embla-carousel-react
사용법 (Usage)
import {
Carousel,
CarouselContent,
CarouselItem,
CarouselNext,
CarouselPrevious,
} from "@/components/ui/carousel"
<Carousel>
<CarouselContent>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
</CarouselContent>
<CarouselPrevious />
<CarouselNext />
</Carousel>
예시 (Examples)
크기 (Sizes)
아이템의 크기를 정하려면 <CarouselItem />에 basis 유틸리티 클래스를 사용해요.
// 33% of the carousel width.
<Carousel>
<CarouselContent>
<CarouselItem className="basis-1/3">...</CarouselItem>
<CarouselItem className="basis-1/3">...</CarouselItem>
<CarouselItem className="basis-1/3">...</CarouselItem>
</CarouselContent>
</Carousel>
// 50% on small screens and 33% on larger screens.
<Carousel>
<CarouselContent>
<CarouselItem className="md:basis-1/2 lg:basis-1/3">...</CarouselItem>
<CarouselItem className="md:basis-1/2 lg:basis-1/3">...</CarouselItem>
<CarouselItem className="md:basis-1/2 lg:basis-1/3">...</CarouselItem>
</CarouselContent>
</Carousel>
간격 (Spacing)
아이템 사이의 간격을 정할 때는 <CarouselItem />에 pl-[VALUE] 유틸리티를, <CarouselContent />에 음수 -ml-[VALUE]를 사용해요.
프로젝트에 맞게 필요하다면 언제든 조정할 수 있어요.
<Carousel>
<CarouselContent className="-ml-4">
<CarouselItem className="pl-4">...</CarouselItem>
<CarouselItem className="pl-4">...</CarouselItem>
<CarouselItem className="pl-4">...</CarouselItem>
</CarouselContent>
</Carousel>
<Carousel>
<CarouselContent className="-ml-2 md:-ml-4">
<CarouselItem className="pl-2 md:pl-4">...</CarouselItem>
<CarouselItem className="pl-2 md:pl-4">...</CarouselItem>
<CarouselItem className="pl-2 md:pl-4">...</CarouselItem>
</CarouselContent>
</Carousel>
방향 (Orientation)
orientation 속성으로 캐러셀의 방향을 설정할 수 있어요.
<Carousel orientation="vertical | horizontal">
<CarouselContent>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
</CarouselContent>
</Carousel>
옵션 (Options)
캐러셀에 옵션을 전달하려면 opts 속성을 사용해요. 더 자세한 내용은 Embla Carousel 문서를 참고해요.
<Carousel
opts={{
align: "start",
loop: true,
}}
>
<CarouselContent>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
</CarouselContent>
</Carousel>
API
state와 setApi 속성을 사용하면 캐러셀 API 인스턴스를 얻을 수 있어요.
import { type CarouselApi } from "@/components/ui/carousel"
export function Example() {
const [api, setApi] = React.useState<CarouselApi>()
const [current, setCurrent] = React.useState(0)
const [count, setCount] = React.useState(0)
React.useEffect(() => {
if (!api) {
return
}
setCount(api.scrollSnapList().length)
setCurrent(api.selectedScrollSnap() + 1)
api.on("select", () => {
setCurrent(api.selectedScrollSnap() + 1)
})
}, [api])
return (
<Carousel setApi={setApi}>
<CarouselContent>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
</CarouselContent>
</Carousel>
)
}
이벤트 (Events)
setApi에서 얻은 api 인스턴스로 이벤트를 들을 수 있어요.
import { type CarouselApi } from "@/components/ui/carousel"
export function Example() {
const [api, setApi] = React.useState<CarouselApi>()
React.useEffect(() => {
if (!api) {
return
}
api.on("select", () => {
// Do something on select.
})
}, [api])
return (
<Carousel setApi={setApi}>
<CarouselContent>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
</CarouselContent>
</Carousel>
)
}
이벤트 사용에 대한 자세한 내용은 Embla Carousel 문서를 참고해요.
플러그인 (Plugins)
plugins 속성을 사용하면 캐러셀에 플러그인을 추가할 수 있어요.
import Autoplay from "embla-carousel-autoplay"
export function Example() {
return (
<Carousel
plugins={[
Autoplay({
delay: 2000,
}),
]}
>
// ...
</Carousel>
)
}
플러그인 사용에 대한 자세한 내용은 Embla Carousel 문서를 참고해요.