GSAP Web制作 JavaScript

【GSAP】パララックスをScrollTriggerを使って実装する方法【アニメーションのサンプルあり】

2023年9月20日

※ 当サイトではアフィリエイト広告を利用しています

GSAPを使って、パララックスって作れる?

パララックスとは視差効果という意味ですが、言葉で解説するより見た方が早いと思います。

今回はGSAPを使った方法を解説するので、最初にGSAPの使い方を読みましょう。

あわせて読みたい
GSAPとは?基本的な使い方とアニメーションのサンプル付きで解説
GSAPとは?基本的な使い方とアニメーションのサンプル付きで解説

続きを見る

また、パララックスに関する記事は当ブログに他に4記事あります。

CSSのみでスマホ対応のパララックスを作る方法はこちら。

あわせて読みたい
CSSのみでスマホ対応のパララックスを作る方法【サンプル付きで解説】
CSSのみでスマホ対応のパララックスを作る方法【サンプル付きで解説】

続きを見る

スマホ対応パララックス『simpleParallax.js』の使い方はこちら

あわせて読みたい
スマホ対応パララックス『simpleParallax.js』の使い方【サンプル付きで解説】
スマホ対応パララックス『simpleParallax.js』の使い方【サンプル付きで解説】

続きを見る

Luxy.jsでパララックスと慣性スクロールを実装する方法はこちら。

あわせて読みたい
Luxy.jsでパララックスと慣性スクロールを実装する方法【JavaScriptのプラグイン】
Luxy.jsでパララックスと慣性スクロールを実装する方法【JavaScriptのプラグイン】

続きを見る

Swiperでパララックススライダーを作る方法はこちら。

あわせて読みたい
【Swiper】パララックススライダーを作る方法【サンプル付き】
【Swiper】パララックススライダーを作る方法【サンプル付き】

続きを見る

重要なコード以外は省略している箇所が多いので、全部見たい人はCodePen左上のHTML・CSS・JSをクリックして下さい。

じゅんぺいブログは、Web制作コーディングWordPress制作)の技術記事を中心に、約500記事公開しています。ぜひ他の記事も参考にしてみてください!
完全無料のプログラミングスクール『ZeroPlus Gate』
30日間でWeb制作を学べる無料のプログラミングスクールがこちら
いきなり数十万するプログラミングスクールは厳しい・・・という人のお試しに最適です。
現在は無料ですがいつ有料になるか分からないので、気になる方はお早めに👇
(有料になっていたらすいません🙇‍♂️)

\ 完全無料 /

ZeroPlus Gate公式サイト

毎日先着制!

GSAPでパララックスをScrollTriggerを使って実装する方法

それでは、GSAPでパララックスを実装する方法を解説していきます。

今回は、GSAPのプラグインScrollTriggerを使います。

あわせて読みたい
【GSAP】ScrollTriggerの使い方とスクロールアニメーションのサンプルを紹介
【GSAP】ScrollTriggerの使い方とスクロールアニメーションのサンプルを紹介

続きを見る

 

並ぶ要素を異なる速度でパララックス

まずは、横に並べた要素を異なる速度でパララックスしていきます。

HTMLの書き方はこちら。

<div class="container js-trigger">
  <div class="box box01"></div>
  <div class="box box02"></div>
  <div class="box box03"></div>
  <div class="box box04"></div>
  <div class="box box05"></div>
</div>

HTMLは、特筆するポイントはありません。

JavaScriptの書き方はこちら。

gsap.fromTo(
  ".box02", // アニメーションさせる要素
  {
    yPercent: 100, // 下に要素の幅の1倍分移動
  },
  {
    yPercent: -100, // 上に要素の幅の1倍分移動
    ease: "none", // イージングなし
    scrollTrigger: {
      trigger: ".js-trigger", // アニメーションのトリガー要素
      start: "top bottom", // アニメーション開始位置
      end: "bottom top", // アニメーション終了位置
      scrub: true, // 動作を遅くさせない
    },
  }
);
gsap.fromTo(
  ".box03", // アニメーションさせる要素
  {
    yPercent: 200, // 下に要素の幅の2倍分移動
  },
  {
    yPercent: -200, // 上に要素の幅の2倍分移動
    ease: "none", // イージングなし
    scrollTrigger: {
      trigger: ".js-trigger", // アニメーションのトリガー要素
      start: "top bottom", // アニメーション開始位置
      end: "bottom top", // アニメーション終了位置
      scrub: 1, // 動作が遅くなる
    },
  }
);
gsap.fromTo(
  ".box04", // アニメーションさせる要素
  {
    yPercent: 300, // 下に要素の幅の3倍分移動
  },
  {
    yPercent: -300, // 上に要素の幅の3倍分移動
    ease: "none", // イージングなし
    scrollTrigger: {
      trigger: ".js-trigger", // アニメーションのトリガー要素
      start: "top bottom", // アニメーション開始位置
      end: "bottom top", // アニメーション終了位置
      scrub: 2, // 動作が遅くなる
    },
  }
);
gsap.fromTo(
  ".box05", // アニメーションさせる要素
  {
    yPercent: 400, // 下に要素の幅の4倍分移動
  },
  {
    yPercent: -400, // 上に要素の幅の4倍分移動
    ease: "none", // イージングなし
    scrollTrigger: {
      trigger: ".js-trigger", // アニメーションのトリガー要素
      start: "top bottom", // アニメーション開始位置
      end: "bottom top", // アニメーション終了位置
      scrub: 3, // 動作が遅くなる
    },
  }
);

ちょっと長いので、箇条書きで補足します。

  • fromToはアニメーションの開始から終了まで指定するメソッド
  • easeのイージングは全てなし
  • triggerのアニメーションのトリガーは全て同じタイミング(.boxを囲っている親要素)
  • .box01はアニメーションなし
  • scrubはスクロール量に合わせてアニメーションさせるプロパティ
  • .box02scrub: trueで動作は遅れない
  • .box03〜.box05scrub: 数値は、数値が大きいほど動作が遅くなる
  • 最初のyPercentはアニメーション前の位置
  • 2つ目のyPercentはアニメーション後の位置

ポイントはscrubで、スクロール量に合わせてアニメーションさせているところです。

これを数値にすると、数値が大きいほど遅く動きます。

こちらがサンプルになります。

See the Pen
Untitled
by junpei (@junpei-sugiyama)
on CodePen.

確認するポイントは以下になります。

  • スクロールすると要素が異なる速度で動く
  • 1つ目と2つ目の要素は動き出すタイミングは同じで、動く速度は違う
  • 3〜5つ目はそれぞれ動き出すタイミングが遅れる

これは、何度も上下にスクロールして確認すると分かるかと思います。

 

画像をパララックス

次は、画像をパララックスさせます。

JavaScriptの書き方はこちら。

// セレクタ ".js-trigger" で要素を取得
const items = gsap.utils.toArray(".js-trigger");

// 各要素に対してアニメーションを設定
items.forEach((item) => {
  gsap.fromTo(
    item.querySelector("img"), // アニメーションを適用する画像要素を取得
    {
      yPercent: 0, // パララックス前の要素の位置
    },
    {
      yPercent: -20, // 上に要素の幅の1/5分移動
      ease: "none", // イージングなし
      scrollTrigger: {
        trigger: item, // アニメーションのトリガー要素
        start: "top bottom", // アニメーション開始位置
        end: "bottom top", // アニメーション終了位置
        scrub: 1, // 動作を遅らせる
      },
    }
  );
});

CSSで重要な箇所は2つだけです。

  • imgタグの親要素にclass名を付与(今回はjs-trigger
  • imgタグの親要素にheightoverflow: hidden;を指定

js-triggerはJavaScriptで使うclass名で、名前は任意です。

あとは、heightoverflow: hidden;ではみ出させる&はみ出した部分を隠すことで、動いているように見えます。

あとJavaScriptでyPercent: -20とありますが、これは『要素の幅の20%上に移動』と言う意味になります。

pxで指定もできますが、そうすると画像サイズに合わせて変えることができないので、今回はyPercentを使っています。

サンプルがこちらです。

See the Pen
Untitled
by junpei (@junpei-sugiyama)
on CodePen.

サンプルではちょっと大きく動かしていますが、上下が切れるので画像によっては注意が必要です(今回だと犬の耳が切れている)。

まとめ

今回は、GSAPを使ったパララックスの実装方法を解説しました。

パララックスは気が付かない程度の動きにするくらいが、ちょうどいいかと思います。

以上になります。

この記事が役に立ったと思ったら、シェアボタンからX(旧Twitter)などにシェアすると、いいねされてフォロワーが増えたりすることがあるよ!

 

  • この記事を書いた人

じゅんぺい

37歳からWeb制作とブログ開始。Web制作歴5年目でコーディングとWordPressオリジナルテーマ制作が中心。これまで120件以上を納品。当ブログ月間最高15万PVで、370記事以上はWeb制作の技術記事。コンテンツ販売→累計売上1200万円&1500部超え。X(旧Twitter)フォロワー7200人以上。2024年3月からブログの経験を活かしてライターとしても活動を開始。

-GSAP, Web制作, JavaScript
-