所有元件

MotionSwap

內容交叉淡入淡出,尺寸也跟著變化。

WebReact Native內容與尺寸

動手試試

正在準備範例…

最簡用法

SaveButton.jsx
<button onClick={save}>
  <MotionSwap value={status} effect="up">
    {status === 'saving' ? 'Saving…' : status === 'saved' ? 'Saved' : 'Save'}
  </MotionSwap>
</button>;

它替你處理的事

  • 元素會從畫面上的當下尺寸變化到新內容的自然尺寸,所以按鈕從不跳動。
  • 舊內容在原處淡出,新內容同時淡入;切換期間兩者都不會重新排版。
  • 切換途中改回去,會從畫面上的當下狀態繼續,而不會疊出多個副本。
  • 純文字子元素本身就是它的 value;其他內容請傳入 value。

適用情境

  • 儲存 → 儲存中… → 已儲存。
  • 骨架畫面變成個人資料卡。
  • 播放按鈕變成暫停按鈕。

Props

Prop型別預設值說明
valueunknown內容的識別;新的值會觸發切換。純文字子元素本身就是識別。
childrenReactNode內容。
aselement'span'要渲染的元素。
inlinebooleanas === 'span'true 依內容決定尺寸(標籤、圖示);false 撐滿父元素寬度並為高度加上動畫。
align'start' | 'center' | 'end''center'尺寸改變時內容所在的位置。
effect'fade' | 'up' | 'down' | 'scale''fade'內容如何進出:up 上升,down 下降,scale 放大。
transitionTransitionspring時間曲線 { duration, easing } 或彈簧 { tempo: 'spring', spring }。彈簧被中斷時會保留動量。
onMotionComplete(value) => void動態停穩時執行。

其他 props 會傳給渲染的元素,所以 className、style 與事件處理函式照常可用。

Web 與 React Native

inline(以 span 渲染時的預設值)會為寬度與高度加上動畫;inline={false} 會撐滿父元素寬度,只為高度加上動畫。

在 React Native 上,行內切換會以單行測量新內容;會換行的內容請使用 inline={false}。

用到它的範例

搜尋

輸入關鍵字搜尋文件。