HighLab

scrollmagic + gsapアニメーションの使い方

  • 公開日:
  • 更新日:
  • 文字数:5657文字

読み込み

<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/ScrollTrigger.min.js"></script>

基本的な書き方

gsap.fromTo(
  ".ani-fade", // アニメーションさせる要素
  {
    y: 100, // アニメーション開始前の縦位置(下に100px)
    autoAlpha: 0, // アニメーション開始前は透明
  },
  {
    y: 0, // アニメーション後の縦位置(上に100px)
    autoAlpha: 1, // アニメーション後に出現(透過率0)
    scrollTrigger: {
      trigger: ".ani-fade", // アニメーションが始まるトリガーとなる要素
      //toggleActions: "play none none reverse", // 上スクロールで戻る
      start: "top center", // アニメーションの開始位置
      markers: true, // マーカー表示
    },
  }
);

クラス名「ani-fade」に対して
・初期値をtop:100px,opacity:0%に設定
・発火位置をstartで示している
'start: "top center", // アニメーションの開始位置
最初のtopは.ani-fadeの位置を示している。
最後のcenterは画面の位置を示している。
今回だとtiggerで設定した.ani-fadeの要素の最初と画面の中央が重なった時に、発火される。

一度だけ発火させたい場合

    scrollTrigger: {
      trigger: ".ani-fade", // アニメーションが始まるトリガーとなる要素
      toggleActions: "play none none reverse", // 上スクロールで戻る
      start: "top center", // アニメーションの開始位置
      markers: true, // マーカー表示
      once: true // 一度だけ発火
    },

once: trueを追加させてあげる

classがページ内に複数ある場合

// すべての ".ani-fade" 要素を取得
    const elements = document.querySelectorAll(".ani-fade");

    // 各要素に対してアニメーションを適用
    elements.forEach(element => {
        gsap.fromTo(
            element, // アニメーションさせる要素
            {
                y: 40, // アニメーション開始前の縦位置(下に100px)
                autoAlpha: 0, // アニメーション開始前は透明
            },
            {
                y: 0, // アニメーション後の縦位置(上に100px)
                autoAlpha: 1, // アニメーション後に出現(透過率0)
                scrollTrigger: {
                    trigger: element, // アニメーションが始まるトリガーとなる要素
                    toggleActions: "play none none reverse", // 上スクロールで戻る
                    start: "top-=100 center", // アニメーションの開始位置
                    markers: true, // マーカー表示
                    once: true // 一度だけ発火
                },
            }
        );
    });

横に並んだ要素が順番に下からフェードイン

gsap.fromTo(
  ".delay_ani", // アニメーションさせる要素
  {
    y: 20, // アニメーション開始前の縦位置(下に100px)
    autoAlpha: 0, // アニメーション開始前は透明
  },
  {
    y: 0, // アニメーション後の縦位置(上に100px)
    autoAlpha: 1, // アニメーション後に出現(透過率0)
    stagger: 0.2, // 0.2秒遅れて順番に再生
    scrollTrigger: {
      trigger: ".delay_ani", // アニメーションが始まるトリガーとなる要素
      toggleActions: "play none none reverse", // 上スクロールで戻る
      start: "top center", // アニメーションの開始位置
      markers: true, // マーカー表示
    },
  }
);

読み込みが終わった後にアニメーション実行したいので$(function () {})をつける

$(function () {
        // すべての ".ani-fade" 要素を取得
        const elements = document.querySelectorAll(".ani-fade");

        // 各要素に対してアニメーションを適用
        elements.forEach(element => {
            gsap.fromTo(
                element, // アニメーションさせる要素
                {
                    y: 20, // アニメーション開始前の縦位置(下に100px)
                    autoAlpha: 0, // アニメーション開始前は透明
                },
                {
                    y: 0, // アニメーション後の縦位置(上に100px)
                    autoAlpha: 1, // アニメーション後に出現(透過率0)
                    duration: .5, // アニメーションの所要時間(秒)を設定
                    scrollTrigger: {
                        trigger: element, // アニメーションが始まるトリガーとなる要素
                        //toggleActions: "play none none reverse", // 上スクロールで戻る
                        start: "top-=100 center", // アニメーションの開始位置
                        markers: false, // マーカー表示
                        once: true // 一度だけ発火
                    },
                }
            );
        });

        gsap.fromTo(
        ".delay_ani", // アニメーションさせる要素
        {
            autoAlpha: 0, // アニメーション開始前は透明
        },
        {
            autoAlpha: 1, // アニメーション後に出現(透過率0)
            stagger: 0.2, // 0.2秒遅れて順番に再生
            scrollTrigger: {
            trigger: ".delay_ani", // アニメーションが始まるトリガーとなる要素
            //toggleActions: "play none none reverse", // 上スクロールで戻る
            start: "top center", // アニメーションの開始位置
            markers: false, // マーカー表示
            },
        }
        );
    })

環境構築

インストール

npm install scrollmagic

npm install gsap -s

インポート

import {TweenMax} from "gsap";

TweenMax.to();

Scroll Magic

const controller = new ScrollMagic.Controller();

triggerHook: "onEnter", "onLeave",デフォルトは"onCenter"

Sceneの中に記述(triggerElementと同じオブジェクト内)

(例) triggerHook:'onEnter',


reverse:false,true

スクロールを戻した時にアニメーションの逆再生を行うか


 

 

 

gsapの設定

var speed = 1;
var tween = TweenMax.to('#bgcolor', speed, {
backgroundColor: '#4caf50'
})

magic scrollのつなげ込み

.setTween(tween)


setTween() due to missing Plugin 'animation.gsap'. Please make sure to include plugins/animation.gsap.js

 

上記のようなエラーがでます。

 


そこでplugins/animation.gsap.jsを読み込む必要がありますが、webpackで使用する際に一つプラグインをインストールする必要があります。

 

npm install --save-dev imports-loader

インストール後インポートしてあげます。

import 'imports-loader?define=>false!scrollmagic/scrollmagic/uncompressed/plugins/animation.gsap';

参考

https://qiita.com/tmw/items/b0df1a16cccc927d7a26

webpack2系はこれでいけるかんじなんですが、webpack4系でやってたらどうしてもエラーがでてしまいましたので、

調べてみた結果


scrollmagic-plugin-gsapを使います。

npm install --save scrollmagic-plugin-gsap

webpack v4系

scrollmagic 2.0.5

import TweenMax from "gsap";
import * as ScrollMagic from "scrollmagic";
import { gsap } from "gsap";
import { ScrollMagicPluginGsap } from "scrollmagic-plugin-gsap";
ScrollMagicPluginGsap(ScrollMagic, gsap);

これでなんとか設定していけました。

以外にややこしい

参考

https://www.npmjs.com/package/scrollmagic-plugin-gsap