全部组件

MotionSheet

带档位、支持快速甩动和滚动接力的底部面板、顶部面板或侧边抽屉。

WebReact Native浮层

动手试试

正在准备示例…

最简用法

Filters.jsx
<MotionSheet open={open} onOpenChange={setOpen} detents={[0.45, 0.92]}>
  <FilterList />
</MotionSheet>;

它替你处理的事

  • 跟随拖动,超过最大档位时有阻力,并按你松手时的速度停稳;快速甩动会移动一个档位或将其关闭。
  • 触摸拖动会交接给可滚动的内容:向下拉时,内容会先滚回顶部,面板才开始移动。
  • 档位可以是屏幕比例、像素,或表示内容自然尺寸的 'content'。
  • 模态面板会把焦点限制在内部,让页面不可交互,并可通过 Escape 或背景遮罩关闭。

适用场景

  • 筛选面板。
  • 分享菜单。
  • 使用 side="start" 的导航抽屉。

Props

Prop类型默认值说明
openbooleanfalse面板是否显示。
onOpenChange(open) => void面板被拖动、点击或按 Escape 关闭时,携带 false 运行。
detents(number | 'content')[]['content']停靠尺寸:屏幕比例、像素或 'content'。
detentnumber受控的档位索引。
defaultDetentnumber0未指定 detent 打开时使用的档位索引。
onDetentChange(index) => void携带面板停稳时所在档位的索引运行。
side'bottom' | 'top' | 'start' | 'end''bottom'面板出现的边缘。
modalbooleantrue添加背景遮罩,把焦点限制在内部,并让页面不可交互。
dismissiblebooleantrue拖过最小档位、点击背景遮罩或按 Escape 都能关闭它。
backdropClassNamestring背景遮罩的 class;backdropStyle 设置其内联样式。
transitionTransitionspring时间曲线 { duration, easing } 或弹簧 { tempo: 'spring', spring }。弹簧被打断时会保留动量。

其他 props 会传给渲染的元素,所以 className、style 和事件处理函数照常可用。

Web 与 React Native

在 Web 上,模态面板是原生的 dialog;面板是一个纵向 flex 容器,用 className 设置样式。

在 React Native 上,它渲染在透明的 Modal 中,返回键可将其关闭。内部的 ScrollView 保留自己的手势,所以面板通过把手、标题和其他静态区域拖动。

用到它的示例

搜索

输入关键词搜索文档。