Carousel

Embla를 기반으로 동작과 스와이프가 포함된 캐러셀 컴포넌트예요. 여러 콘텐츠를 슬라이드 형태로 보여주고 싶을 때 유용해요.

출처: 문서

본문

소개 (About)

캐러셀 컴포넌트는 Embla Carousel 라이브러리로 만들어졌어요.

설치 (Installation)

CLI Manual
npx shadcn@latest add carousel

다음 의존성을 설치해요.

npm install embla-carousel-react

아래 코드를 프로젝트에 복사해서 붙여넣어요.

import 경로를 프로젝트 설정에 맞게 수정해요.

사용법 (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]를 사용해요.

**왜 이렇게 쓰나요:** `gap` 속성이나 `grid` 레이아웃을 ``에 사용해보려 했지만, 간격을 맞추려면 계산과 머리 쓰는 일이 많이 필요했어요. `pl-[VALUE]`와 `-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 문서를 참고해요.

더 알아보기 (Learn more)