PR
【Gatsby製ブログ】framer-motionで好きなタイミングでアニメーション発火
Reactでアニメーションをつけるときにオススメのライブラリーがframer-motionです。
もちろんReactベースのGatsbyでも使うことができます。
私のGatsbyブログでもframer-motionでアニメーションをつけています。
framer-motionは自由度が高く、色々できる代わりに使い方が結構複雑です。
今回はframer-motionで好きなタイミングでアニメーションを発火させる方法について説明していきます!
framer-motionで好きなタイミングでアニメーションを発火させる
実は既にVariantsの解説で、好きなタイミングでアニメーションを発火させる方法は紹介しています。
一番簡単な方法は、ボタンを押したり、ラジオボタンを選んだりしたときに、useStateなんかを使ってanimateの状態指定を変えてやることです。
Variantsの説明のときは、ラジオボタンを使ってstateの状態名を変えてアニメーションを発火させていました。
例えば、レスポンシブ対応したサイトのサイドメニューの開閉にアニメーションを使う、というのもよくやりますよね。
const [isopen, setIsOpen] = useState(false); //サイドメニューが開いているかどうかの判定。
const menuVariants = { //Variantsで状態を設定。
visible: {
x: 0,
transition: {
duration: 0.5, //durationで指定した時間をかけてアニメーションする。
type: "spring", //跳ねるようなエフェクトをかける。
},
},
hidden: {
x: "-100vw",
transition: {
duration: 2.5,
type: "spring",
},
},
}
return (
…
// サイドメニュー
<motion.div
variants = {menuVariants}
initial = "hidden"
animate = {isopen ? "visible" : "hidden"}
//↑三項演算子でisopenがtrueなら"visible"に、falseなら"hidden"にアニメーションする。
style={{position: "absolute", top: 0, left:0, width: "200px", height: "100vh", background: "#FFB6C1"}}
>
<ul style={{position: "absolute", top: 130, left: 30, fontSize: "1.2rem"}}>
<li key={1}>クマ太郎</li>
<li key={2}>クマ次郎</li>
<li key={3}>クマ三郎</li>
</ul>
</motion.div>
// ハンバーガーメニュー
<motion.div
initial = "hidden"
animate = {isopen ? "visible" : "hidden"}
>
<button onClick = {() => setIsOpen(!isopen)}> // クリックしたときにsetIsOpenでisopenのstateを変えている。
…(ボタン。svgでハンバーガーメニューを作る。)
</button>
</motion.div>
…
)
こんな感じで、簡単にサイドメニューの開閉アニメーションを実装することができます。
useStateの扱いに慣れていたら、結構簡単に実装できます!しかも今回の例はかなり実践的ですね!ちなみに、useStateについてはこちらで説明しています。
今回のコード全体はコチラ
svgでハンバーガーメニュー作るのは結構大変(少なくとも私は苦手)なので、参考にどうぞ。
…
const [isopen, setIsOpen] = useState(false);
const Path = props => (
<motion.path
fill="transparent"
strokeWidth="3"
stroke="hsl(0, 0%, 18%)"
strokeLinecap="round"
{...props}
/>
);
const menuVariants = {
visible: {
x: 0,
transition: {
duration: 0.5,
type: "spring",
},
},
hidden: {
x: "-100vw",
transition: {
duration: 2.5,
type: "spring",
},
},
}
return (
<div>
<motion.div
variants = {menuVariants}
initial = "hidden"
animate = {isopen ? "visible" : "hidden"}
style={{position: "absolute", top: 0, left:0, width: "200px", height: "100vh", background: "#FFB6C1"}}
>
<ul style={{position: "absolute", top: 130, left: 30, fontSize: "1.2rem"}}>
<li key={1}>クマ太郎</li>
<li key={2}>クマ次郎</li>
<li key={3}>クマ三郎</li>
</ul>
</motion.div>
<motion.div
initial = "hidden"
animate = {isopen ? "visible" : "hidden"}
>
<button onClick = {() => setIsOpen(!isopen)}>
<svg width="23" height="23" viewBox="0 0 23 23">
<Path
variants={{
hidden: { d: "M 2 2.5 L 20 2.5" },
visible: { d: "M 3 16.5 L 17 2.5" }
}}
/>
<Path
d="M 2 9.423 L 20 9.423"
variants={{
hidden: { opacity: 1 },
visible: { opacity: 0 }
}}
transition={{ duration: 0.1 }}
/>
<Path
variants={{
hidden: { d: "M 2 16.346 L 20 16.346" },
visible: { d: "M 3 2.5 L 17 16.346" }
}}
/>
</svg>
</button>
</motion.div>
</div>
)
}
…
全体、といいつつ本当に全部ではありませんが、メニューとハンバーガーメニューの表示とアニメーション部分の実装はこれで全部です。それぞれの環境に合わせてコピペしてみてください。
まとめ
framer-motionとuseStateを使って、好きなタイミングでアニメーションを発火させる方法を説明しました。
Variantsとanimateを理解していれば、useStateを使ってのアニメーション発火は比較的わかりやすいかな、と思います。
Gatsbyを学習している方への私からのオススメ!
私が読んでよかったな、と思うGatsbyの学習をするのにオススメの本を紹介しておきます。
画も多くてとても読みやすく、ステップバイステップでGatsbyJSのサイトを作ることができます!
また、Gatsbyを学習する上で、Reactを同時に学習することもオススメします。
こちらも、まず構成や見た目がとても読みやすい本です。加えてReactに対しての専門的な知識を丁寧に学ぶことができます。ここでReactに対する基礎知識をしっかりしておくと、Gatsbyに対する見方が変わって、Webページをサクサク作ることができるようになります!
あと、色々と調べたのですが、Reactの学習ならUdemyもオススメです。必要な知識を1動画単位で購入できるので、学習に無駄がないです。Reactってあんまり学習できるプログラミングスクールみたいなのがないんですよね…。「React」と検索するだけで大量に動画がでてきます!