Skyroc UI
数据展示

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。

Preview
Code
Loading...

多项展示

通过 classNames.item 调整每个 slide 的 basis,可以让一屏中同时露出多个项目。

Preview
Code
Loading...

垂直方向

设置 orientation="vertical" 后,Carousel 使用纵向滚动轴,键盘方向键也会切换为上下键。

Preview
Code
Loading...

插件

通过 plugins 接入 Embla 插件,例如自动播放、淡入淡出或自定义滚动效果。插件实例会作为数组传给底层 useEmblaCarousel

<Carousel counts={5} opts={{ loop: true }} plugins={[Autoplay({ delay: 2000 })]}>
  {index => <div>{index + 1}</div>}
</Carousel>

API

通用属性参考:根容器支持原生 div 元素属性,轮播行为由 Embla opts 控制。

属性说明类型默认值
children*轮播内容;可传渲染函数或 ReactNode 数组CarouselChildren-
className根容器 class;存在时优先于 classNames.rootClassValue-
classNames各 slot 的自定义 class(root / contentWrapper / content / item / next / previous)CarouselUi-
contentProps传递给 CarouselContent 的额外 propsCarouselContentProps-
counts轮播项数量;使用函数 children 时必填,使用数组 children 时可省略number-
itemProps传递给每个 CarouselItem 的额外 propsCarouselItemProps-
nextProps传递给 CarouselNext 的额外 propsOmit<ButtonProps, 'class'>-
optsEmbla Carousel 配置项CarouselOptions-
orientation轮播方向'horizontal' | 'vertical''horizontal'
pluginsEmbla 插件列表CarouselPlugin-
previousProps传递给 CarouselPrevious 的额外 propsOmit<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下一项按钮,继承 ButtonPropsCarouselNextProps-
CarouselPrevious上一项按钮,继承 ButtonPropsCarouselPreviousProps-

类型

主组件属性。继承 CarouselRootProps,并增加内容生成、slot class 和子组件 props 配置。

字段类型说明
children*CarouselChildren轮播项内容。
classNameClassValue根容器 class;存在时优先于 classNames.root。
classNamesCarouselUi各 slot 的自定义 class。
contentPropsCarouselContentProps内容轨道组件属性。
countsnumber轮播项数量。函数 children 模式下必填。
itemPropsCarouselItemProps轮播项组件属性。
nextPropsOmit<ButtonProps, 'class'>下一项按钮属性。
optsCarouselOptionsEmbla 配置项。
orientation'horizontal' | 'vertical'轮播方向。
pluginsCarouselPluginEmbla 插件列表。
previousPropsOmit<ButtonProps, 'class'>上一项按钮属性。
setApi(api: CarouselApi) => void接收 Embla API 实例。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'尺寸,影响样式间距。

根容器属性。支持原生 div 属性,并增加 Embla 配置、方向、插件和 API 回调。

字段类型说明
childrenReactNode子节点。
classNameClassValue根容器 class。
optsCarouselOptionsEmbla 配置项。
orientation'horizontal' | 'vertical'轮播方向。
pluginsCarouselPluginEmbla 插件列表。
setApi(api: CarouselApi) => void接收 Embla API 实例。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'尺寸,影响根容器字号。

内容轨道属性。支持原生 div 属性,并允许单独定制 content 与 contentWrapper slot。

字段类型说明
childrenReactNode轮播项节点。
classNameClassValue内容外层 viewport class;存在时优先于 classNames.contentWrapper。
classNamesPick<CarouselUi, 'content' | 'contentWrapper'>内容相关 slot class。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'尺寸,影响轮播项间距。

单个轮播项属性,等价于 HTMLComponentProps<"div">。

字段类型说明
childrenReactNodeslide 内容。
classNameClassValue轮播项 class。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'尺寸,影响轮播项间距。

下一项按钮属性,继承 ButtonProps。默认 shape="circle"、variant="pure"。

字段类型说明
childrenReactNode自定义按钮内容,默认是 ChevronRight 图标。
classNameClassValue按钮 class。
disabledboolean手动禁用;无法继续向后滚动时也会自动禁用。
shape'auto' | 'rounded' | 'square' | 'circle'按钮形状。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'按钮尺寸。
variant'solid' | 'outline' | 'dashed' | 'soft' | 'ghost' | 'link' | 'plain' | 'pure'按钮视觉样式。

上一项按钮属性,继承 ButtonProps。默认 shape="circle"、variant="pure"。

字段类型说明
childrenReactNode自定义按钮内容,默认是 ChevronLeft 图标。
classNameClassValue按钮 class。
disabledboolean手动禁用;无法继续向前滚动时也会自动禁用。
shape'auto' | 'rounded' | 'square' | 'circle'按钮形状。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'按钮尺寸。
variant'solid' | 'outline' | 'dashed' | 'soft' | 'ghost' | 'link' | 'plain' | 'pure'按钮视觉样式。

Carousel 全部 slot 的 class 配置。

字段类型说明
rootClassValue根容器 class。
contentWrapperClassValue视口外层容器 class。
contentClassValue内容轨道 class。
itemClassValue轮播项 class。
nextClassValue下一项按钮 class。
previousClassValue上一项按钮 class。

轮播内容类型

((index: number) => ReactNode) | ReactNode[]

useEmblaCarousel 参数类型,用于从 Embla hook 中派生配置和插件类型

Parameters<typeof useEmblaCarousel>

Embla Carousel 配置项类型,等价于 useEmblaCarousel 的第一个参数

Embla Carousel 插件列表类型,等价于 useEmblaCarousel 的第二个参数

Embla Carousel API 实例类型,用于调用 scrollNext、scrollPrev、canScrollNext 等方法

embla-carousel-react 导出的 useEmblaCarousel 返回元组类型

import('embla-carousel-react').UseEmblaCarouselType

ClassValue

CSS 类名类型

string | null | undefined | Record<string, boolean> | ClassValue[]

On this page