Framer Motion を使ったスクロールアニメーションの実装方法を解説。useInView を活用したフェードイン、useScroll を使った進捗バー、useTransform によるスクロール連動アニメーションを紹介します。
Framer Motion では、スクロールイベントを利用したアニメーションを簡単に実装できます。
特に useInView
や ScrollTrigger
を使うと、ページをスクロールしたときに要素をフェードインさせたり、進捗バーを作成することができます。
この記事では、スクロールに応じたアニメーションの実装方法 を詳しく解説します。
useInView
を使ったスクロールアニメーションuseInView
とは?Framer Motion の useInView
フックを使うと、要素が画面内に入ったときにアニメーションを発火 できます。
まずは、要素がスクロールで表示されたときにフェードインする基本的な実装を見てみましょう。
JSX"use client"; import { motion, useInView } from "framer-motion"; import { useRef } from "react"; export default function ScrollFadeIn() { const ref = useRef(null); const isInView = useInView(ref, { once: true }); return ( <motion.div ref={ref} initial={{ opacity: 0, y: 50 }} animate={isInView ? { opacity: 1, y: 0 } : {}} transition={{ duration: 0.8, ease: "easeOut" }} className="p-6 bg-blue-500 text-white text-center rounded shadow" > スクロールでフェードイン </motion.div> ); }
useRef(null)
を定義し、対象の要素を参照useInView(ref, { once: true })
で一度だけアニメーションを実行animate={isInView ? { opacity: 1, y: 0 } : {}}
で、要素が画面内に入ったらアニメーションを発火ScrollProgress
)useScroll
を使うと、ページ全体のスクロールの進捗を取得できます。
これを活用すると、スクロールの進行に合わせて動く進捗バーを作成できます。
JSX"use client"; import { motion, useScroll } from "framer-motion"; export default function ScrollProgressBar() { const { scrollYProgress } = useScroll(); return ( <motion.div style={{ scaleX: scrollYProgress }} className="fixed top-0 left-0 right-0 h-2 bg-red-500 origin-left" /> ); }
useScroll()
で scrollYProgress
を取得(0 ~ 1 の範囲)scaleX: scrollYProgress
を適用し、スクロール量に応じてバーの長さを変化className="fixed top-0 left-0 right-0 h-2 bg-red-500 origin-left"
で画面上部にバーを配置これで、ページのスクロール量に応じて伸縮する進捗バーが作成できます!
ScrollTrigger
を使ったアニメーション要素がスクロールによって変化するアニメーションを作成するには、ScrollTrigger
を使います。
JSX"use client"; import { motion, useScroll, useTransform } from "framer-motion"; export default function ScrollScaleImage() { const { scrollYProgress } = useScroll(); const scale = useTransform(scrollYProgress, [0, 1], [1, 1.5]); return ( <motion.img src="/images/sample.jpg" alt="スクロールで拡大" style={{ scale }} className="w-full h-auto rounded shadow" /> ); }
useScroll()
でスクロール進捗を取得useTransform(scrollYProgress, [0, 1], [1, 1.5])
で、スクロールに応じてスケール値を変化motion.img
の style={{ scale }}
に適用し、スクロールに応じて画像が拡大するアニメーションを実装useInView
→ スクロールで要素が画面内に入ったらアニメーションを実行useScroll
→ ページ全体のスクロール量を取得useTransform
→ スクロール進捗に応じたアニメーションを作成ScrollTrigger
を使うと、よりダイナミックなアニメーションが可能これらを活用すれば、スクロールに応じたリッチな UI アニメーションを実装できます。
回 | タイトル | リンク |
---|---|---|
第 1 回 | Framer Motion とは? 基本の概要 | 詳 細 |
第 2 回 | 基本的なアニメーション | 詳 細 |
第 3 回 | ユーザーの操作に反応するアニメーション | 詳 細 |
第 4 回 | variants を使ったアニメーション | 詳 細 |
第 5 回 | スクロールアニメーションの実装 | この記事 |
第 6 回 | レイアウトアニメーションの実装 | 詳 細 |
第 7 回 | ページ遷移アニメーションの実装 | 詳 細 |
当サイトの情報は、一般的な参考情報として提供しております。
正確な情報の掲載に努めておりますが、その内容の正確性・完全性・最新性を保証するものではありません。
記事の内容をご利用の際は、ご自身の責任において判断し、必要に応じて専門家にご相談ください。
当サイトの情報の利用により生じたいかなる損害についても、一切の責任を負いかねますのでご了承ください。
※ 本ページでは、著作権法に基づき、適正な引用の範囲内でコンテンツを紹介しています。
オリジナルの情報は発信元をご確認ください。
もし問題がありましたら、こちら からお問い合わせください。