GSAPガイド：Webデザイナーのための簡単アニメーションライブラリ！



# GSAP：Webデザイナーのためのアニメーション入門

## この記事の目的＆対象

**目的**

* GSAPの基本パラメータを押さえ、カンタンにアニメーションを実装する
* 主要プラグインと使いどころをサッと理解する

**対象**

* HTML/CSSの基礎がある方
* WEBサイトにアニメーションを組み込みたい方

---

## はじめに

GSAP（GreenSock Animation Platform）は、**高性能で自由度の高いJavaScriptアニメーションライブラリ**です。
2025年4月、Webflowのスポンサーにより、これまで有料だった高機能プラグインを含む**全機能が完全無料化**されました。

>【情報ソース】2025年4月30日、Webflow公式ブログにて全GSAP機能の無償開放が発表。
> ※公式ブログ：[https://webflow.com/blog/gsap-becomes-free](https://webflow.com/blog/gsap-becomes-free)

「どのパラメータをいじればいいんだ…？」と迷うことがないよう、本記事では**指定可能なパラメータ**と**主要プラグインの一覧**を、実例とともにまとめています。

---

## GSAPとは

### GSAPってなに？

GSAPは、Webページ上の要素を簡単にアニメーションさせることができるJavaScriptライブラリです。短く直感的なコードで、スライドやフェード、ズーム、回転といった基本的な動きから、テキスト演出、スクロール連動、SVGアニメーション、レイアウト遷移といった複雑な表現まで、リッチで多彩なアニメーションを実現できます。その柔軟性と拡張性により、Web上でのビジュアル表現の可能性は無限大です。

### GSAPでできること

* **スライド**：`x`/`y`パラメータ
* **フェード**：`opacity`
* **ズーム**：`scale`
* **回転**：`rotation`
* **テキストアニメ**：SplitTextプラグイン
* **スクロール連動**：ScrollTriggerプラグイン
* **SVGアニメ**：MorphSVG/DrawSVGプラグイン
* **レイアウト遷移**：Flipプラグイン



---

## 導入方法

### 1. CDN導入

```html
<!-- GSAP本体（必須） -->
<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/gsap.min.js"></script>

<!-- プラグインを使う場合は必要に応じて追加 -->
<!-- 例：ScrollTriggerを使いたい場合 -->
<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/ScrollTrigger.min.js"></script>
```
☑️ 補足
gsap.min.js は必ず必要ですが、各プラグイン（ScrollTrigger, SplitText, MorphSVG など）は使いたいものだけ個別に読み込む形式です。すべてのプラグインを読み込む必要はありません。

下記URLから使いたい機能にチェックを入れると必要なCDNの記述がコピーできます。

https://gsap.com/docs/v3/Installation/?checked=core%2CscrollTrigger&tab=cdn&module=esm&require=false

---

### 2. npm導入

```bash
npm install gsap
```

```js
import { gsap } from "gsap"
import { ScrollTrigger } from "gsap/ScrollTrigger"
// 必要なプラグインを登録
gsap.registerPlugin(ScrollTrigger)
```

下記URLから使いたい機能にチェックを入れると必要なnpm記述がコピーできます。

https://gsap.com/docs/v3/Installation/?checked=core%2CscrollTrigger&tab=npm&module=esm&require=false

---

## GSAPの基本構文

| メソッド            | 意味              |
| --------------- | --------------- |
| `gsap.from()`   | 指定した開始状態 → 現在状態 |
| `gsap.to()`     | 現在 → 指定した終了状態   |
| `gsap.fromTo()` | 指定開始状態 → 指定終了状態 |

### 例：フェードイン（from）

```js
gsap.from(".box", {
  opacity: 0,           // 最初は透明な状態から
  duration: 1,          // アニメーションの再生時間は1秒
  ease: "power2.out"    // ゆっくり始まり、なめらかに終了するイージング
});
```
![chrome-capture-2025-5-12x500.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047797/4ee60035-d4fe-4845-b17f-967af6991be2.gif)


### 例：スライドアウト（to）

```js
gsap.to(".box", {
  x: 200,              // 右方向に200px移動
  opacity: 0,          // 最終的に透明になる
  duration: 0.8,       // アニメーションの再生時間は0.8秒
  ease: "power1.in"    // すばやく加速して一気に終わる動き
});
```

![chrome-capture-2025-5-12-x500.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047797/3cd717b1-068f-42ef-8e86-498f3d21b73e.gif)



### 例：往復アニメーション（fromTo）

```js
gsap.fromTo(".box",
  { 
    x: -100,         // 左に100pxずれた位置から開始
    opacity: 0       // 最初は透明
  },
  { 
    x: 100,          // 右に100pxの位置まで移動
    opacity: 1,      // 最終的に不透明になる
    duration: 2,     // アニメーション時間は2秒
    repeat: -1,      // 無限に繰り返す
    yoyo: true       // 行ったあと逆方向に戻る（往復アニメーション）
  }
);
```

![chrome-capture-2025-5-12 (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047797/65912315-ca4c-4aeb-98ca-9e46b0d3f956.gif)


---

## GSAPで指定できる主なパラメータ

どの動きを細かく制御したいときに触るべきパラメータをカテゴリ別に整理しました。

| カテゴリ       | パラメータ                                                | 説明                      |
| ---------- | ---------------------------------------------------- | ----------------------- |
| **位置**     | `x`, `y`                                             | オフセット位置（pxまたは%）         |
| **透明度**    | `opacity`                                            | 0（透明）〜1（不透明）            |
| **大きさ**    | `scale`, `scaleX`, `scaleY`                          | 拡大・縮小                   |
| **回転**     | `rotation`, `rotationX`, `rotationY`                 | 角度（deg）                 |
| **色・背景**   | `backgroundColor`, `color`                           | CSSカラー                  |
| **サイズ・形状** | `width`, `height`, `borderRadius`                    | 要素サイズ、角丸                |
| **フィルター**  | `filter`, `blur`, `brightness`                       | CSSフィルター                |
| **時間制御**   | `duration`, `delay`, `repeat`, `repeatDelay`, `yoyo` | 時間、遅延、繰り返し              |
| **動きの緩急**  | `ease`                                               | イージング（例：`"power2.out"`） |
| **連携制御**   | `stagger`, `onStart`, `onUpdate`, `onComplete`       | 要素を順番に動かす、コールバック設定      |
| **クリア**    | `clearProps`                                         | アニメ終了後にスタイルをリセット        |

> **Point**：まずは `duration` / `delay` / `ease` に慣れ、そのあと `stagger` や `repeat` を試すとスムーズです。

---

## GSAPの主要機能＆プラグイン（徹底解説）

### ScrollTrigger（スクロール連動）

```html
<!-- CDN読み込みが必要 -->
<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/ScrollTrigger.min.js"></script>
```

```js
gsap.registerPlugin(ScrollTrigger);  // ScrollTrigger プラグインを登録

gsap.from(".section", {
  scrollTrigger: {
    trigger: ".section",              // スクロールを監視する要素
    start: "top 80%",                 // 要素の上端がビューポートの80%位置に来たとき開始
    end: "bottom 20%",                // 要素の下端がビューポートの20%位置に来たとき終了
    toggleActions: "play pause resume reset", // スクロールに応じた動作
    markers: true                     // デバッグ用マーカーを表示（start/end位置）
  },
  y: 50,                              // 下に50pxずれた位置から
  opacity: 0,                         // 透明な状態から
  duration: 1                         // 1秒でアニメーション
});
```

ScrollTrigger の4つのスクロールタイミング
```js
toggleActions: "1:onEnter 2:onLeave 3:onEnterBack 4:onLeaveBack"
```
1 onEnter　→ 下にスクロールして要素が画面に入ったとき（start を通過）
2 onLeave　→ 下にスクロールして要素が画面から出たとき（end を通過）
3 onEnterBack　→ 上にスクロールして要素が再び画面に入ったとき（end を戻った）
4 onLeaveBack　→ 上にスクロールして要素が画面から消えたとき（start を戻った）
 
| 設定項目     | 動作内容           |
| ------ | -------------- |
| play   | 再生    |
| pause  | 一時停止  |
| resume | 再開       |
| reset  | 最初の状態に戻す |
| none  | 指定なし |

* トリガー要素が画面に入った／出たタイミングで自在に制御可能です

![chrome-capture-2025-5-12-(3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047797/73a80ef5-8313-4b5e-a622-e170cc43de81.gif)


参考記事：GSAPのScrollTriggerでスクロールアニメーションを実装する方法
https://gri-t.com/gsap-scroll-trigger/

---

### Timeline（シーケンス制御）

```js
// タイムラインを作成（すべてのアニメーションに duration: 0.8秒, ease: "power1.out" を適用）
const tl = gsap.timeline({ defaults: { duration: 0.8, ease: "power1.out" } });

tl.from(".box01", { 
  y: 50,            // 下から50pxの位置から
  opacity: 0        // 透明な状態から
})
.from(".box02", { 
  x: -100,          // 左から100pxずれた位置から
  opacity: 0 
}, "-=0.4")         // 前のアニメーションの終了0.4秒前から開始
.from(".box03", { 
  scale: 0,         // 拡大0（小さい状態）から
  opacity: 0 
}, "-=0.4");        // これも前のアニメーションと0.4秒重ねて始める

```

* 複数アニメーションをまとめて管理。同期やズラすことができます

![chrome-capture-2025-5-12 (5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047797/1aaf0595-24b5-4920-b15f-3e2e38f65eb7.gif)

---

### Stagger（間隔をあける）

```js
gsap.from(".item", {
  opacity: 0,       // 最初は透明な状態から
  y: 20,            // 下に20pxずれた位置から開始
  stagger: 0.35,    // 各.itemが0.35秒ずつずれて順番に再生
  duration: 0.8     // 各アニメーションの時間は0.8秒
});
```

* リストやグリッドの要素を、少しずつタイミングをズラせます


![chrome-capture-2025-5-12 (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047797/f009e8c1-97b8-4ca6-9dec-c0f95c8d253d.gif)

---

### SplitText（文字分解アニメ）
```html
<!-- CDN読み込みが必要 -->
<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/SplitText.min.js"></script>
```
```js
gsap.registerPlugin(SplitText);  // SplitTextプラグインを有効化（CDN読み込み必須）

// .heading 要素のテキストを「文字」と「単語」に分解
const split = new SplitText(".heading", { type: "chars, words" });

// 各文字（chars）を順番にアニメーション
gsap.from(split.chars, {
  opacity: 0,       // 最初は透明
  y: 20,            // 下に20pxずれた位置から登場
  stagger: 0.05,    // 各文字が0.05秒ずれて順にアニメーション
  duration: 0.6     // 各文字のアニメーション時間は0.6秒
});
```

* 見出しやキャッチコピーを1文字ずつ、1単語ずつ登場させられます

![chrome-capture-2025-5-12 (6).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047797/cb26ab5f-78b3-473a-ae8b-798a14d56935.gif)

---

### MorphSVG（形状変形）
```html
<!-- CDN読み込みが必要 -->
<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/MorphSVGPlugin.min.js"></script>
```
```html
<svg viewBox="0 0 200 200">
  <path id="circle" d="M100,50 a50,50 0 1,0 0.01,0" />
  <path id="star" d="M100,30 L117,78 L170,78 L126,112 L143,160 L100,130 L57,160 L74,112 L30,78 L83,78 Z" style="display:none;" />
</svg>
```
```js
gsap.registerPlugin(MorphSVGPlugin); // MorphSVGPlugin を有効化（SVGの形を変形させる）

gsap.to("#circle", {
  morphSVG: "#star",         // #circle のパスを #star の形に変形させる
  duration: 1.5,             // アニメーション時間は 1.5秒
  ease: "power2.inOut"       // ゆっくり始まり、ゆっくり終わる自然な動き
});
```

* SVGを、滑らかに別の形へトランジションします

![chrome-capture-2025-5-12 (7).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047797/8af2a444-b29e-4c01-ba9d-9341e35b8e61.gif)

☑️補足
#circle と #star はSVGの ```<path>```である必要があります。

---

### Flip（レイアウト遷移）

```html
<!-- CDN読み込みが必要 -->
<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/Flip.min.js"></script>
```
```css
.card {
  width: 150px;
  height: 150px;
  background-color: #6495ed;
  border-radius: 10px;
  transition: all 0.3s ease;
  cursor: pointer;
}

.card.expanded {
  width: 300px;
  height: 300px;
  background-color: #ff7f50;
}
```
```js
gsap.registerPlugin(Flip);  // Flipプラグインを登録（有効化）

const state = Flip.getState(".card");  
// 変更前の .card の位置・サイズ・状態を記録

document.querySelector(".card").classList.toggle("expanded");  
// .card に "expanded" クラスを付け外し（スタイル変化をトリガー）

Flip.from(state, { 
  duration: 0.8,             // アニメーション時間（0.8秒）
  ease: "power2.inOut"       // ゆっくり始まり、ゆっくり終わる自然な動き
});
// 変更前後の差をもとに、なめらかに変化をアニメーションで再現
```

* ある要素の位置・サイズ・形状が変わったときに、その変化をなめらかにつないで見せることができます

![chrome-capture-2025-5-12-(10).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047797/eea240cc-6062-4905-b596-5de944fc2498.gif)

---

### DrawSVG（パス描画）

```html
<!-- CDN読み込みが必要 -->
<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/DrawSVGPlugin.min.js"></script>
```
```html
<svg viewBox="0 0 200 200">
  <path id="path" d="M100,50 a50,50 0 1,0 0.1,0" />
</svg>
```
```js
gsap.registerPlugin(DrawSVGPlugin);  // DrawSVGPlugin を登録（SVG線の描画アニメ用）

gsap.from("#path", {
  drawSVG: "0%",      // 線を長さ0％から描き始める（＝何も見えない状態から）
  duration: 2         // 2秒かけて完全に描画される
});
```

* SVGの線が「描かれる」ようにアニメーションします

![chrome-capture-2025-5-12-(11).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047797/683bbc43-b761-429f-ad6f-5709405f5844.gif)

☑️補足
#pathは ```<path>``` タグである必要があります。

---

### その他プラグイン一覧

| プラグイン            | 用途                        |
| ---------------- | ------------------------- |
| ScrollSmoother   | 滑らかなスクロール体験を実現            |
| Draggable        | 要素をドラッグ＆ドロップ可能に           |
| ScrollToPlugin   | 特定位置へスムーズスクロール            |
| Observer         | タッチ／ホイール／スクロールイベントを簡単に検知  |
| GSDevTools       | アニメーションタイムラインをGUIで操作・デバッグ |
| InertiaPlugin    | ドラッグ後の慣性スクロール／アニメーション     |
| MotionPathPlugin | 要素をSVGパスに沿って動かす           |

### その他のプラグイン（必要に応じてCDN追加）

| プラグイン名           | CDN例（必要なときのみ）                                                                                   |
| ---------------- | ----------------------------------------------------------------------------------------------- |
| ScrollSmoother   | `<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/ScrollSmoother.min.js"></script>`   |
| Draggable        | `<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/Draggable.min.js"></script>`        |
| InertiaPlugin    | `<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/InertiaPlugin.min.js"></script>`    |
| MotionPathPlugin | `<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/MotionPathPlugin.min.js"></script>` |
| Observer         | `<script src="https://cdn.jsdelivr.net/npm/gsap@3.13.0/dist/Observer.min.js"></script>`         |

---

## おわりに

GSAPのパラメータやプラグインを一通り押さえれば、動きのアイデアは無限大です。
まずはここに載せたサンプルをコピペ→変更→実験、のサイクルで慣れてみてください。

GSAP公式サイトにもたくさんの素敵なサンプルがあるのでぜひ試してみてください。
https://gsap.com/