React Bootstrap logoReact Bootstrap

ScrollShadow

基础布局

基于 Bootstrap 5 的滚动阴影组件,在可滚动容器的边缘叠加渐变阴影提示剩余内容,支持垂直/水平/双向滚动、阴影尺寸与颜色自定义、可见性变化回调、RTL 布局,以及 useScrollShadow Hook 自定义组合

Component Demo

Basic usage and examples of the ScrollShadow component

基础用法

  • 1 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 2 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 3 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 4 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 5 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 6 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 7 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 8 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 9 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 10 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 11 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

  • 12 条消息

    向上或向下滚动容器,顶部和底部的阴影会随滚动位置自动淡入淡出,提示对应方向还有更多内容。

ScrollShadow 默认跟踪垂直方向:内部渲染一个 overflow-y: auto 的滚动容器,顶部阴影表示上方还有内容,底部阴影表示下方还有内容,滚动到两端时对应阴影自动淡出

横向滚动

卡片 #1

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #2

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #3

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #4

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #5

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #6

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #7

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #8

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #9

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #10

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #11

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

卡片 #12

横向滚动容器,观察左右两端的阴影随滚动位置的变化。

direction="horizontal" 时跟踪左右两端:内部容器 overflow-x: auto、overflow-y: hidden,内容宽度超过容器宽度后即可横向滚动

双向滚动

12345678
R1 C1R1 C2R1 C3R1 C4R1 C5R1 C6R1 C7R1 C8
R2 C1R2 C2R2 C3R2 C4R2 C5R2 C6R2 C7R2 C8
R3 C1R3 C2R3 C3R3 C4R3 C5R3 C6R3 C7R3 C8
R4 C1R4 C2R4 C3R4 C4R4 C5R4 C6R4 C7R4 C8
R5 C1R5 C2R5 C3R5 C4R5 C5R5 C6R5 C7R5 C8
R6 C1R6 C2R6 C3R6 C4R6 C5R6 C6R6 C7R6 C8
R7 C1R7 C2R7 C3R7 C4R7 C5R7 C6R7 C7R7 C8
R8 C1R8 C2R8 C3R8 C4R8 C5R8 C6R8 C7R8 C8
R9 C1R9 C2R9 C3R9 C4R9 C5R9 C6R9 C7R9 C8
R10 C1R10 C2R10 C3R10 C4R10 C5R10 C6R10 C7R10 C8
R11 C1R11 C2R11 C3R11 C4R11 C5R11 C6R11 C7R11 C8
R12 C1R12 C2R12 C3R12 C4R12 C5R12 C6R12 C7R12 C8
R13 C1R13 C2R13 C3R13 C4R13 C5R13 C6R13 C7R13 C8
R14 C1R14 C2R14 C3R14 C4R14 C5R14 C6R14 C7R14 C8
R15 C1R15 C2R15 C3R15 C4R15 C5R15 C6R15 C7R15 C8
R16 C1R16 C2R16 C3R16 C4R16 C5R16 C6R16 C7R16 C8
R17 C1R17 C2R17 C3R17 C4R17 C5R17 C6R17 C7R17 C8
R18 C1R18 C2R18 C3R18 C4R18 C5R18 C6R18 C7R18 C8

direction="both" 同时跟踪垂直与水平两个方向,适合宽高都受限的内容(如宽表格、大画布),四边阴影独立显示

RTL 布局

卡片 #1
卡片 #2
卡片 #3
卡片 #4
卡片 #5
卡片 #6
卡片 #7
卡片 #8
卡片 #9
卡片 #10
卡片 #11
卡片 #12

在 dir="rtl" 布局下横向阴影自动换边:初始位置在右侧起点,左端显示阴影;滚动到最左端后右端阴影出现

自定义阴影

1 段内容。调整尺寸与颜色后滚动容器,观察阴影层的变化;勾选“禁用阴影”可以完全关闭阴影。

2 段内容。调整尺寸与颜色后滚动容器,观察阴影层的变化;勾选“禁用阴影”可以完全关闭阴影。

3 段内容。调整尺寸与颜色后滚动容器,观察阴影层的变化;勾选“禁用阴影”可以完全关闭阴影。

4 段内容。调整尺寸与颜色后滚动容器,观察阴影层的变化;勾选“禁用阴影”可以完全关闭阴影。

5 段内容。调整尺寸与颜色后滚动容器,观察阴影层的变化;勾选“禁用阴影”可以完全关闭阴影。

6 段内容。调整尺寸与颜色后滚动容器,观察阴影层的变化;勾选“禁用阴影”可以完全关闭阴影。

7 段内容。调整尺寸与颜色后滚动容器,观察阴影层的变化;勾选“禁用阴影”可以完全关闭阴影。

8 段内容。调整尺寸与颜色后滚动容器,观察阴影层的变化;勾选“禁用阴影”可以完全关闭阴影。

9 段内容。调整尺寸与颜色后滚动容器,观察阴影层的变化;勾选“禁用阴影”可以完全关闭阴影。

10 段内容。调整尺寸与颜色后滚动容器,观察阴影层的变化;勾选“禁用阴影”可以完全关闭阴影。

shadowSize 控制阴影层厚度,shadowColor 控制渐变起点颜色,disabled 可随时关闭阴影;两者通过 CSS 变量 --rbs-scroll-shadow-size 与 --rbs-scroll-shadow-color 生效,也可以在全局样式里统一覆盖

可见性回调

1 段内容,滚动容器并观察下方四边可见性徽章的变化。

2 段内容,滚动容器并观察下方四边可见性徽章的变化。

3 段内容,滚动容器并观察下方四边可见性徽章的变化。

4 段内容,滚动容器并观察下方四边可见性徽章的变化。

5 段内容,滚动容器并观察下方四边可见性徽章的变化。

6 段内容,滚动容器并观察下方四边可见性徽章的变化。

7 段内容,滚动容器并观察下方四边可见性徽章的变化。

8 段内容,滚动容器并观察下方四边可见性徽章的变化。

9 段内容,滚动容器并观察下方四边可见性徽章的变化。

10 段内容,滚动容器并观察下方四边可见性徽章的变化。

top: falsebottom: falseleft: falseright: false

onChange 在四边阴影可见性发生变化时触发(挂载时若初始存在阴影也会触发一次),返回的 ScrollShadowVisibility 对象可用于渲染自定义提示或与其他状态联动

Hook 自定义组合

标签 #1标签 #2标签 #3标签 #4标签 #5标签 #6标签 #7标签 #8标签 #9标签 #10标签 #11标签 #12标签 #13标签 #14

useScrollShadow 返回 ref 与 visibility,可挂载到任意已有的滚动容器(如 .table-responsive)上自行渲染阴影或提示,ScrollShadow 组件本身即基于该 Hook 实现

API Documentation

Complete API reference for the ScrollShadow component

Props

ScrollShadow

属性名类型默认值描述
asElementType'div'外层包装元素,内部滚动容器始终渲染为 div
directionScrollShadowDirection'vertical'阴影方向:vertical/horizontal/both;同时决定内部容器的滚动轴向,未跟踪的轴 overflow 为 hidden
disabledbooleanfalse禁用阴影:不渲染阴影层且不监听滚动,容器仍可正常滚动
shadowSizenumber24阴影层厚度(像素):vertical 时为阴影高度,horizontal 时为阴影宽度
shadowColorstringrgba(0, 0, 0, 0.05)阴影颜色,作为渐变起点自动生成“浓 → 淡 → 透明”的三段式渐变阴影,默认使用 10% 半透明黑色,在深浅背景上都自然可见;也可覆盖 CSS 变量 --rbs-scroll-shadow-color 全局调整
onChange(visibility: ScrollShadowVisibility) => void-阴影可见性变化回调,参数为四边可见性对象;挂载时若初始存在阴影也会触发一次(自动支持 RTL 方向)
onScrollUIEventHandler<HTMLElement>-内部滚动容器的滚动事件回调(绑定在滚动元素上,而非外层包装元素)
tabIndexnumber-内部滚动容器的键盘焦点序号,设置后容器可通过键盘滚动
childrenReactNode-可滚动内容,渲染在内部滚动容器中
classNamestring-外层包装元素的自定义类名
styleCSSProperties-外层包装元素的内联样式,通常用来限制滚动区域的高度/宽度

useScrollShadow

属性名类型默认值描述
directionScrollShadowDirection'vertical'跟踪的滚动方向,与组件的 direction 行为一致(自动支持 RTL)
disabledbooleanfalse禁用跟踪,可见性重置为四边均不可见
onChange(visibility: ScrollShadowVisibility) => void-可见性变化回调,行为与组件的 onChange 一致
refRefCallback<T>-返回的 ref 回调,挂载到任意可滚动元素上开始跟踪(需自行处理监听期间的样式/滚动溢出)
visibilityScrollShadowVisibility-返回的可见性对象,top/bottom/left/right 分别表示四边阴影是否可见(即对应方向是否还有可滚动内容)

Common Props

属性名类型默认值描述
...restHTMLAttributes-透传原生元素属性(如 `onClick`、`dir`、`role` 等,作用于外层包装元素)

Type Definitions

ScrollShadowProps

滚动阴影容器组件属性接口

export interface ScrollShadowProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {
  as?: ElementType;
  children?: ReactNode;
  className?: string;
  direction?: ScrollShadowDirection;
  disabled?: boolean;
  onChange?: (visibility: ScrollShadowVisibility) => void;
  onScroll?: UIEventHandler<HTMLElement>;
  shadowColor?: string;
  shadowSize?: number;
  tabIndex?: number;
}

ScrollShadowDirection

滚动阴影方向联合类型

export type ScrollShadowDirection = 'both' | 'horizontal' | 'vertical';

ScrollShadowVisibility

四边阴影可见性状态

export interface ScrollShadowVisibility {
  bottom: boolean;
  left: boolean;
  right: boolean;
  top: boolean;
}

UseScrollShadowOptions

滚动阴影跟踪 Hook 配置项

export interface UseScrollShadowOptions {
  direction?: ScrollShadowDirection;
  disabled?: boolean;
  onChange?: (visibility: ScrollShadowVisibility) => void;
}

UseScrollShadowResult

滚动阴影跟踪 Hook 返回值

export interface UseScrollShadowResult<T extends HTMLElement = HTMLElement> {
  ref: RefCallback<T>;
  visibility: ScrollShadowVisibility;
}