JGuang

抽屉

Drawer · Ant Design

交互预览
npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23

抽屉

屏幕边缘滑出的浮层面板。

何时使用

抽屉从父窗体边缘滑入,覆盖住部分父窗体内容。用户在抽屉内操作时不必离开当前任务,操作完成后,可以平滑地回到原任务。

  • 当需要一个附加的面板来控制父窗体内容,这个面板在需要时呼出。比如,控制界面展示样式,往界面中添加内容。
  • 当需要在当前任务流中插入临时任务,创建或预览附加内容。比如展示协议条款,创建子对象。

开发者注意事项:

自 5.17.0 版本,我们提供了 loading 属性,内置 Spin 组件作为加载状态,但是自 5.18.0 版本开始,我们修复了设计失误,将内置的 Spin 组件替换成了 Skeleton 组件,同时收窄了 loading api 的类型范围,只能接收 boolean 类型。

代码演示

  • 基础抽屉 · basic-right
  • 自定义位置 · placement
  • 可调整大小 · resizable
  • 加载中 · loading
  • 额外操作 · extra
  • 渲染在当前 DOM · render-in-current
  • 抽屉表单 · form-in-drawer
  • 信息预览抽屉 · user-profile
  • 多层抽屉 · multi-level-drawer
  • 预设宽度 · size
  • 遮罩 · mask
  • 关闭按钮位置 · closable-placement
  • 自定义语义结构的样式和类 · style-class

API

通用属性参考:通用属性

参数说明类型默认值版本全局配置
afterOpenChange切换抽屉时动画结束后的回调function(open)-×
bodyStyle抽屉内容区域样式,请使用 styles.body 替代CSSProperties--×
classNameDrawer 容器外层 className 设置,如果需要设置最外层,请使用 rootClassNamestring-5.7.0
classNames用于自定义 Drawer 组件内部各语义化结构的 class,支持对象或函数Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string>-5.10.0
closable是否显示关闭按钮。可通过 placement 配置其位置boolean | { closeIcon?: React.ReactNode; disabled?: boolean; placement?: 'start' | 'end' }trueplacement: 5.28.05.15.0,placement: 6.1.1
contentWrapperStyle抽屉包裹层样式,请使用 styles.wrapper 替代CSSProperties--×
destroyOnClose关闭时销毁 Drawer 里的子元素,请使用 destroyOnHidden 替代booleanfalse×
destroyOnHidden关闭时销毁 Drawer 里的子元素booleanfalse5.25.0×
drawerStyle抽屉面板样式,请使用 styles.section 替代CSSProperties--×
extra抽屉右上角的操作区域ReactNode-4.17.0×
footer抽屉的页脚ReactNode-×
footerStyle抽屉底部样式,请使用 styles.footer 替代CSSProperties--×
forceRender预渲染 Drawer 内元素booleanfalse×
focusable抽屉内焦点管理的配置{ trap?: boolean, focusTriggerAfterClose?: boolean }-6.2.06.4.0
getContainer指定 Drawer 挂载的节点,并在容器内展现,false 为挂载在当前位置HTMLElement | () => HTMLElement | Selectors | falsebody×
headerStyle抽屉头部的样式,请使用 styles.header 替换CSSProperties-×
height高度,在 placement 为 top 或 bottom 时使用,请使用 size 替换string | number378×
keyboard是否支持键盘 esc 关闭booleantrue×
loading显示骨架屏booleanfalse5.17.0×
mask遮罩效果boolean | { enabled?: boolean, blur?: boolean, closable?: boolean }truemask.closable: 6.3.06.0.0,mask.closable: 6.3.0
maskClosable点击蒙层是否允许关闭booleantrue×
maskStyle抽屉遮罩样式,请使用 styles.mask 替代CSSProperties--×
maxSize可拖拽的最大尺寸(宽度或高度,取决于 placement)number-6.0.0×
openDrawer 是否可见booleanfalse×
placement抽屉的方向top | right | bottom | leftright×
push用于设置多层 Drawer 的推动行为boolean | { distance: string | number }{ distance: 180 }4.5.0+×
resizable是否启用拖拽改变尺寸boolean | ResizableConfig-boolean: 6.1.0×
rootStyle可用于设置 Drawer 最外层容器的样式,和 style 的区别是作用节点包括 maskCSSProperties-×
size预设抽屉宽度(或高度),default 378px 和 large 736px,或自定义数字'default' | 'large' | number | string'default'4.17.0, string: 6.2.0×
styleDrawer 面板的样式,如需仅配置 body 部分,请使用 styles.bodyCSSProperties-5.7.0
styles用于自定义 Drawer 组件内部各语义化结构的行内 style,支持对象或函数Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties>-5.10.0
title标题ReactNode-×
width宽度,请使用 size 替换string | number378×
zIndex设置 Drawer 的 z-indexnumber1000×
onClose点击遮罩层或左上角叉或取消按钮的回调function(e)-×
drawerRender自定义渲染抽屉(node: ReactNode) => ReactNode-5.18.0×

ResizableConfig

参数说明类型默认值版本
onResizeStart开始拖拽调整大小时的回调() => void-6.0.0
onResize拖拽调整大小时的回调(size: number) => void-6.0.0
onResizeEnd结束拖拽调整大小时的回调() => void-6.0.0

Semantic DOM

语义节点原生说明版本
root根元素,包含固定定位、层级控制、指针事件、颜色等抽屉容器的基础样式和布局控制6.0.0
mask遮罩层元素,包含绝对定位、层级、背景色、指针事件等遮罩层的样式和交互控制5.13.0
sectionDrawer 容器元素,包含flex布局、宽高、溢出控制、背景色、指针事件等抽屉主体的样式6.0.0
header头部元素,包含flex布局、对齐方式、内边距、字体大小、行高、下边框等头部区域的样式5.13.0
title标题元素,包含flex占比、外边距、字体权重、字体大小、行高等标题文字的样式6.0.0
extra额外元素,包含flex固定布局等额外操作内容的样式控制6.0.0
body内容元素,包含flex占比、最小尺寸、内边距、溢出滚动等内容区域的展示和布局样式5.13.0
footer底部元素,包含flex收缩、内边距、上边框等底部操作区域的样式5.13.0
dragger拖拽元素,用于调整抽屉大小的拖拽手柄,包含绝对定位、背景透明、指针事件控制、hover状态样式、拖拽状态样式等6.0.0
close关闭按钮元素,包含按钮的基础样式6.1.0

语义说明来源: vendor/components/drawer/demo/_semantic.tsx

主题变量(Design Token)

类型、继承关系和原生令牌声明保持固定源码原文;默认值由原生主题计算,并可能受 ConfigProvider 覆盖。本表不伪造静态默认值。

令牌类型原生说明
zIndexPopupnumber弹窗 z-index
footerPaddingBlocknumber底部区域纵向内间距
footerPaddingInlinenumber底部区域横向内间距
draggerSizenumber拖拽手柄大小

声明来源: vendor/components/drawer/style/index.ts

import type { CSSObject } from '@ant-design/cssinjs';

import { unit } from '@ant-design/cssinjs';

import { genFocusStyle } from '../../style';

import type { FullToken, GenerateStyle, GetDefaultToken } from '../../theme/internal';

import { genStyleHooks, mergeToken } from '../../theme/internal';

import genMotionStyle from './motion';

export interface ComponentToken {
  /**
   * @desc 弹窗 z-index
   * @descEN z-index of drawer
   */
  zIndexPopup: number;
  /**
   * @desc 底部区域纵向内间距
   * @descEN Vertical padding of footer
   */
  footerPaddingBlock: number;
  /**
   * @desc 底部区域横向内间距
   * @descEN Horizontal padding of footer
   */
  footerPaddingInline: number;
  /**
   * @desc 拖拽手柄大小
   * @descEN Size of resize handle
   */
  draggerSize: number;
}

export interface DrawerToken extends FullToken<'Drawer'> {}

原生通用属性

Tips: 以下通用属性适用于 antd 大部分组件,不支持的组件会单独说明。

参数说明类型默认值
style自定义样式CSSProperties-
className自定义类名string-
rootClassName添加在组件最外层的 classNamestring-
autoFocus自动获取焦点,仅对表单类、链接、交互容器等可聚焦元素生效booleanfalse

安装并复现示例

npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23

使用 ConfigProvider 和原生 App,并单独配置 dayjs 语言。每个示例在查看代码中列出完整源码文件和额外固定依赖。示例名称用于选择演示,不是组件通用属性。主题、语言与 SSR 初始化见资源安装指南。

原生类型参考

源码查看器包含未修改的原生实现和以下声明文件,继承类型仍位于原生包中。代码中的英文注释保留为源码参考。

  • vendor/components/drawer/Drawer.tsx
  • vendor/components/drawer/DrawerPanel.tsx
  • vendor/components/drawer/style/index.ts
  • vendor/components/drawer/style/motion.ts
  • vendor/components/drawer/useFocusable.ts

来源与许可

https://github.com/ant-design/ant-design/tree/4a39f54842eade4e565ab336ef6097cd7e723cdd

保留原生中英文正文与可执行示例;官网专用的嵌入章节和令牌表格在本地展开。Ant Design 使用 MIT 许可,另列依赖的许可证也需保留。上传预览禁止向外发起请求,不提供后端服务。