抽屉
屏幕边缘滑出的浮层面板。
何时使用
抽屉从父窗体边缘滑入,覆盖住部分父窗体内容。用户在抽屉内操作时不必离开当前任务,操作完成后,可以平滑地回到原任务。
- 当需要一个附加的面板来控制父窗体内容,这个面板在需要时呼出。比如,控制界面展示样式,往界面中添加内容。
- 当需要在当前任务流中插入临时任务,创建或预览附加内容。比如展示协议条款,创建子对象。
开发者注意事项:
自
5.17.0版本,我们提供了loading属性,内置 Spin 组件作为加载状态,但是自5.18.0版本开始,我们修复了设计失误,将内置的 Spin 组件替换成了 Skeleton 组件,同时收窄了loadingapi 的类型范围,只能接收 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) | - | × | |
抽屉内容区域样式,请使用 styles.body 替代 | CSSProperties | - | - | × | |
| className | Drawer 容器外层 className 设置,如果需要设置最外层,请使用 rootClassName | string | - | 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' } | true | placement: 5.28.0 | 5.15.0,placement: 6.1.1 |
抽屉包裹层样式,请使用 styles.wrapper 替代 | CSSProperties | - | - | × | |
关闭时销毁 Drawer 里的子元素,请使用 destroyOnHidden 替代 | boolean | false | × | ||
| destroyOnHidden | 关闭时销毁 Drawer 里的子元素 | boolean | false | 5.25.0 | × |
抽屉面板样式,请使用 styles.section 替代 | CSSProperties | - | - | × | |
| extra | 抽屉右上角的操作区域 | ReactNode | - | 4.17.0 | × |
| footer | 抽屉的页脚 | ReactNode | - | × | |
抽屉底部样式,请使用 styles.footer 替代 | CSSProperties | - | - | × | |
| forceRender | 预渲染 Drawer 内元素 | boolean | false | × | |
| focusable | 抽屉内焦点管理的配置 | { trap?: boolean, focusTriggerAfterClose?: boolean } | - | 6.2.0 | 6.4.0 |
| getContainer | 指定 Drawer 挂载的节点,并在容器内展现,false 为挂载在当前位置 | HTMLElement | () => HTMLElement | Selectors | false | body | × | |
抽屉头部的样式,请使用 styles.header 替换 | CSSProperties | - | × | ||
高度,在 placement 为 top 或 bottom 时使用,请使用 size 替换 | string | number | 378 | × | ||
| keyboard | 是否支持键盘 esc 关闭 | boolean | true | × | |
| loading | 显示骨架屏 | boolean | false | 5.17.0 | × |
| mask | 遮罩效果 | boolean | { enabled?: boolean, blur?: boolean, closable?: boolean } | true | mask.closable: 6.3.0 | 6.0.0,mask.closable: 6.3.0 |
| 点击蒙层是否允许关闭 | boolean | true | × | ||
抽屉遮罩样式,请使用 styles.mask 替代 | CSSProperties | - | - | × | |
| maxSize | 可拖拽的最大尺寸(宽度或高度,取决于 placement) | number | - | 6.0.0 | × |
| open | Drawer 是否可见 | boolean | false | × | |
| placement | 抽屉的方向 | top | right | bottom | left | right | × | |
| push | 用于设置多层 Drawer 的推动行为 | boolean | { distance: string | number } | { distance: 180 } | 4.5.0+ | × |
| resizable | 是否启用拖拽改变尺寸 | boolean | ResizableConfig | - | boolean: 6.1.0 | × |
| rootStyle | 可用于设置 Drawer 最外层容器的样式,和 style 的区别是作用节点包括 mask | CSSProperties | - | × | |
| size | 预设抽屉宽度(或高度),default 378px 和 large 736px,或自定义数字 | 'default' | 'large' | number | string | 'default' | 4.17.0, string: 6.2.0 | × |
| style | Drawer 面板的样式,如需仅配置 body 部分,请使用 styles.body | CSSProperties | - | 5.7.0 | |
| styles | 用于自定义 Drawer 组件内部各语义化结构的行内 style,支持对象或函数 | Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties> | - | 5.10.0 | |
| title | 标题 | ReactNode | - | × | |
宽度,请使用 size 替换 | string | number | 378 | × | ||
| zIndex | 设置 Drawer 的 z-index | number | 1000 | × | |
| 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 |
section | Drawer 容器元素,包含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 覆盖。本表不伪造静态默认值。
| 令牌 | 类型 | 原生说明 |
|---|---|---|
zIndexPopup | number | 弹窗 z-index |
footerPaddingBlock | number | 底部区域纵向内间距 |
footerPaddingInline | number | 底部区域横向内间距 |
draggerSize | number | 拖拽手柄大小 |
声明来源: 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 | 添加在组件最外层的 className | string | - |
| autoFocus | 自动获取焦点,仅对表单类、链接、交互容器等可聚焦元素生效 | boolean | false |
安装并复现示例
npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23
使用 ConfigProvider 和原生 App,并单独配置 dayjs 语言。每个示例在查看代码中列出完整源码文件和额外固定依赖。示例名称用于选择演示,不是组件通用属性。主题、语言与 SSR 初始化见资源安装指南。
原生类型参考
源码查看器包含未修改的原生实现和以下声明文件,继承类型仍位于原生包中。代码中的英文注释保留为源码参考。
vendor/components/drawer/Drawer.tsxvendor/components/drawer/DrawerPanel.tsxvendor/components/drawer/style/index.tsvendor/components/drawer/style/motion.tsvendor/components/drawer/useFocusable.ts
来源与许可
https://github.com/ant-design/ant-design/tree/4a39f54842eade4e565ab336ef6097cd7e723cdd
保留原生中英文正文与可执行示例;官网专用的嵌入章节和令牌表格在本地展开。Ant Design 使用 MIT 许可,另列依赖的许可证也需保留。上传预览禁止向外发起请求,不提供后端服务。