Docs
转盘木马
转盘木马
使用 Embla 构建带有运动和滑动功能的转盘木马。
1
2
3
4
5
关于
此转盘木马组件是使用 Embla Carousel 库构建的。
安装
npx shadcn-ui@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>
示例
尺寸
若要设置项目的大小,您可以在 <CarouselItem />
上使用 basis
实用程序类。
1
2
3
4
5
示例
// 33% 的转盘木马宽度。
<Carousel>
<CarouselContent>
<CarouselItem className="basis-1/3">...</CarouselItem>
<CarouselItem className="basis-1/3">...</CarouselItem>
<CarouselItem className="basis-1/3">...</CarouselItem>
</CarouselContent>
</Carousel>
响应式
// 在小屏幕上为 50%,在大屏幕上为 33%。
<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]
。
**为什么:**我尝试在 <CarouselContent />
上使用 gap
属性或 grid
布局,但需要大量的数学和脑力运算才能获得正确的间距。我发现 pl-[VALUE]
和 -ml-[VALUE]
实用程序更容易使用。
您始终可以在自己的项目中调整它,如果您需要的话。
1
2
3
4
5
示例
<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
<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
Slide 0 of 0
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", () => {
// 在选择时执行某些操作。
})
}, [api])
return (
<Carousel setApi={setApi}>
<CarouselContent>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
<CarouselItem>...</CarouselItem>
</CarouselContent>
</Carousel>
)
}
有关使用事件的更多信息,请参阅 Embla Carousel 文档。
插件
您可以使用 plugins
道具向转盘木马添加插件。
import Autoplay from "embla-carousel-autoplay"
export function Example() {
return (
<Carousel
plugins={[
Autoplay({
delay: 2000,
}),
]}
>
// ...
</Carousel>
)
}
1
2
3
4
5
有关使用插件的更多信息,请参阅 Embla Carousel 文档。