ScrollArea 滚动区域
ScrollArea 是一个带细滚动条的滚动容器,滚动条浮在内容上方,样子参照 macOS:圆角的滑块在滚动或鼠标移入时淡入,鼠标指向它时变粗(没有可见的轨道),停止滚动大约一秒后淡出。它在所有主题、所有平台上看起来都一样。滚动本身仍是原生的,滚轮、触控板、触摸和键盘都照常工作;另外可以拖动滑块,点击滑块上下的空白处会翻一页。
演示
基础用法
给滚动区域一个高度(或 max-height)。内边距请通过 contentClassName 或 contentStyle 加在内容上,不要加在滚动区域本身,这样滚动条才会贴着边缘。
横向滚动
设置 xScrollable 后,过宽的内容可以左右滚动,并出现横向滚动条。两个方向都溢出时,两条滚动条会在角落处互相让开。
触发方式
默认情况下,鼠标在区域内或正在滚动时显示滚动条。trigger="none" 让滚动条一直显示。
尺寸
size 决定滑块粗细:small 为 5px,medium 为 7px。鼠标指向滚动条或拖动滑块时,两者都会再加粗 3px。
用代码滚动
滚动区域本身就是滚动元素,所以通过 ref 可以直接调用原生的 scrollTo 和 scrollBy,onScroll 收到的也是它的滚动事件。
文本框
<textarea> 自己就是滚动元素,所以用 ScrollAreaTextarea:它包住一个原生 textarea,把同样的滚动条叠在上面。边框、背景、聚焦环放在外层(wrapperClassName),内边距放在 textarea 上(className)。输入、粘贴、受控的 value 变化时,滚动条都会跟着更新。拖动右下角可以把文本框拉高,滚动条会停在拖动把手上方,不会挡住它。
属性
| 名称 | 类型 | 默认值 | 说明 | 版本 |
|---|---|---|---|---|
trigger | hover | none | hover | hover 在鼠标移入时显示滚动条,none 一直显示。滚动或拖动时总会显示。 | 未发布 |
xScrollable | boolean | false | 允许横向滚动,并显示横向滚动条;否则过宽的内容会被裁掉。 | 未发布 |
size | small | medium | medium | 滑块粗细:5px 或 7px,悬停时再加粗 3px。 | 未发布 |
contentClassName | string | undefined | 包裹 children 的元素的类名。 | 未发布 |
contentStyle | CSSProperties | undefined | 包裹 children 的元素的样式。 | 未发布 |
onScroll | (event: UIEvent<HTMLDivElement>) => void | undefined | 区域每次滚动时调用。 | 未发布 |
children | ReactNode | undefined | 要滚动的内容。 | 未发布 |
ScrollArea 也接受原生 div 属性,ref 指向滚动元素本身;需要滚动时直接用元素的 scrollTo 和 scrollBy,不需要组件方法。有内容可滚动时,区域可以获得焦点(tabIndex={0}),键盘用户可以用方向键滚动;请用 aria-label 说明里面是什么内容。自定义滚动条对辅助技术隐藏,辅助技术使用的是原生滚动。
ScrollAreaTextarea 属性
| 名称 | 类型 | 默认值 | 说明 | 版本 |
|---|---|---|---|---|
trigger | hover | none | hover | 同 ScrollArea。 | 未发布 |
size | small | medium | medium | 同 ScrollArea。 | 未发布 |
wrapperClassName | string | undefined | 包住 textarea 和滚动条的外层的类名,边框和背景写在这里。 | 未发布 |
wrapperStyle | CSSProperties | undefined | 外层的样式。 | 未发布 |
其余属性,包括 ref、className、style、value 和 onScroll,都传给原生 textarea。