---
title: Motion
description: "`Motion`は、`Motion`にYamada UIのStyle Propsを拡張した便利なコンポーネントです。"
links:
- source: https://github.com/yamada-ui/yamada-ui/tree/main/packages/react/src/components/motion
- storybook: https://yamada-ui.github.io/yamada-ui?path=/story/components-motion-animation--basic
---
```tsx
```
## 使い方
```tsx
import { Motion } from "@yamada-ui/react"
```
```tsx
import { Motion } from "@/components/ui"
```
```tsx
import { Motion } from "@workspaces/ui"
```
:::note
`Motion`は、内部で[Motion](https://motion.dev)を使用しています。さらに詳しくコンポーネントの機能を知りたい場合は、[こちら](https://motion.dev/docs/react-motion-component)をご覧ください。
:::
- `initial`: コンポーネントの初期状態。
- `animate`: コンポーネントがマウントされた時や更新された時に実行されるアニメーション。
- `exit`: コンポーネントがアンマウントされた時に実行されるアニメーション。
- `transition`: 所用時間や遅延時間を設定するオブジェクト。
:::note
`initial`・`animate`・`exit`で使われるスタイルオブジェクトは、Yamada UIの[Style Props](https://yamada-ui.com/docs/styling/style-props.md)ではありません。スタイルオブジェクトの各プロパティは、[Motion](https://motion.dev)のドキュメントをご覧ください。
:::
:::warning
`exit`のアニメーションを有効にする場合は、コンポーネントが[AnimatePresence](https://motion.dev/docs/react-animate-presence)の子要素である必要があります。
:::
### バリアント
バリアントを設定すると、動的なアニメーションの実装に便利です。他にもアニメーションをオーケストレーションすることも可能です。
```tsx
const [visible, { toggle }] = useBoolean()
return (
Look at me!
)
```
:::note
バリアントのアニメーションをもっと知りたい場合は、[こちら](https://motion.dev/docs/react-animation#variants)をご覧ください。
:::
### AnimatePresenceを使う
Reactでは、コンポーネントがアンマウントされた時、アニメーションは維持されません。[AnimatePresence](https://motion.dev/docs/react-animate-presence)を使用することで、アニメーションが終了するまでコンポーネントはアンマウントされません。
```tsx
const [visible, { toggle }] = useBoolean()
return (
{visible ? (
Enabled "AnimatePresence"
) : null}
{visible ? (
Disabled "AnimatePresence"
) : null}
)
```
### キーフレーム
値を配列にすることで、キーフレームを設定できます。各フレームは、均等な間隔で処理されます。`transition`の`times`に間隔を設定した配列を設定するとオーバーライドできます。
```tsx
```
### ジェスチャー
[ホバー](#ホバー)・[クリック・タップ](#クリック・タップ)・[フォーカス](#フォーカス)を検出し、アニメーションを実行することができます。
#### ホバー
- `whileHover`: ポインターがコンポーネント上を移動したときに実行されるアニメーション。
- `onHoverStart`: ポインターがコンポーネント上を移動したときに実行されるコールバック関数。
- `onHoverEnd`: ポインターがコンポーネントから離れたときに実行されるコールバック関数。
```tsx
console.log("Hover starts")}
onHoverEnd={(ev) => console.log("Hover ends")}
>
Hover me!
```
:::note
ホバーのアニメーションをもっと知りたい場合は、[こちら](https://motion.dev/docs/react-hover-animation)をご覧ください。
:::
#### クリック・タップ
- `whileTap`: ポインターがコンポーネントをクリックまたはタップしたときに実行されるアニメーション。
- `onTapStart`: ポインターがコンポーネントを押し始めたときに実行されるコールバック関数。
- `onTap`: ポインターがコンポーネントの押し下げをキャンセルし、コンポーネント内でポインターが解放されたときに実行されるコールバック関数。
- `onTapCancel`: ポインターがコンポーネントの押し下げをキャンセルし、コンポーネント外でポインターが解放されたときに実行されるコールバック関数。
```tsx
console.log("Tap starts")}
onTap={(ev) => console.log("Tap")}
onTapCancel={(ev) => console.log("Tap cancels")}
>
Click and Tap me!
```
:::note
クリック・タップのアニメーションをもっと知りたい場合は、[こちら](https://motion.dev/docs/react-gestures#tap)をご覧ください。
:::
#### フォーカス
- `whileFocus`: コンポーネントがフォーカスされたときに実行されるアニメーション。
```tsx
Focus me!
```
:::note
フォーカスのアニメーションをもっと知りたい場合は、[こちら](https://motion.dev/docs/react-gestures#focus)をご覧ください。
:::
### ドラッグ
コンポーネントのドラッグを有効にする場合は、`drag`を`true`に設定します。または`"x"`または`"y"`を設定することで、x軸またはy軸のみを追従します。
- `whileDrag`: コンポーネントがドラッグされたときに実行されるアニメーション。
- `onDrag`: コンポーネントがドラッグ中に実行されるコールバック関数。
- `onDragStart`: コンポーネントがドラッグを開始したときに実行されるコールバック関数。
- `onDragEnd`: コンポーネントがドラッグを終了したときに実行されるコールバック関数。
```tsx
{(drag) => (
console.log("Drag", "x:", point.x, "y:", point.y)
}
onDragStart={(ev, { point }) =>
console.log("Drag starts", "x:", point.x, "y:", point.y)
}
onDragEnd={(ev, { point }) =>
console.log("Drag ends", "x:", point.x, "y:", point.y)
}
>
{drag === true ? "Drag me!" : drag === "x" ? "Only X" : "Only Y"}
)}
```
:::note
ドラッグのアニメーションをもっと知りたい場合は、[こちら](https://motion.dev/docs/react-drag)をご覧ください。
:::
#### 可能領域を制限する
可能領域を制限する場合は、`dragConstraints`の`top`・`bottom`・`left`・`right`に値(ピクセル)を設定します。
```tsx
Only Right & Bottom
```
または、`ref`を設定することで可能領域を制限することも可能です。
```tsx
const ref = useRef(null)
return (
Drag me!
)
```
#### 弾力を設定する
弾力を設定する場合は、`dragElastic`に真偽値・数値または`top`・`bottom`・`left`・`right`ごとに値(ピクセル)を設定したオブジェクトを設定します。
```tsx
const ref = useRef(null)
return (
Drag me!
)
```
#### 勢いを設定する
勢いを設定する場合は、`dragMomentum`に真偽値を設定します。
```tsx
const ref = useRef(null)
return (
Drag me!
)
```
#### 方向を制限する
方向を制限する場合は、`dragDirectionLock`を`true`に設定します。
```tsx preview functional client
const [direction, setDirection] = useState<"x" | "y" | null>(null)
return (
setDirection(direction)}
onDragEnd={() => setDirection(null)}
>
Drag me!
)
```
### スクロール
- `whileInView`: コンポーネントがビューポートに入ったときに実行されるアニメーション。
- `viewport`: ビューポートの検出方法を設定するオブジェクト。
- `once`: `true`の場合は、コンポーネントがビューポートに入った1回目にアニメーションを実行します。
- `root`: スクロール可能な要素(`ref`)を設定することで、`window`の代わりにその要素をビューポートとして使用します。
- `margin`: ビューポートに追加するマージン。
- `amount`: `"some"`・`"all"`・数値を設定することで、ビューポートと交差する必要がある要素の高さを設定します。
- `onViewportEnter`: コンポーネントがビューポートに入ったときに実行されるコールバック関数。
- `onViewportLeave`: コンポーネントがビューポートから出たときに実行されるコールバック関数。
```tsx
const ref = useRef(null)
return (
Scroll me!
{(once) => (
console.log("Scroll entires", entry)}
onViewportLeave={(entry) => console.log("Scroll leaves", entry)}
>
{once ? "Once me!" : "You found me!"}
)}
)
```
## 設定
プロジェクト全体で`Motion`の共通の設定をする場合は、[MotionConfig](https://motion.dev/docs/react-motion-config)を使用します。
```tsx
import { MotionConfig } from "motion/react"
import { UIProvider } from "@yamada-ui/react"
const App = () => {
return (
)
}
```