Carousel
用于横向或纵向浏览一组内容的轮播组件
轮播(Carousel)基于 Embla Carousel 封装,用于在有限空间内展示一组可滑动的图片、卡片或内容面板。
import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, CarouselRoot } from '@skyroc/web-ui';架构说明
Carousel 由根容器、内容轨道、轮播项和前后切换按钮组成。主组件会自动组合这些子组件,也可以按需使用子组件自定义结构。
CarouselRoot:根容器,创建 Embla 实例并通过上下文提供滚动状态与控制方法。CarouselContent:视口与内容轨道容器,连接 Embla 的 viewport ref。CarouselItem:单个 slide,默认占满一屏宽度,可通过 class 调整为多项展示。CarouselNext:下一项按钮,会在无法继续滚动时自动禁用。CarouselPrevious:上一项按钮,会在无法继续滚动时自动禁用。
何时使用
- 需要在一个区域内浏览多张图片、多张卡片或多个推荐项时。
- 需要支持横向、纵向或多项同时露出的内容浏览时。
- 需要通过 Embla
opts或插件扩展滚动行为时。 - 如果内容数量较少且需要同时比较,优先使用普通网格或列表。
基础用法
通过 counts 搭配函数 children 按索引生成轮播项。opts 会透传给 Embla Carousel。
多项展示
通过 classNames.item 调整每个 slide 的 basis,可以让一屏中同时露出多个项目。
垂直方向
设置 orientation="vertical" 后,Carousel 使用纵向滚动轴,键盘方向键也会切换为上下键。
插件
通过 plugins 接入 Embla 插件,例如自动播放、淡入淡出或自定义滚动效果。插件实例会作为数组传给底层 useEmblaCarousel。
<Carousel counts={5} opts={{ loop: true }} plugins={[Autoplay({ delay: 2000 })]}>
{index => <div>{index + 1}</div>}
</Carousel>API
Carousel
通用属性参考:根容器支持原生 div 元素属性,轮播行为由 Embla opts 控制。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| children* | 轮播内容;可传渲染函数或 ReactNode 数组 | CarouselChildren | - |
| className | 根容器 class;存在时优先于 classNames.root | ClassValue | - |
| classNames | 各 slot 的自定义 class(root / contentWrapper / content / item / next / previous) | CarouselUi | - |
| contentProps | 传递给 CarouselContent 的额外 props | CarouselContentProps | - |
| counts | 轮播项数量;使用函数 children 时必填,使用数组 children 时可省略 | number | - |
| itemProps | 传递给每个 CarouselItem 的额外 props | CarouselItemProps | - |
| nextProps | 传递给 CarouselNext 的额外 props | Omit<ButtonProps, 'class'> | - |
| opts | Embla Carousel 配置项 | CarouselOptions | - |
| orientation | 轮播方向 | 'horizontal' | 'vertical' | 'horizontal' |
| plugins | Embla 插件列表 | CarouselPlugin | - |
| previousProps | 传递给 CarouselPrevious 的额外 props | Omit<ButtonProps, 'class'> | - |
| setApi | 接收 Embla API 实例,用于外部程序化控制 | (api: CarouselApi) => void | - |
| size | 尺寸,影响根容器字号、slide 间距和按钮位置 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | - |
子组件
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| CarouselRoot | 根容器,创建轮播上下文并支持原生 div 属性 | CarouselRootProps | - |
| CarouselContent | 视口与内容轨道容器 | CarouselContentProps | - |
| CarouselItem | 单个轮播项,支持原生 div 属性 | CarouselItemProps | - |
| CarouselNext | 下一项按钮,继承 ButtonProps | CarouselNextProps | - |
| CarouselPrevious | 上一项按钮,继承 ButtonProps | CarouselPreviousProps | - |
类型
CarouselProps
主组件属性。继承 CarouselRootProps,并增加内容生成、slot class 和子组件 props 配置。
| 字段 | 类型 | 说明 |
|---|---|---|
| children* | CarouselChildren | 轮播项内容。 |
| className | ClassValue | 根容器 class;存在时优先于 classNames.root。 |
| classNames | CarouselUi | 各 slot 的自定义 class。 |
| contentProps | CarouselContentProps | 内容轨道组件属性。 |
| counts | number | 轮播项数量。函数 children 模式下必填。 |
| itemProps | CarouselItemProps | 轮播项组件属性。 |
| nextProps | Omit<ButtonProps, 'class'> | 下一项按钮属性。 |
| opts | CarouselOptions | Embla 配置项。 |
| orientation | 'horizontal' | 'vertical' | 轮播方向。 |
| plugins | CarouselPlugin | Embla 插件列表。 |
| previousProps | Omit<ButtonProps, 'class'> | 上一项按钮属性。 |
| setApi | (api: CarouselApi) => void | 接收 Embla API 实例。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响样式间距。 |
CarouselRootProps
根容器属性。支持原生 div 属性,并增加 Embla 配置、方向、插件和 API 回调。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 子节点。 |
| className | ClassValue | 根容器 class。 |
| opts | CarouselOptions | Embla 配置项。 |
| orientation | 'horizontal' | 'vertical' | 轮播方向。 |
| plugins | CarouselPlugin | Embla 插件列表。 |
| setApi | (api: CarouselApi) => void | 接收 Embla API 实例。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响根容器字号。 |
CarouselContentProps
内容轨道属性。支持原生 div 属性,并允许单独定制 content 与 contentWrapper slot。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 轮播项节点。 |
| className | ClassValue | 内容外层 viewport class;存在时优先于 classNames.contentWrapper。 |
| classNames | Pick<CarouselUi, 'content' | 'contentWrapper'> | 内容相关 slot class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响轮播项间距。 |
CarouselItemProps
单个轮播项属性,等价于 HTMLComponentProps<"div">。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | slide 内容。 |
| className | ClassValue | 轮播项 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响轮播项间距。 |
CarouselNextProps
下一项按钮属性,继承 ButtonProps。默认 shape="circle"、variant="pure"。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 自定义按钮内容,默认是 ChevronRight 图标。 |
| className | ClassValue | 按钮 class。 |
| disabled | boolean | 手动禁用;无法继续向后滚动时也会自动禁用。 |
| shape | 'auto' | 'rounded' | 'square' | 'circle' | 按钮形状。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 按钮尺寸。 |
| variant | 'solid' | 'outline' | 'dashed' | 'soft' | 'ghost' | 'link' | 'plain' | 'pure' | 按钮视觉样式。 |
CarouselPreviousProps
上一项按钮属性,继承 ButtonProps。默认 shape="circle"、variant="pure"。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 自定义按钮内容,默认是 ChevronLeft 图标。 |
| className | ClassValue | 按钮 class。 |
| disabled | boolean | 手动禁用;无法继续向前滚动时也会自动禁用。 |
| shape | 'auto' | 'rounded' | 'square' | 'circle' | 按钮形状。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 按钮尺寸。 |
| variant | 'solid' | 'outline' | 'dashed' | 'soft' | 'ghost' | 'link' | 'plain' | 'pure' | 按钮视觉样式。 |
CarouselUi
Carousel 全部 slot 的 class 配置。
| 字段 | 类型 | 说明 |
|---|---|---|
| root | ClassValue | 根容器 class。 |
| contentWrapper | ClassValue | 视口外层容器 class。 |
| content | ClassValue | 内容轨道 class。 |
| item | ClassValue | 轮播项 class。 |
| next | ClassValue | 下一项按钮 class。 |
| previous | ClassValue | 上一项按钮 class。 |
CarouselChildren
轮播内容类型
UseCarouselParameters
useEmblaCarousel 参数类型,用于从 Embla hook 中派生配置和插件类型
CarouselApi
Embla Carousel API 实例类型,用于调用 scrollNext、scrollPrev、canScrollNext 等方法
UseEmblaCarouselType
embla-carousel-react 导出的 useEmblaCarousel 返回元组类型