125k

Carousel

Embla を使用して構築されたモーションとスワイプを備えたカルーセル。

1
2
3
4
5
import * as React from "react"

import { Card, CardContent } from "@/components/ui/radix/card"

概要

カルーセル コンポーネントは、Embla Carousel ライブラリを使用して構築されています。

インストール

pnpm dlx shadcn@latest add carousel

使用法

import {
  Carousel,
  CarouselContent,
  CarouselItem,
  CarouselNext,
  CarouselPrevious,
} from "@/components/ui/carousel"
<Carousel>
  <CarouselContent>
    <CarouselItem>...</CarouselItem>
    <CarouselItem>...</CarouselItem>
    <CarouselItem>...</CarouselItem>
  </CarouselContent>
  <CarouselPrevious />
  <CarouselNext />
</Carousel>

構成

Carousel を構築するには、次の構成を使用します。

Carousel
├── CarouselContent
│   ├── CarouselItem
│   └── CarouselItem
├── CarouselPrevious
└── CarouselNext

サイズ

項目のサイズを設定するには、<CarouselItem /> の basis ユーティリティ クラスを使用できます。

1
2
3
4
5
import * as React from "react"

import { Card, CardContent } from "@/components/ui/radix/card"
// 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>

間隔

項目間の間隔を設定するには、<CarouselItem /> では pl-[VALUE] ユーティリティを使用し、<CarouselContent /> では負の -ml-[VALUE] を使用します。

1
2
3
4
5
import * as React from "react"

import { Card, CardContent } from "@/components/ui/radix/card"
<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 プロパティを使用して、カルーセルの方向を設定します。

1
2
3
4
5
import * as React from "react"

import { Card, CardContent } from "@/components/ui/radix/card"
<Carousel orientation="vertical | horizontal">
  <CarouselContent>
    <CarouselItem>...</CarouselItem>
    <CarouselItem>...</CarouselItem>
    <CarouselItem>...</CarouselItem>
  </CarouselContent>
</Carousel>

オプション

opts プロパティを使用して、カルーセルにオプションを渡すことができます。詳細については、Embla Carousel ドキュメント を参照してください。

<Carousel
  opts={{
    align: "start",
    loop: true,
  }}
>
  <CarouselContent>
    <CarouselItem>...</CarouselItem>
    <CarouselItem>...</CarouselItem>
    <CarouselItem>...</CarouselItem>
  </CarouselContent>
</Carousel>

API

状態と setApi プロパティを使用して、カルーセル API のインスタンスを取得します。

1
2
3
4
5
スライド 0 / 0
"use client"

import * as React from "react"
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>
  )
}

イベント

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 docs を参照してください。

プラグイン

plugins プロパティを使用して、カルーセルにプラグインを追加できます。

import Autoplay from "embla-carousel-autoplay"
 
export function Example() {
  return (
    <Carousel
      plugins={[
        Autoplay({
          delay: 2000,
        }),
      ]}
    >
      // ...
    </Carousel>
  )
}
1
2
3
4
5
"use client"

import * as React from "react"

RTL

shadcn/ui で RTL サポートを有効にするには、RTL 構成ガイド を参照してください。

١
٢
٣
٤
٥
"use client"

import {

RTL 言語用にカルーセルをローカライズする場合、テキストの方向と一致するように opts プロパティの direction オプションを設定する必要があります。これにより、カルーセルが正しい方向にスクロールするようになります。

<Carousel
  dir={dir}
  opts={{
    direction: dir,
  }}
>
  <CarouselContent>
    <CarouselItem>...</CarouselItem>
    <CarouselItem>...</CarouselItem>
    <CarouselItem>...</CarouselItem>
  </CarouselContent>
  <CarouselPrevious className="rtl:rotate-180" />
  <CarouselNext className="rtl:rotate-180" />
</Carousel>

direction オプションは "ltr" または "rtl" を受け入れ、dir プロパティ値と一致する必要があります。また、rtl:rotate-180 クラスを使用してナビゲーション ボタンを回転して、ボタンが正しい方向を向くようにすることもできます。

API リファレンス

プロパティとプラグインの詳細については、Embla Carousel docs を参照してください。