jQueryプラグイン「ScroolMagic」2系でよく使う機能を紹介します

jQueryプラグイン「ScroolMagic」2系でよく使う機能を紹介します

Kazuya Takato

Kazuya Takato

こんにちは、づやです。

前回ScrollMagic2系について下記の記事を書きましたが、基本的な使い方しか書けなかったので、今回はよく使う機能について書きたいと思います。

個人的にTweenMaxをよく使うので、animation.gsap.jsを読み込んでる状態での記事となります。

setClassToggle

スクロールの位置によってクラスを付けかえたいときは非常によくあるかと思います。そんなときは、スクロールに応じてクラスを付けたり外したりしてくれるsetClassToggleの出番。

<ul>
   <li id="list1"><a href="#block1">1番目</a></li>
   <li id="list2"><a href="#block2">2番目</a></li>
   <li id="list3"><a href="#block3">3番目</a></li>
</ul>
<section id="block1">
  ここにいろいろ書きます
</section>
<section id="block2">
 ここにいろいろ書きます
</section>
<section id="block3">
  ここにいろいろ書きます
</section>

styleは省略しますが、上記のようなマークアップをしておいて下のような記載をします。

// 全体を制御するコントローラをつくります。
var controller = new ScrollMagic.Controller();

// トリガーになる位置を指定してアニメーションを設定します。
var scene = new ScrollMagic.Scene({
			triggerElement: "#block1", // シーンで発火の対象となる要素を指定しましょう。
			duration :400 // スクロールの距離をpxで記載します(2系は%でもいけます)。
		})
		.setClassToggle("#list1", "active") // セレクタ,class名を渡します。対象のセレクタにトリガーのタイミングで対象のセレクタのクラスを付けたり外したりしてくれます。
		.addIndicators()
		.addTo(controller);

var scene2 = new ScrollMagic.Scene({
	triggerElement: "#block2",
	duration :400
})
		.setClassToggle("#list2", "active")
		.addIndicators()
		.addTo(controller);

var scene3 = new ScrollMagic.Scene({
	triggerElement: "#block3",
	duration :400
})
		.setClassToggle("#list3", "active")
		.addIndicators()
		.addTo(controller);

実際に書く場合はfor文とかを使ってもっとコンパクトに書けますが、1個1個書いていくとこんな感じになります。
このように書くことで、スクロールに応じて対象のliにactiveクラスを付けたり外したりしてくれます。当然liだけでなく、他の要素にクラスを付けたり外したりも可能です。
対象のクラスにtransitionを設定しておけばアニメーションをさせることもできるので、なかなか便利です。

enterとleave

setClassToggleはクラスの付け替えをしてくれますが、そうじゃなくて独自にもっといろいろおこないたいときもありますよね。
そんなときは、スクロールに応じて指定した動きをおこなえるイベントenterとleaveを設定することで実現できるようになります。

マークアップは先ほどの例と同じだとして、下記のような記載をします。

// 全体を制御するコントローラをつくります。
var controller = new ScrollMagic.Controller();

// トリガーになる位置を指定してアニメーションを設定します。
var scene = new ScrollMagic.Scene({
		triggerElement: "#block1", // シーンで発火の対象となる要素を指定します。
		duration :400 // 対象のスクロール距離です。設定しないとleaveが発火しない模様。
	})
	.on("enter" , function(e){ // triggerElement(と指定したtriggerHook)に到達したタイミングで呼ばれます。
		console.log("enter");
		console.log(e); // progress(0から1の間で現在のパーセンテージの値)などいろいろ入ってます。
	})
	.on("leave" , function(e){ // triggerElement(と指定したtriggerHook)の外に到達したタイミングで呼ばれます。
		console.log("leave");
		console.log(e); // enterのときとおんなじ情報がとれます。
	})
	.addIndicators()
	.addTo(controller);

動作の仕組み自体はsetClassToggleとほぼ同様ですが、独自に処理をかけるので用途が広がります。個人的にはprogressの値に応じて、何かを動かしたいときに使うことが多いです。

LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

1983年生まれ。SIerとしてのキャリアをスタートし、JavaやC#を中心に多岐にわたる開発プロジェクトにエンジニアとして参加。その経験を活かし、LIGを創業。バックエンドおよびフロントエンドエンジニアとしての深い知識と経験をもとに、多様なプロジェクトに従事。2023年7月には社長室室長に就任にし、社内の体制やルールの最適化、AI技術の推進など、経営戦略の一翼を担っています。

このメンバーの記事をもっと読む