跳转到内容

ScrollArea 滚动区域 ​

提供带自定义滚动条的内容区域。

用法 ​

创建纵向滚动区域

组件结构 ​

加粗的是必需部件。

data-scope="scroll-area":root · viewport · content · scrollbar

示例 ​

双轴滚动 ​

同时显示横向和纵向滚动条

横向滚动 ​

只启用横向滚动

边缘渐隐 ​

提示还有更多内容

设计指引 ​

何时使用 ​

  • 统一不同平台的滚动区域样式。
  • 控制滚动条的方向和显示时机。

何时不用 ​

特性 ​

  • 支持横向、纵向和双轴滚动。
  • 支持五种滚动条显示时机。
  • fade 变体在可滚动边缘显示渐隐提示。
  • 触屏设备默认保留原生滚动体验。

组合 ​

最佳实践 ​

  • 根节点应设置明确高度。
  • 内容可滚动时提供渐隐边缘或可见滚动条提示。

反模式 ​

  • 不要让内容决定滚动区域高度。
  • 不要嵌套过多滚动区域。

API 参考 ​

产物 ​

层值
自定义元素<xh-scroll-area>
Vue 组件XhScrollAreaContent XhScrollAreaCorner XhScrollAreaRoot XhScrollAreaScrollbar XhScrollAreaThumb XhScrollAreaTrack XhScrollAreaViewport
组合式函数useScrollArea
状态机无,connect 直接由 props 算属性
皮肤@xihan-ui/styles/scroll-area.css

Props ​

属性类型必填说明
dirDirection排版方向,默认随文档。只影响横轴:RTL 下滚动量的正负、指针位移的方向都要翻转。 必须显式提供:组件不读取计算样式,无法感知从 RTL 祖先继承的方向。
forceVisibleboolean触屏(粗指针)上也绘制自绘滚动条,默认 false:默认交给原生滚动。
hideDelaynumber收起前的等待毫秒(type 为 scroll / hover / scroll-hover 时生效),默认 600。
orientationScrollAreaOrientation归本组件管理的轴,默认 both。
sizeSize尺寸:sm / md / lg,影响滚动条厚度,也是边缘渐隐的带宽。
typeScrollbarType滚动条显示的时机,默认 scroll-hover。
variantScrollAreaVariant形态:plain / fade,默认 plain。

插槽 ​

仅列出带载荷的插槽。

Vue 组件插槽载荷说明
XhScrollAreaRootdefaultScrollAreaRootSlotProps

React 适配器 props ​

只列各组件自己声明的那些:继承自 ComponentPropsWithRef 的 DOM 属性不在其中,根组件上与上面 Props 表同名的也不重复列。Vue 的对应物是上面的插槽表。

React 组件属性类型必填说明
XhScrollAreaRootchildrenSlotChildren<ScrollAreaRootSlotProps>
XhScrollAreaScrollbarorientationOrientation该滚动条管理哪条轴。

状态 ​

公开状态写入 data-state。

部件取值
scrollbar'visible' | 'hidden'
corner'visible' | 'hidden'

connect API ​

getXxxProps() 返回对应部件的宿主属性。

成员类型说明
typeScrollbarType
orientationScrollAreaOrientation
verticalScrollAreaAxisState
horizontalScrollAreaAxisState
draggingAxisOrientation | null正被拖动的轴;未拖动时为 null。
cornerVisibleboolean右下角补丁是否应显示:两条滚动条同时在场才有它的位置。
getRootProps() => T['element']
getViewportProps() => T['element']
getContentProps() => T['element']
getScrollbarProps(props: ScrollAreaScrollbarProps) => T['element']某条轴的滚动条挂载点,同时充当该 scrollbar 的根节点。
getTrackProps(props: ScrollAreaScrollbarProps) => T['element']
getThumbProps(props: ScrollAreaScrollbarProps) => T['element']
getCornerProps() => T['element']交叉口补丁,写在竖条的挂载点中;只有两条都在场时才显示。

无障碍 ​

键盘 ​

规格出处:W3C APG

按键生效条件行为
Tab / Shift+Tab焦点走到滚动区视口带 tabindex=0,键盘用户能停在滚动区上;组件只在这一处动过 Tab 序列
PageUp / PageDownfocus in viewport按视口高度翻页滚动;组件不监听、不拦截
ArrowUp / ArrowDown / ArrowLeft / ArrowRightfocus in viewport逐行/逐列滚动;组件不监听、不拦截
Home / Endfocus in viewport滚到内容两端;组件不监听、不拦截
Space / Shift+Spacefocus in viewport整屏翻页;组件不监听、不拦截

ARIA ​

以下属性由 connect 生成。

部件属性值
scrollbararia-hidden'true'

样式参考 ​

皮肤 ​

@xihan-ui/styles/scroll-area.css 使用 [data-scope="scroll-area"][data-part="root"] 部件选择器,位于 xihan.components 层。覆盖样式使用 xihan.overrides。

数据属性 ​

由 connect 生成;条件不成立时不输出无值属性。

部件属性值
rootdata-dragging''(条件成立时才出现)
rootdata-orientationprops.orientation
rootdata-reveal-modeprops.type
rootdata-sizeprops.size
rootdata-variantprops.variant
viewportdata-at-max-horizontal''(条件成立时才出现)
viewportdata-at-max-vertical''(条件成立时才出现)
viewportdata-at-min-horizontal''(条件成立时才出现)
viewportdata-at-min-vertical''(条件成立时才出现)
viewportdata-lane-horizontal''(条件成立时才出现)
viewportdata-lane-vertical''(条件成立时才出现)
viewportdata-native''(条件成立时才出现)
viewportdata-orientationprops.orientation
viewportdata-sizeprops.size
viewportdata-variantprops.variant
contentdata-orientationprops.orientation
scrollbardata-dragging''(条件成立时才出现)
scrollbardata-gutter''(条件成立时才出现)
scrollbardata-native''(条件成立时才出现)
scrollbardata-orientationaxis
scrollbardata-reveal-modeprops.type
scrollbardata-scrolling''(条件成立时才出现)
scrollbardata-sizeprops.size
scrollbardata-state'visible' | 'hidden'
cornerdata-state'visible' | 'hidden'

CSS 变量 ​

本组件公开覆盖槽由独立皮肤的实际消费位生成;默认来源、作用部件和状态均与 CSS 同源。

变量部件CSS 属性状态默认来源说明
--xh-scroll-area-fade-sizeviewport-webkit-mask-image
mask-image
at-max-horizontal
at-max-vertical
at-min-horizontal
at-min-vertical
not([data-at-max-horizontal])
not([data-at-max-vertical])
not([data-at-min-horizontal])
not([data-at-min-vertical])
size=lg
size=sm
variant=fade
--xh-space-4
--xh-space-6
--xh-space-8
scroll-area 的 viewport 部件 -webkit-mask-image、mask-image 覆盖槽。

动效 ​

动效角色:出现(见动效规范)。

opacity · visibility 走 transition 过渡。时长与缓动读动效令牌,改令牌即改全局节奏。

系统开启减弱动效时由令牌层统一收敛,皮肤不另作判断。

RTL ​

皮肤用逻辑属性排布(inline-start 一族),dir="rtl" 下自动镜像;另有按 dir 分支的规则。

Released under The MIT License