【JavaScript】アニメーションライブラリ「GSAP」の使い方|導入・to/from・timeline・ScrollTrigger・無料化まで

【JavaScript】アニメーションライブラリ「GSAP」の使い方 JavaScript

リッチな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年にGSAPは100%無料化
2025年4月、GSAPは Webflow傘下で完全無料になりました。これまで有料(Club GSAP)だった SplitText / MorphSVG / DrawSVG / ScrollSmoother などのプラグインも、商用利用を含めてすべて無料で使えます。導入のハードルが大きく下がりました。
スポンサーリンク

GSAPの導入

手軽に試すならCDN、開発環境では npm が便利です。CDNは最新の3.x系を読み込む例です(本番ではバージョンを固定するのが安全です)。

HTML:CDNで読み込む
<!-- コア本体 -->
<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:インストール
npm install gsap
JavaScript:import とプラグイン登録
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";

// プラグインは使う前に登録が必要
gsap.registerPlugin(ScrollTrigger);

基本:to / from / fromTo

GSAPの中心は「ある状態へ補間する(トゥイーン)」ことです。to は現在の状態から指定値へ、from は指定値から現在の状態へアニメーションします。

JavaScript:to / from / fromTo
// 現在の状態 → 指定した状態へ
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 }  // 終了
);
xtransform で動く
GSAPの x / y は CSS の transform: translate() を使うため、left / top よりも高速で滑らかです。回転は rotation、拡大縮小は scale で指定できます。

複数要素を時間差で動かす(stagger)

同じセレクターに一致する複数要素を少しずつ遅らせて動かすと、リズムのある演出になります。stagger に秒数を指定するだけです。

JavaScript:stagger で順番にフェードイン
// .card を 0.15 秒ずつ遅らせて順番に表示
gsap.from(".card", {
  y: 30,
  opacity: 0,
  duration: 0.6,
  stagger: 0.15, // 要素ごとの時間差
});

timeline で連続・重ねアニメーション

複数のアニメーションを順番に並べたり、少し重ねたりするには gsap.timeline() を使います。defaults で共通設定をまとめられ、位置パラメータで再生タイミングを調整できます。

JavaScript:timeline
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 で登録します。

JavaScript:ScrollTrigger
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〜4backelasticbounce など多彩です。

JavaScript:イージング
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() を使えば、動きを許可している環境だけアニメーションを実行できます。

JavaScript:prefers-reduced-motion を尊重する
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 フックを使うと、自動でクリーンアップされます。

JavaScript(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>
  );
}
素のJSなら 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)

QGSAPは無料で使えますか?
Aはい。2025年4月にWebflow傘下で100%無料になりました。以前は有料だった SplitTextMorphSVG などのプラグインも、商用利用を含めてすべて無料で使えます。
QCSSアニメーションと何が違いますか?
AGSAPは複雑なシーケンスやタイムライン制御、スクロール連動、SVGアニメーションなどを直感的なコードで書けます。単純なホバーや状態変化はCSSで十分なので、表現が複雑になってきたらGSAPを検討するのが目安です。
Qプラグイン(ScrollTriggerなど)はどう使いますか?
Aコア本体に加えてプラグインを読み込み、gsap.registerPlugin(ScrollTrigger) のように使う前に登録します。登録を忘れるとプラグインが効かないので注意してください。
QReactで使うとアニメーションが残る・二重再生されます。
A再描画やアンマウント時のクリーンアップが必要です。@gsap/reactuseGSAP フックを使うと自動で後始末され、素のJSなら gsap.context()revert() でまとめて破棄できます。
Q動きが苦手なユーザーへの配慮はできますか?
Agsap.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を、サイトの表現力アップに活用してみてください。