ScrollArea
带自定义滚动条的可滚动内容区域
ScrollArea 用于在固定尺寸容器内展示超出范围的内容,并提供一致的自定义滚动条样式。组件基于 Radix Scroll Area 封装,默认组合 Root、Viewport、Scrollbar、Thumb 和 Corner。
import {
ScrollArea,
ScrollAreaRoot,
ScrollAreaScrollbar,
ScrollAreaThumb,
ScrollAreaViewport
} from '@skyroc/web-ui';何时使用
- 内容高度或宽度固定,但内部列表、图片或文本会溢出。
- 需要自定义滚动条视觉,而不是完全依赖浏览器默认滚动条。
- 需要在菜单、侧栏、列表、卡片或预览区域内限制内容尺寸。
- 页面主体滚动优先使用原生滚动;虚拟长列表优先使用 Virtualizer。
纵向滚动
设置固定高度后,默认 orientation="vertical" 会渲染纵向滚动条。
<ScrollArea className="h-72 w-48">
<div>Scrollable content</div>
</ScrollArea>横向滚动
设置 orientation="horizontal" 后,主组件会渲染横向滚动条。内容需要自身产生横向溢出,例如使用 w-max 或 whitespace-nowrap。
<ScrollArea
className="w-96 whitespace-nowrap"
orientation="horizontal"
>
<div className="w-max">Wide content</div>
</ScrollArea>尺寸
通过 size 调整滚动条厚度,从 xs 到 2xl 共 6 个尺寸。
| 尺寸 | 纵向宽度 | 横向高度 | 适用场景 |
|---|---|---|---|
xs | 6px | 6px | 紧凑列表、菜单 |
sm | 8px | 8px | 小型卡片 |
md | 10px | 10px | 常规场景(默认) |
lg | 12px | 12px | 大号内容区 |
xl | 14px | 14px | 展示区、图片列表 |
2xl | 16px | 16px | 触控友好的大滚动条 |
自定义样式
通过 classNames 覆盖内部 slot。常用 slot 包括 root、viewport、scrollbar、thumb 和 corner。
<ScrollArea
classNames={{
scrollbar: 'bg-muted/60',
thumb: 'bg-primary'
}}
>
<div>Content</div>
</ScrollArea>API
ScrollArea
主组件组合 Root、Viewport、Scrollbar、Thumb 和 Corner。当前主组件一次渲染一个方向的 Scrollbar;如果需要同时显示横向和纵向滚动条,可使用结构组件手动组合。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| children | 可滚动内容 | ReactNode | - |
| orientation | 滚动条方向 | 'vertical' | 'horizontal' | 'vertical' |
| type | 滚动条显示策略,透传给 Radix Root | 'auto' | 'always' | 'scroll' | 'hover' | - |
| scrollHideDelay | type 为 hover 时滚动条隐藏延迟 | number | - |
| size | 尺寸,影响滚动条厚度 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'md' |
| className | 根容器 class | ClassValue | - |
| classNames | 各 slot 的自定义 class(root / viewport / scrollbar / thumb / corner) | ScrollAreaUi | - |
| viewportProps | 传递给 ScrollAreaViewport 的额外 props | ScrollAreaViewportProps | - |
| scrollbarProps | 传递给 ScrollAreaScrollbar 的额外 props | ScrollAreaScrollbarProps | - |
| thumbProps | 传递给 ScrollAreaThumb 的额外 props | ScrollAreaThumbProps | - |
结构组件
ScrollArea 也导出结构组件,适合需要同时渲染横向和纵向滚动条,或需要完全控制 DOM 结构时使用。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| ScrollAreaRoot | 根容器,基于 Radix Root | ScrollAreaRootProps | - |
| ScrollAreaViewport | 可滚动内容视口 | ScrollAreaViewportProps | - |
| ScrollAreaScrollbar | 滚动条轨道 | ScrollAreaScrollbarProps | - |
| ScrollAreaThumb | 滚动条拖拽指示器 | ScrollAreaThumbProps | - |
类型
ScrollAreaProps
主组件属性。组合 Root、Viewport 和 Scrollbar props,并增加 slot class 与子组件 props。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 可滚动内容。 |
| orientation | 'vertical' | 'horizontal' | 滚动条方向。 |
| type | 'auto' | 'always' | 'scroll' | 'hover' | 滚动条显示策略。 |
| scrollHideDelay | number | 滚动条隐藏延迟。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 组件尺寸。 |
| className | ClassValue | 根容器 class。 |
| classNames | ScrollAreaUi | slot class 配置。 |
| viewportProps | ScrollAreaViewportProps | 视口属性。 |
| scrollbarProps | ScrollAreaScrollbarProps | 滚动条属性。 |
| thumbProps | ScrollAreaThumbProps | 拖拽指示器属性。 |
ScrollAreaUi
ScrollArea 各 slot 的自定义 class。
| 字段 | 类型 | 说明 |
|---|---|---|
| root | ClassValue | 根容器 class。 |
| viewport | ClassValue | 可滚动视口 class。 |
| scrollbar | ClassValue | 滚动条轨道 class。 |
| thumb | ClassValue | 滚动条 thumb class。 |
| corner | ClassValue | 双向滚动时角落区域 class。 |
ScrollAreaRootProps
根容器属性,继承 Radix ScrollArea Root props,并增加项目 className 类型。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 子节点。 |
| type | 'auto' | 'always' | 'scroll' | 'hover' | 滚动条显示策略。 |
| scrollHideDelay | number | 滚动条隐藏延迟。 |
| dir | 'ltr' | 'rtl' | 文本方向。 |
| className | ClassValue | 根容器 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 继承字段,Root 当前不直接使用。 |
ScrollAreaViewportProps
可滚动视口属性,继承 Radix ScrollArea Viewport props。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 视口内容。 |
| className | ClassValue | 视口 class。 |
| nonce | string | 传给 Radix Viewport 的 nonce。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 继承字段,Viewport 当前不直接使用。 |
ScrollAreaScrollbarProps
滚动条属性,继承 Radix ScrollArea Scrollbar props,并增加项目尺寸和 className 类型。
| 字段 | 类型 | 说明 |
|---|---|---|
| orientation | 'vertical' | 'horizontal' | 滚动条方向。 |
| forceMount | true | 强制挂载滚动条。 |
| className | ClassValue | 滚动条 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 滚动条尺寸。 |
ScrollAreaThumbProps
滚动条 thumb 属性,继承 Radix ScrollArea Thumb props。
| 字段 | 类型 | 说明 |
|---|---|---|
| className | ClassValue | thumb class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 继承字段,Thumb 当前不直接使用。 |