Skyroc UI
弹层覆盖

Drawer

从屏幕边缘滑入的侧边面板组件

抽屉(Drawer)从屏幕边缘滑入,用于在不离开当前页面的情况下展示辅助内容或操作面板。基于 Dialog 封装,继承标题、描述、页脚、关闭按钮等完整能力,并新增方向控制和内容滚动功能。

import { Drawer, DrawerContent, type DrawerSide } from '@skyroc/web-ui';

何时使用

  • 需要在不离开当前页面的情况下查看详情、编辑表单或完成一段辅助流程。
  • 需要从页面边缘展开筛选、目录、购物车、产品配置等面板。
  • 与 Dialog 的区分:Dialog 居中弹出,适合短确认和聚焦任务;Drawer 从边缘进入,更适合保留页面上下文。
  • 与 BottomSheet 的区分:BottomSheet 更偏移动端底部手势;Drawer 支持四个方向,适合响应式页面和桌面侧边面板。

基础用法

通过 trigger 提供触发元素,通过 titledescriptionchildren 组织面板内容。默认从右侧滑入,并渲染一个 OK 页脚按钮。

<Drawer
  title="产品配置"
  description="调整当前产品的展示参数"
  trigger={<Button>打开配置</Button>}
>
  <div>Drawer Content</div>
</Drawer>

方向

通过 contentProps.side 控制 Drawer 的滑入方向,默认为 right

Preview
Code
Loading...
方向说明适用场景
right从右侧滑入详情面板、属性编辑
left从左侧滑入导航目录、筛选面板
top从顶部滑入搜索、通知、全局提示
bottom从底部滑入快捷操作、移动端入口

左右方向的 Drawer 默认宽度为 w-3/4,在 sm 断点以上限制为 max-w-sm;上下方向的 Drawer 占满水平宽度。

const sides: DrawerSide[] = ['left', 'right', 'top', 'bottom'];

{sides.map(side => (
  <Drawer
    key={side}
    title="Drawer Title"
    trigger={<Button>{side}</Button>}
    contentProps={{ side }}
  >
    Drawer Content
  </Drawer>
))}

可滚动内容

scrollable 控制内容区是否可滚动,默认为 true。当内容超出面板高度时自动出现滚动条。设为 false 则内容区不滚动,适合内容高度固定的场景。

Preview
Code
Loading...
<Drawer
  title="长内容"
  trigger={<Button>打开</Button>}
>
  {Array.from({ length: 100 }).map((_, index) => (
    <div key={index}>Drawer Content</div>
  ))}
</Drawer>

标题、描述和页脚

Drawer 继承 Dialog 的标题、描述、关闭按钮和页脚能力:

  • title 渲染面板标题,用于说明当前面板目的。
  • description 渲染标题下方的补充说明。
  • footer 控制底部操作区。
  • titlePropsdescriptionPropsheaderPropsfooterProps 可向对应结构传入额外属性。

页脚规则与 Dialog 保持一致:

  • 默认显示 OK 按钮,文本可通过 okText 自定义,点击回调为 onOk
  • 传入 ReactNode 可完全替换页脚内容。
  • 传入 nullfalse 隐藏页脚。

尺寸和样式

通过 size 调整面板标题、描述、页脚和内容区域的字号与间距。通过 classNames 可分别控制 overlaycontentheadertitledescriptionfooterclose

需要改变面板宽度或高度时,优先通过 classNamecontentProps.className 覆盖内容容器:

<Drawer
  title="宽面板"
  trigger={<Button>打开</Button>}
  className="sm:max-w-xl"
>
  Drawer Content
</Drawer>

受控状态

Drawer 透传 Radix Dialog Root 的 opendefaultOpenonOpenChangemodal。当打开状态需要和路由、表单流程或异步任务联动时,使用受控模式。

API

Drawer

基于 Dialog 封装,继承 Dialog 的标题、描述、页脚、关闭按钮、受控状态和 slot 样式能力。以下列出 Drawer 特有属性及常用的 Dialog 继承属性。

属性说明类型默认值
scrollable内容区是否可滚动booleantrue
trigger*触发打开的元素ReactNode-
children内容区节点,显示在头部和页脚之间;内容会被可滚动容器包裹ReactNode-
title标题文本ReactNode-
description描述文本,显示在标题下方ReactNode-
footer页脚内容;默认渲染 OK 按钮,传入 null 或 false 隐藏页脚ReactNode | null | false-
open受控模式下的打开状态boolean-
onOpenChange打开/关闭状态变化回调(open: boolean) => void-
defaultOpen非受控模式下的初始打开状态boolean-
modal是否以模态模式打开(显示遮罩层)booleantrue
size尺寸,影响内容面板及标题、描述、页脚等子组件的字号与间距'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl''md'
className传递给内容容器的自定义 class;优先级高于 classNames.contentClassValue-
classNames各 slot 的自定义 classDrawerClassNames-
contentProps传递给 DrawerContent 的额外属性,可通过 side 控制滑入方向DrawerContentProps-
onOkOK 按钮点击回调(e: React.MouseEvent<HTMLButtonElement>) => void-
okTextOK 按钮文本ReactNode'OK'
okButtonPropsOK 按钮的额外属性ButtonProps-
overlayProps传递给遮罩层的额外属性DialogOverlayProps-
closeProps传递给关闭按钮的额外属性DialogCloseProps-
headerProps传递给头部容器的额外属性DialogHeaderProps-
footerProps传递给页脚容器的额外属性DialogFooterProps-
titleProps传递给标题组件的额外属性DialogTitleProps-
descriptionProps传递给描述组件的额外属性DialogDescriptionProps-

DrawerContent

通过 contentProps 传递给内容容器的属性,控制滑入方向和样式。继承 Radix Dialog Content 的所有属性。

属性说明类型默认值
side滑入方向'top' | 'right' | 'bottom' | 'left''right'
className内容容器的 classClassValue-

类型

DrawerClassNames

各 slot 的自定义 class,复用 Dialog 的 slot 结构。

字段类型说明
overlayClassValue遮罩层的 class。
contentClassValue内容容器的 class。
headerClassValue头部的 class。
titleClassValue标题的 class。
descriptionClassValue描述文本的 class。
footerClassValue页脚的 class。
closeClassValue关闭按钮的 class。

DrawerContentProps

内容容器属性,继承 Radix Dialog Content 的定位、焦点管理等属性。

字段类型说明
side'top' | 'right' | 'bottom' | 'left'滑入方向。
classNameClassValue自定义 class。
onOpenAutoFocus(event: Event) => void打开时自动聚焦的回调。
onCloseAutoFocus(event: Event) => void关闭时自动聚焦的回调。
onEscapeKeyDown(event: KeyboardEvent) => void按下 Escape 键的回调。
onPointerDownOutside(event: PointerDownOutsideEvent) => void在内容区外点击的回调。
onInteractOutside(event: Event) => void在内容区外交互的回调。

DialogOverlayProps

遮罩层属性,继承 Radix Dialog Overlay 的所有属性。

字段类型说明
classNameClassValue自定义 class。
forceMountboolean强制挂载(即使关闭状态也渲染 DOM)。

DialogCloseProps

关闭按钮属性,继承 Radix Dialog Close 的所有属性。

字段类型说明
classNameClassValue自定义 class。

DialogHeaderProps

头部容器属性,继承原生 header 元素的所有属性。

字段类型说明
classNameClassValue自定义 class。

页脚容器属性,继承原生 footer 元素的所有属性。

字段类型说明
classNameClassValue自定义 class。

DialogTitleProps

标题组件属性,继承 Radix Dialog Title 的所有属性。

字段类型说明
classNameClassValue自定义 class。

DialogDescriptionProps

描述组件属性,继承 Radix Dialog Description 的所有属性。

字段类型说明
classNameClassValue自定义 class。

ClassValue

CSS 类名类型

string | null | undefined | Record<string, boolean> | ClassValue[]

On this page