(Sample)

GSAP (GreenSock Animation Platform)

GSAPは、高性能で柔軟なJavaScriptアニメーションライブラリです。要素の位置、サイズ、不透明度、回転など、さまざまなプロパティを簡単にアニメーションさせることができます。滑らかな動きと正確な制御が可能で、複雑なアニメーションも簡単に作成できます。

ScrollTrigger

ScrollTriggerは、スクロールに基づいたアニメーションを簡単に作成するためのGSAPプラグインです。スクロール位置に応じて要素のアニメーションをトリガーし、開始や終了のタイミングを精密に設定できます。ピン留め、スクラブ、パララックス効果など、多彩な機能を提供します。

HTML

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

GASPとScrollTriggerのJavaScriptファイルをCDNからインクルードします。

   <div class="section">
        <h2>フェードイン</h2>
        <img class="fade-in" src="https://picsum.photos/600/400?random=1" alt="サンプル画像1">
    </div>
(中略)

imgにはそれぞれの効果にふさわしいクラス名をつけています。画像はlorem picsumからランダムに取得しています。

CSS

        .zoom-in {
            transform: scale(0.8); /* ズームインの初期状態 */
        }
(中略)

それぞれの効果の初期状態を設定します。

JavaScript

gsap.registerPlugin(ScrollTrigger);

GSAPとScrollTriggerの初期化です。

        // フェードイン
        gsap.to(".fade-in", { // フェードインアニメーションを適用するターゲット要素
            scrollTrigger: {
                trigger: ".fade-in", // トリガー要素を指定
                start: "top 80%", // アニメーションを開始する位置
                end: "top 30%", // アニメーションを終了する位置
                scrub: true, // スクロールに応じてアニメーションを進行
            },
            opacity: 1, // アニメーション終了時の不透明度
            duration: 1 // アニメーションの持続時間
        });

        // ズームイン
        gsap.to(".zoom-in", { // ズームインアニメーションを適用するターゲット要素
            scrollTrigger: {
                trigger: ".zoom-in", // トリガー要素を指定
                start: "top 80%", // アニメーションを開始する位置
                end: "top 30%", // アニメーションを終了する位置
                scrub: true, // スクロールに応じてアニメーションを進行
            },
            opacity: 1, // アニメーション終了時の不透明度
            scale: 1, // アニメーション終了時の拡大率
            duration: 1 // アニメーションの持続時間
        });

       // スライドアップ
        gsap.to(".slide-up", { // スライドアップアニメーションを適用するターゲット要素
            scrollTrigger: {
                trigger: ".slide-up", // トリガー要素を指定
                start: "top 80%", // アニメーションを開始する位置
                end: "top 30%", // アニメーションを終了する位置
                scrub: true, // スクロールに応じてアニメーションを進行
            },
            opacity: 1, // アニメーション終了時の不透明度
            y: 0, // アニメーション終了時の垂直方向の位置
            duration: 1 // アニメーションの持続時間
        });

       // 回転
        gsap.to(".rotate", { // 回転アニメーションを適用するターゲット要素
            scrollTrigger: {
                trigger: ".rotate", // トリガー要素を指定
                start: "top 80%", // アニメーションを開始する位置
                end: "top 30%", // アニメーションを終了する位置
                scrub: true, // スクロールに応じてアニメーションを進行
            },
            opacity: 1, // アニメーション終了時の不透明度
            rotate: 0, // アニメーション終了時の回転角度
            duration: 1 // アニメーションの持続時間
        });

        // スライドダウン
        gsap.to(".slide-down", { // スライドダウンアニメーションを適用するターゲット要素
            scrollTrigger: {
                trigger: ".slide-down", // トリガー要素を指定
                start: "top 80%", // アニメーションを開始する位置
                end: "top 30%", // アニメーションを終了する位置
                scrub: true, // スクロールに応じてアニメーションを進行
            },
            opacity: 1, // アニメーション終了時の不透明度
            y: 0, // アニメーション終了時の垂直方向の位置
            duration: 1 // アニメーションの持続時間
        });

        // フリップイン
        gsap.to(".flip-in", { // フリップインアニメーションを適用するターゲット要素
            scrollTrigger: {
                trigger: ".flip-in", // トリガー要素を指定
                start: "top 80%", // アニメーションを開始する位置
                end: "top 30%", // アニメーションを終了する位置
                scrub: true, // スクロールに応じてアニメーションを進行
            },
            opacity: 1, // アニメーション終了時の不透明度
            rotateY: 0, // アニメーション終了時のY軸の回転角度
            duration: 1 // アニメーションの持続時間
        });

        // バウンスイン
        gsap.to(".bounce-in", { // バウンスインアニメーションを適用するターゲット要素
            scrollTrigger: {
                trigger: ".bounce-in", // トリガー要素を指定
                start: "top 80%", // アニメーションを開始する位置
                end: "top 30%", // アニメーションを終了する位置
                scrub: true, // スクロールに応じてアニメーションを進行
            },
            opacity: 1, // アニメーション終了時の不透明度
            scale: 1, // アニメーション終了時の拡大率
            ease: "bounce.out", // バウンス効果を指定
            duration: 1 // アニメーションの持続時間
        });

        // ワープイン
        gsap.to(".warp-in", { // ワープインアニメーションを適用するターゲット要素
            scrollTrigger: {
                trigger: ".warp-in", // トリガー要素を指定
                start: "top 80%", // アニメーションを開始する位置
                end: "top 30%", // アニメーションを終了する位置
                scrub: true, // スクロールに応じてアニメーションを進行
            },
            opacity: 1, // アニメーション終了時の不透明度
            skewX: 0, // アニメーション終了時のX軸の傾き角度
            duration: 1 // アニメーションの持続時間
        });

        // フラッシュ
        gsap.to(".flash", { // フラッシュアニメーションを適用するターゲット要素
            scrollTrigger: {
                trigger: ".flash", // トリガー要素を指定
                start: "top 80%", // アニメーションを開始する位置
                end: "top 30%", // アニメーションを終了する位置
                scrub: true, // スクロールに応じてアニメーションを進行
            },
            opacity: 1, // アニメーション終了時の不透明度
            repeat: 3, // アニメーションを3回繰り返す
            yoyo: true, // アニメーションの方向を反転させる
            onComplete: () => { // アニメーション完了時のコールバック
                gsap.set(".flash", { opacity: 1 }); // 最終的に表示された状態に設定
            },
            duration: 0.1 // アニメーションの持続時間
        });

        // ストレッチイン
        gsap.to(".stretch-in", { // ストレッチインアニメーションを適用するターゲット要素
            scrollTrigger: {
                trigger: ".stretch-in", // トリガー要素を指定
                start: "top 80%", // アニメーションを開始する位置
                end: "top 30%", // アニメーションを終了する位置
                scrub: true, // スクロールに応じてアニメーションを進行
            },
            opacity: 1, // アニメーション終了時の不透明度
            scaleX: 1, // アニメーション終了時の水平方向の拡大率
            duration: 1 // アニメーションの持続時間
        });
 

以上がGSAPとScrollTriggerを使った画像効果の解説です。