--- 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 ( ) } ```