リッチなWebアニメーションを実装するなら、JavaScriptライブラリ GSAP(GreenSock Animation Platform) が定番です。CSSアニメーションやjQueryの animate() より柔軟で、高速・滑らかな動きを直感的なコードで書けます。この記事ではGSAPの導入から、to/from・タイムライン・ScrollTrigger・アクセシビリティ対応まで、実務で使える形で解説します。
- GSAPの導入(CDN / npm)とプラグインの登録
- 基本の
to/from/fromTo - 複数要素を時間差で動かす
stagger timelineでの連続・重ねアニメーションScrollTriggerによるスクロール連動prefers-reduced-motion対応とReactでの使い方
2025年4月、GSAPは Webflow傘下で完全無料になりました。これまで有料(Club GSAP)だった
SplitText / MorphSVG / DrawSVG / ScrollSmoother などのプラグインも、商用利用を含めてすべて無料で使えます。導入のハードルが大きく下がりました。GSAPの導入
手軽に試すならCDN、開発環境では npm が便利です。CDNは最新の3.x系を読み込む例です(本番ではバージョンを固定するのが安全です)。
<!-- コア本体 --> <script src="https://cdn.jsdelivr.net/npm/gsap@3/dist/gsap.min.js"></script> <!-- 使うプラグインだけ追加(例:ScrollTrigger) --> <script src="https://cdn.jsdelivr.net/npm/gsap@3/dist/ScrollTrigger.min.js"></script>
npm install gsap
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
// プラグインは使う前に登録が必要
gsap.registerPlugin(ScrollTrigger);
基本:to / from / fromTo
GSAPの中心は「ある状態へ補間する(トゥイーン)」ことです。to は現在の状態から指定値へ、from は指定値から現在の状態へアニメーションします。
// 現在の状態 → 指定した状態へ
gsap.to(".box", { x: 100, opacity: 0, duration: 1 });
// 指定した状態 → 現在の状態へ(登場アニメに便利)
gsap.from(".box", { y: 50, opacity: 0, duration: 1 });
// 開始と終了の両方を指定
gsap.fromTo(".box",
{ opacity: 0, x: -100 }, // 開始
{ opacity: 1, x: 0, duration: 1 } // 終了
);
x は transform で動くGSAPの
x / y は CSS の transform: translate() を使うため、left / top よりも高速で滑らかです。回転は rotation、拡大縮小は scale で指定できます。複数要素を時間差で動かす(stagger)
同じセレクターに一致する複数要素を少しずつ遅らせて動かすと、リズムのある演出になります。stagger に秒数を指定するだけです。
// .card を 0.15 秒ずつ遅らせて順番に表示
gsap.from(".card", {
y: 30,
opacity: 0,
duration: 0.6,
stagger: 0.15, // 要素ごとの時間差
});
timeline で連続・重ねアニメーション
複数のアニメーションを順番に並べたり、少し重ねたりするには gsap.timeline() を使います。defaults で共通設定をまとめられ、位置パラメータで再生タイミングを調整できます。
const tl = gsap.timeline({ defaults: { duration: 1 } });
tl.to(".box1", { x: 100 })
.to(".box2", { y: 100 })
.to(".box3", { opacity: 0 }, "-=0.5"); // 直前の0.5秒前から重ねて再生
CSSアニメーションやjQueryの animate() での連続制御と比べると、GSAPのタイムラインは順序・重なり・巻き戻しを宣言的に書けるのが強みです。jQueryでの基本的なアニメーションはjQueryアニメーション完全ガイド、素のJavaScript/CSSでのフェードインは要素をふわっとフェードインさせる方法も参考になります。
スクロール連動アニメーション(ScrollTrigger)
公式プラグイン ScrollTrigger を使うと、スクロール位置に応じてアニメーションを発火・追従させられます。プラグインは 使う前に registerPlugin で登録します。
gsap.registerPlugin(ScrollTrigger);
gsap.to(".box", {
x: 300,
duration: 2,
scrollTrigger: {
trigger: ".box",
start: "top 80%", // 要素の上端がビューポートの80%位置に来たら開始
end: "top 30%",
scrub: true, // スクロール量に動きを同期させる
},
});
スクロールで要素を出す演出は素のJSでも実装できます。軽量に済ませたい場合はスクロールに合わせたフェードインやスクロールで要素が表示されたら実行する方法と比較して、必要に応じてGSAPを選んでください。
イージングで動きに緩急をつける
ease プロパティで動きのカーブを指定します。power1〜4・back・elastic・bounce など多彩です。
gsap.to(".ball", { y: 200, duration: 1.5, ease: "bounce.out" });
gsap.to(".panel", { x: 200, duration: 1, ease: "power2.inOut" });
イージングの考え方自体はSassでイージングを設定してアニメーションをスムーズにする方法でも触れています。
アクセシビリティ:prefers-reduced-motion に対応する
「動きを減らす」設定をしている利用者に過剰なアニメーションを見せると、不快感や体調不良を招くことがあります。GSAPの gsap.matchMedia() を使えば、動きを許可している環境だけアニメーションを実行できます。
const mm = gsap.matchMedia();
// 「動きを減らす」設定でない環境だけアニメーションする
mm.add("(prefers-reduced-motion: no-preference)", () => {
gsap.from(".hero", { y: 50, opacity: 0, duration: 1 });
});
装飾的なアニメーションは
prefers-reduced-motion: reduce の利用者には抑制するのが望ましい配慮です。CSS側の @media (prefers-reduced-motion) と合わせて、過度な動きを避ける設計にしましょう。React など SPA での使い方(クリーンアップ)
ReactなどのSPAでは、コンポーネントの再描画やアンマウントのたびにアニメーションを後始末(クリーンアップ)しないとメモリリークや二重再生の原因になります。公式の @gsap/react が提供する useGSAP フックを使うと、自動でクリーンアップされます。
// npm install @gsap/react
import { useGSAP } from "@gsap/react";
import { gsap } from "gsap";
import { useRef } from "react";
function Hero() {
const root = useRef(null);
useGSAP(() => {
// この中のアニメーションはアンマウント時に自動で破棄される
gsap.from(".title", { y: 50, opacity: 0, duration: 1 });
}, { scope: root });
return (
<div ref={root}>
<h1 className="title">Hello GSAP</h1>
</div>
);
}
gsap.context()フレームワークを使わない場合でも、
const ctx = gsap.context(() => { ... }, root); でスコープを作り、不要になったら ctx.revert(); でまとめて破棄できます。SPAやページ遷移のある構成では後始末を忘れないようにします。CSS・jQueryアニメーションとの使い分け
| 手法 | 向いている場面 |
|---|---|
| CSS animation / transition | ホバーや単純な状態変化。依存ライブラリ不要で軽い |
| jQuery animate() | 既存のjQuery環境での簡単な動き |
| GSAP | 複雑なシーケンス・スクロール連動・SVG・精密な制御 |
単純な動きならCSSで十分で、ライブラリを足す必要はありません。CSSアニメーションが動かないときの原因はtransition・animationが効かない原因と解決方法、アニメーション終了の検知はanimationend・transitionend で処理を行う方法、数値演出は数字をカウントアップアニメーションさせる方法も参考にしてください。複雑な演出が必要になったらGSAPを選ぶ、という判断がおすすめです。
よくある質問(FAQ)
SplitText や MorphSVG などのプラグインも、商用利用を含めてすべて無料で使えます。gsap.registerPlugin(ScrollTrigger) のように使う前に登録します。登録を忘れるとプラグインが効かないので注意してください。@gsap/react の useGSAP フックを使うと自動で後始末され、素のJSなら gsap.context() + revert() でまとめて破棄できます。gsap.matchMedia() で (prefers-reduced-motion: no-preference) を判定し、動きを許可している環境だけアニメーションを実行します。アクセシビリティ上、装飾的な動きは抑制できるようにしておきましょう。まとめ
- 導入:CDN(
jsdelivr)か npm。プラグインはregisterPluginで登録 - 基本:
to/from/fromTo、複数要素はstagger - 連続演出:
timelineで順序・重なりを宣言的に管理 - スクロール連動:
ScrollTrigger - 配慮:
prefers-reduced-motion、SPAではuseGSAP/gsap.contextでクリーンアップ - 2025年に完全無料化:全プラグインが商用含め無料
単純な動きはCSSで、複雑な演出はGSAPで。無料化でさらに使いやすくなったGSAPを、サイトの表現力アップに活用してみてください。

