组件

Scroll Area

一个 React 滚动区域,使用原生滚动,带 Liquid Glass 滚动条与玻璃面板。

ScrollArea 在内部渲染玻璃面板、原生滚动视口、内容容器与自定义滚动条。

原生滚动条会被隐藏。主题滚动条在静止时保持低调,当指针位于区域上方或视口滚动时会变得更明显;只有内容真正溢出时才会渲染。

基础示例

ScrollArea 没有内置高度。通过 className 给根节点设置高度即可创建可滚动视口。下面的示例还传入了 aria-label,它会转发到可滚动视口,而不是仅用于展示的根节点。

横向滚动

设置 orientation="horizontal" 只渲染横向滚动条。宽度超出视口的内容仍可通过触控板、滚轮或键盘滚动。

双轴滚动

使用 orientation="both" 处理二维内容。此时会渲染转角,避免两条滚动条互相重叠。

尺寸与内容

根节点负责玻璃表面。使用 className 控制其宽高、圆角与外部布局。内边距应放在内容内部(如示例所示),这样列表行在需要时也可以贴边排列。

边缘阈值

overflowEdgeThreshold 控制视口距离边缘多近时 data-overflow-* 属性才会变化。下面的示例在滚动 16px 后给出反馈。

The ring appears once the viewport scrolls 16px past the top edge.

无障碍

viewport 只在可滚动时可聚焦,与原生滚动容器行为一致。通过 aria-label 或 aria-labelledby 为区域命名,并用 aria-describedby 提供额外说明。

指针与键盘滚动保持原生行为,自定义滚动条仅是装饰,对辅助技术隐藏。区域命名见可访问性指南。

API 参考

属性类型默认值说明
childrenReactNode—渲染在视口内的可滚动内容。
orientation"vertical" | "horizontal" | "both""vertical"要渲染的滚动条方向。
overflowEdgeThresholdnumber | Partial<{ xStart: number; xEnd: number; yStart: number; yEnd: number }>0将一个边缘标记为溢出前需要越过的像素距离。
aria-labelstring—转发到可滚动视口的无障碍名称。
aria-labelledbystring—为视口提供名称的元素 ID。
aria-describedbystring—为视口提供说明的元素 ID。
renderReactElement | ((props, state) => ReactElement)—替换根元素。
refRef<HTMLDivElement>—转发到根元素的 ref。
classNamestring—合并到根节点的 Tailwind 类;在这里设置高度。
styleCSSProperties—内联样式,合并到与 className 相同的元素。
ui{ root?: ClassValue; glass?: ClassValue; overlay?: ClassValue; viewport?: ClassValue; content?: ClassValue; scrollbar?: ClassValue; thumb?: ClassValue; corner?: ClassValue }—按 data-slot 组织的内部槽位类名。
属性说明
data-orientation表示启用的滚动条方向(horizontal、vertical 或 both)。
data-scrolling用户正在区域内滚动时存在。
data-has-overflow-x内容宽度超出视口时存在。
data-has-overflow-y内容高度超出视口时存在。
data-overflow-x-start横向起点方向存在溢出时存在。
data-overflow-x-end横向终点方向存在溢出时存在。
data-overflow-y-start纵向起点方向存在溢出时存在。
data-overflow-y-end纵向终点方向存在溢出时存在。
data-hovering指针位于区域上方时存在于滚动条上。
data-slot标记内部部件(root、glass、overlay、viewport、content、scrollbar、thumb、corner),用于样式选择。

主题

组件使用共享玻璃材质。可以在父级调整 --ui-glass-* token,用 className 控制布局,并通过 ui 按 data-slot 调整内部槽位。组件级数值位于 src/theme/scroll-area.ts。Token 分层与预设见主题指南。

相关组件

  • Card — 内容可完整容纳时的静态面板。
  • Tabs — 在不同视图之间切换。
  • Drawer — 自带滚动的贴边面板。