DigtalBloomStudio

Scroll Magic

top画像
Scroll Magic公式URL

スクロール位置に応じて要素のスタイルやアニメーションを制御可能

   
  CDNの読み込み
  <script src="//cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/ScrollMagic.min.js"></script>

  2行目デバック用
  <script src="//cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/debug.addIndicators.min.js"></script>
  

Scroll Magic トリガー

  
  コントローラーの作成
  const controller = new ScrollMagic.Controller();

  トリガーの作成
  const scene = new ScrollMagic.Scene({
    triggerElement: "#target",                //どの位置で発火させるか
    triggerHook: 'onEnter',                  //トリガーの位置 /onEnter/onLeave デフォルトはonCenter
    offset: 200,                            //スタート位置はトリガーから200px
    duration: 1000,                        //終了距離
    reverse:false,                        //逆戻りの時は実行しない
  })

  この要素を一定期間固定
  .setPin("#target", {pushFollowers: false})
  シーンのいろいろな情報が画面に表示され、アニメーションか名前を登録可能
  .addIndicators({name: "ScrollMagicAnim1"});

  作成したシーンを宣言したコントローラに設定
  scene.addTo(controller);
  
  
  TweenMaxなどでアニメーションを登録する場合
  トリガーの作成
  const scene = new ScrollMagic.Scene({
    triggerElement: "#target",                //どの位置で発火させるか
    triggerHook: 'onEnter',                  //トリガーの位置 /onEnter/onLeave デフォルトはonCenter
    offset: 200,                            //スタート位置はトリガーから200px
    duration: 1000,                        //終了距離
    reverse:false,                        //逆戻りの時は実行しない
  })

  TweenMaxなどでアニメーションを登録する場合
  .setClassToggle("#target","active")   //クラスのtoggle
  .setTween(tween);                    //発火時のアニメーションを登録

  scene.addTo(controller);
  

使用(デバック中)

Scroll Magic 1

Scroll Magic 2

Scroll Magic 3

  
  HTML
  <div class="main-container" id="main">

    <div id="project01" class="project">
      <div class="img"></div>
      <h1>Scroll Magic 1</h1>
    </div>

    <div id="project02" class="project">
      <div class="img"></div>
      <h1>Scroll Magic 2</h1>
    </div>

    <div id="project03" class="project">
      <div class="img"></div>
      <h1>Scroll Magic 3</h1>
    </div>

  </div>

  CSS
  .main-container {
    width: 100%;
    height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
  }
  .project {
    /* アニメーション設定 */
    opacity: 0;
    transform: translateY(50px);
    transition: opacity 0.6s ease-out, transform 0.6s ease-out;
    text-align: center;
    margin: 50px;
  }
  .project.fade-in {
    opacity: 1;
    transform: translateY(0);
  }
  .img {
    width: 200px;
    height: 200px;
    background-color:rgb(82,107,195);
    border-radius: 50%;
    margin: 0 auto;
  }
  .img {
    width: 200px;
    height: 200px;
    background-color:rgb(82,107,195);
    border-radius
    : 50%;
  }
  /* ScrollMagic デバッグ表示のフォント変更 - より強力なセレクタ */
  body div[style*="position"][style*="fixed"] {
  font-family: 'Courier New', monospace !important;
  font-size: 22px !important;
  font-weight: 900 !important;
  }
  
  
  JavaScript
  デバックは常に表示設定のコード
  
  // コントローラーの作成
  const controller = new ScrollMagic.Controller();

  // 各プロジェクトにフェードインアニメーションを適用
  const projects = ['#project01', '#project02', '#project03'];
    
  projects.forEach((project, index) => {
    new ScrollMagic.Scene({
      triggerElement: project,                            //どの位置で発火させるか
      triggerHook: 0.8,                                  // 要素が画面の80%の位置に来た時に発火
      reverse: true                                     // スクロールダウン時もアニメーションを適用
    })
    .setClassToggle(project, 'fade-in')
    .addIndicators({
      name: `トリガー位置目安 ${index + 1}フェード`,   // 右側の文字表示(STARTトリガー位置目安123フェード)
      colorStart: 'green',                          // 右側に緑の文字表示(STARTトリガー位置目安123フェード)の色                       
      colorTrigger: 'red',                         // 右側に赤の文字表示(TRIGGER)の色              
      indent: 200,                                // デバッグ表示を画面右端から200px左側に配置
    })
    .addTo(controller);
  });
  

細かい設定

名前 用途 コード例
どの位置で発火させるか どの位置で動かすか? triggerElement: "#ID",
トリガーが発火する画面上の位置を指定 要素が画面の一番下に入った瞬間に発火=1 triggerHook: 'onEnter'
トリガーが発火する画面上の位置を指定 要素が画面の中央に来た時に発火=0.5(デフォルト値) triggerHook: 'onCenter'
トリガーが発火する画面上の位置を指定 要素が画面の一番上に到達した時に発火=0 triggerHook: 'onLeave'
トリガーが発火する画面上の位置を指定 画面の80%の位置(上から80%の場所)に要素が来た時に発火 triggerHook: 0.8
スタート位置の調整 トリガー要素の位置でちょうど発火(デフォルト) offset: 0,
スタート位置の調整 トリガー要素より200px下でスタート offset: 200,
スタート位置の調整 トリガー要素より100px上でスタート offset: -100,
スタート位置の調整 画面の高さの50%分オフセット offset: "50%",
アニメーションの継続距離 スクロールを上下に動かすと、要素が出現・消失を繰り返す duration: 0,
アニメーションの継続距離 瞬時に完了(デフォルト) reverse: true
アニメーションの継続距離 300pxスクロールする間継続 duration: 300,
アニメーションの継続距離 1000pxスクロールする間継続 duration: 1000,
アニメーションの継続距離 画面の高さ分継続 duration: "100%",
アニメーションの継続距離 画面の高さの2倍分継続 duration: "200%",
アニメーションの継続距離 画面の高さ分継続(動的) duration: window.innerHeight,
発火タイミング繰り返し スクロールを上下に動かすと、要素が出現・消失を繰り返す reverse: true
発火タイミング繰り返し 一度表示された要素は、上にスクロールしても表示されたまま reverse: false

triggerHook値の視覚的説明

0 (onLeave) ← 要素がここに来ると発火
0.5 (onCenter) ← 要素がここに来ると発火
0.8 ← 要素がここに来ると発火
1 (onEnter) ← 要素がここに来ると発火
Top