动手试试
最简用法
Details.jsx<button onClick={() => setOpen(!open)}>Details</button>
<MotionHeight open={open}>
<Answer />
</MotionHeight>
它替你处理的事
- 动画过渡到内容的真实高度,测量由组件完成。
- 展开状态下内容增减时也会跟随。
- 即使在变化过程中,也从屏幕上的当前高度开始。
- 调整页面大小时会立即适应,而不是滞后追赶新宽度。
- 折叠的内容保持挂载但隐藏且不可交互,因此状态会被保留。
适用场景
- FAQ 中的回答。
- 可展开的一组设置。
- 需要为总高度添加动画的列表(包裹
MotionList)。
Props
| Prop | 类型 | 默认值 | 说明 |
|---|
open | boolean | true | false 折叠到零高度;内容保持挂载但隐藏且不可交互。 |
|---|
children | ReactNode | | 内容。 |
|---|
as | element | 'div' | 要渲染的元素。 |
|---|
transition | Transition | spring | 时间曲线 { duration, easing } 或弹簧 { tempo: 'spring', spring }。弹簧被打断时会保留动量。 |
|---|
onMotionComplete | (open) => void | | 高度停稳后,携带 open 运行。 |
|---|
其他 props 会传给渲染的元素,所以 className、style 和事件处理函数照常可用。