轮播
使用 Embla 构建的带有动画和滑动功能的轮播组件。
关于 
轮播组件使用 Embla Carousel 库构建。
安装 
npx shadcn-vue@latest add carousel用法 
<script setup lang="ts">
import {
  Carousel,
  CarouselContent,
  CarouselItem,
  CarouselNext,
  CarouselPrevious,
} from '@/components/ui/carousel'
</script>
<template>
  <Carousel>
    <CarouselContent>
      <CarouselItem>...</CarouselItem>
      <CarouselItem>...</CarouselItem>
      <CarouselItem>...</CarouselItem>
    </CarouselContent>
    <CarouselPrevious />
    <CarouselNext />
  </Carousel>
</template>示例 
尺寸 
要设置项目的尺寸,可以在 <CarouselItem /> 上使用 basis 实用类。
示例
// 33% of the carousel width.
<Carousel>
  <CarouselContent>
    <CarouselItem class="basis-1/3">...</CarouselItem>
    <CarouselItem class="basis-1/3">...</CarouselItem>
    <CarouselItem class="basis-1/3">...</CarouselItem>
  </CarouselContent>
</Carousel>响应式
// 50% on small screens and 33% on larger screens.
<Carousel>
  <CarouselContent>
    <CarouselItem class="md:basis-1/2 lg:basis-1/3">...</CarouselItem>
    <CarouselItem class="md:basis-1/2 lg:basis-1/3">...</CarouselItem>
    <CarouselItem class="md:basis-1/2 lg:basis-1/3">...</CarouselItem>
  </CarouselContent>
</Carousel>间距 
要设置项目之间的间距,我们在 <CarouselItem /> 上使用 pl-[VALUE] 实用类,在 <CarouselContent /> 上使用负 -ml-[VALUE]。
原因: 我尝试在 CarouselContent 上使用 gap 属性或 grid 布局,但要获得正确的间距需要大量的计算和思考。我发现 pl-[VALUE] 和 -ml-[VALUE] 实用类更容易使用。
如果需要,你可以在自己的项目中随时调整这一点。
示例
<template>
  <Carousel>
    <CarouselContent class="-ml-4">
      <CarouselItem class="pl-4">
        ...
      </CarouselItem>
      <CarouselItem class="pl-4">
        ...
      </CarouselItem>
      <CarouselItem class="pl-4">
        ...
      </CarouselItem>
    </CarouselContent>
  </Carousel>
</template>响应式
<template>
  <Carousel>
    <CarouselContent class="-ml-2 md:-ml-4">
      <CarouselItem class="pl-2 md:pl-4">
        ...
      </CarouselItem>
      <CarouselItem class="pl-2 md:pl-4">
        ...
      </CarouselItem>
      <CarouselItem class="pl-2 md:pl-4">
        ...
      </CarouselItem>
    </CarouselContent>
  </Carousel>
</template>方向 
使用 orientation 属性来设置轮播的方向。
<Carousel orientation="vertical | horizontal">
  ...
</Carousel>缩略图 
选项 
可以使用 opts 属性将选项传递给轮播。有关更多信息,请参阅 Embla Carousel 文档。
<template>
  <Carousel
    :opts="{
      align: 'start',
      loop: true,
    }"
  >
    <CarouselContent>
      <CarouselItem>...</CarouselItem>
      <CarouselItem>...</CarouselItem>
      <CarouselItem>...</CarouselItem>
    </CarouselContent>
  </Carousel>
</template>API 
方法 1 
在 <Carousel /> 组件上使用 @init-api 发射方法来设置 API 实例。
方法 2 
可以通过在 <Carousel /> 组件上设置模板引用来访问它。
<script setup>
const carouselContainerRef = ref<InstanceType<typeof Carousel> | null>(null)
function accessApi() {
  carouselContainerRef.value?.carouselApi.on('select', () => {})
}
</script>
<template>
  <Carousel ref="carouselContainerRef">
    ...
  </Carousel>
</template>事件 
可以使用 API 监听事件。要获取 API 实例,请在 <Carousel /> 组件上使用 @init-api 发射方法。
<script setup>
import { nextTick, ref, watch } from 'vue'
import { useCarousel } from '@/components/ui/carousel'
const api = ref<CarouselApi>()
function setApi(val: CarouselApi) {
  api.value = val
}
const stop = watch(api, (api) => {
  if (!api)
    return
  // Watch only once or use watchOnce() in @vueuse/core
  nextTick(() => stop())
  api.on('select', () => {
    // Do something on select.
  })
})
</script>
<template>
  <Carousel @init-api="setApi">
    ...
  </Carousel>
</template>有关使用事件的更多信息,请参阅 Embla Carousel 文档。
插槽属性 
可以使用 v-slot 指令在 <Carousel v-slot="slotProps" /> 组件中获取响应式插槽属性,例如 carouselRef, canScrollNext..Prev, scrollNext..Prev,以扩展功能。
<template>
  <Carousel v-slot="{ canScrollNext, canScrollPrev }">
    ...
    <CarouselPrevious v-if="canScrollPrev" />
    <CarouselNext v-if="canScrollNext" />
  </Carousel>
</template>插件 
可以使用 plugins 属性将插件添加到轮播中。
npm i embla-carousel-autoplay<script setup lang="ts">
import Autoplay from 'embla-carousel-autoplay'
</script>
<template>
  <Carousel
    class="w-full max-w-xs"
    :plugins="[Autoplay({
      delay: 2000,
    })]"
  >
    ...
  </Carousel>
</template>有关使用插件的更多信息,请参阅 Embla Carousel 文档。