動手試試
最簡用法
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 與事件處理函式照常可用。