跳到正文

Drawer 抽屉

Drawer 从屏幕的一边滑出一个面板,盖在变暗的页面上:列表旁的详情、筛选条件、一条讨论串,或者手机上的导航菜单。它分两部分:Drawer 是浮层和滑出的面板,DrawerContent 在里面排好标题、自己滚动的正文和底栏。

它和 Modal 是同一种浮层:通过 z-index 管理器叠放,所以在里面打开的 Select、Popover、Modal 会显示在它上面,按 Esc 先关最里层。打开期间焦点留在里面,背后的页面对读屏软件隐藏、也不能滚动;关闭后焦点回到打开它的元素。

演示

基础用法

用 show 和 onUpdateShow 控制,默认从右边滑出。DrawerContent 的 title 同时是抽屉的名称,closable 加上 ×,footer 在正文下方固定一行。

位置

placement 选择从哪一边滑出:top、right、bottom 或 left。上下两边的抽屉横跨整个屏幕。

导航菜单

窄屏布局的菜单就是一个左侧抽屉,比如本站在手机上的菜单。选一个页面,菜单随即关闭。

长内容

标题和底栏不动,正文在两者之间用 ScrollArea 滚动。nativeScrollbar 改用浏览器自己的滚动条。

可调整大小

resizable 让内侧的边可以拖动;也可以用 Tab 聚焦它后按方向键调整。minWidth / maxWidth(上下抽屉用 minHeight / maxHeight)限定范围,onUpdateWidth / onUpdateHeight 报告新的尺寸。

遮罩

showMask="transparent" 保留一层看不见的遮罩,点它仍然会关闭。showMask={false} 不画遮罩:页面照常可用,焦点也不会被困住(同时关掉 blockScroll 才能滚动页面)。除非关掉 maskClosable,点页面仍会关闭抽屉。

Drawer Props

名称类型默认值说明版本
showbooleanundefined受控的显示状态。未发布
defaultShowbooleanfalse非受控时的初始显示状态。未发布
onUpdateShow(show: boolean) => voidundefined抽屉要打开或关闭时,以新的状态调用。未发布
childrenReactNodeundefined面板内容,通常是一个 DrawerContent。未发布
placement'top' | 'right' | 'bottom' | 'left''right'从哪一边滑出。未发布
widthnumber | stringundefined左右抽屉的受控宽度,数字单位为 px。主题默认 360px。未发布
defaultWidthnumber | stringundefined非受控时的初始宽度。未发布
onUpdateWidth(width: number) => voidundefined调整大小时以新的宽度(px)调用。未发布
heightnumber | stringundefined上下抽屉的受控高度,数字单位为 px。主题默认 320px。未发布
defaultHeightnumber | stringundefined非受控时的初始高度。未发布
onUpdateHeight(height: number) => voidundefined调整大小时以新的高度(px)调用。未发布
resizablebooleanfalse拖动内侧的边(或在它上面按方向键)调整大小。未发布
minWidth / maxWidthnumberundefined调整大小时的宽度范围(px)。未发布
minHeight / maxHeightnumberundefined调整大小时的高度范围(px)。未发布
showMaskboolean | 'transparent'true让页面变暗、保留透明遮罩,或不画遮罩让页面照常可用。未发布
maskClosablebooleantrue点遮罩(没有遮罩时点页面)关闭。未发布
onMaskClick(event: MouseEvent) => voidundefined点遮罩时调用,不论是否关闭。未发布
closeOnEscbooleantrue按 Esc 关闭。未发布
onEsc() => voidundefined按 Esc 时调用,不论是否关闭。未发布
autoFocusbooleantrue打开时聚焦里面第一个可聚焦元素;关掉则聚焦抽屉本身。未发布
trapFocusbooleantrue把 Tab 留在里面,并对读屏软件隐藏页面(aria-modal)。只在有遮罩时生效。未发布
blockScrollbooleantrue打开期间禁止页面滚动。未发布
displayDirective'if' | 'show''if'关闭后卸载,或保留 DOM 并隐藏。未发布
tostring | HTMLElement | falseundefined挂载位置;false 原地渲染。默认是 ConfigProvider 的 portalContainer,其次 document.body。未发布
zIndexnumberundefined固定的 z-index,而不是叠在之前打开的浮层之上。未发布
onAfterEnter() => voidundefined进入动画结束时调用。未发布
onAfterLeave() => voidundefined离开动画结束时调用。未发布

其他属性、className、style 和 ref 传给抽屉元素(role="dialog")。抽屉不会超出屏幕,在贴着的边上避开刘海和 Home 指示条;开启减弱动态效果时只做淡入淡出。

DrawerContent Props

名称类型默认值说明版本
titleReactNodeundefined标题,同时是抽屉的名称。未发布
childrenReactNodeundefined正文。内容过高时在标题和底栏之间滚动。未发布
footerReactNodeundefined固定在正文下方的一行。未发布
closablebooleanfalse显示 × 按钮。未发布
onClose() => boolean | void | Promise<boolean | void>undefined点 × 时调用。返回 false 则不关闭。未发布
nativeScrollbarbooleanfalse正文用浏览器自己的滚动条,而不是 ScrollArea。未发布

其他属性、className、style 和 ref 传给内容的根元素。DrawerContent 必须放在 Drawer 里面。