63
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

un-T factory! XA Advent Calendar 2020Advent Calendar 2020

Day 19

GSAPのスクロールアニメーションライブラリ「ScrollTrigger」入門

Last updated at Posted at 2020-12-18

最後参考にも記載していますが、以下は【2020年最新】GSAPの「ScrollTrigger」を使って爆速でスクロールアニメを実装するを構成の参考にさせていただき、公式ドキュメントを要約したものになります。

申し訳ありません、お手数ですが本記事の中の codepen は倍率を ×0.5 にしてご覧ください

#ScrollTrigger とは
GSAP(GreenSock Animation Platform)から、2020年5月にリリースされた、「スクロールアニメーション」のためのプラグインであり、とても簡単な記述によって複雑なスクロールアニメーションを実現することができます。

昨今、様々なスクロールアニメーションのためのライブラリやAPIが使用されていますが、その中でも一線を画する機能を備えています。

##ScrollTriggerの特徴
主な特徴として以下が上げられると思います。

  • アニメーションを特定の要素にリンクさせることができる
  • マーカーによってデバックや作成が容易
  • スクロールにリンクした動きを簡単に作成できる
  • 特定のスクロール位置の間で要素を固定できるピン留め機能
  • コールバックの充実

それぞれ見ていきます。

##使い方
最初に一番簡単にScrollTriggerを使用してアニメーションさせてみます。

See the Pen GRjEEzL by watanabe (@watanabe-hazime) on CodePen.

倍率を ×0.5 にしてご覧ください

黒いボックスが画面中央に来た時にアニメーションが発火したかと思います。


gsap.to('.box', { // .box => アニメーションさせる要素
  x: 400, // アニメーションの内容
  scrollTrigger: {
    trigger: '.box', // トリガーとなる要素(アニメーションの開始、終了の位置決定に使用する)
    start: 'center center', // アニメーションの開始位置の指定
  }
});

上記のアニメーションはこちらのコードにあるように、

  1. アニメーションさせる要素を指定
  2. アニメーションの内容を指定
  3. トリガーとなる要素を指定
  4. アニメーションの開始位置の指定

これだけで実装しています。
さて、ここでわかりにくいのが start の指定方法ですね。

###アニメーションの範囲指定


start: 'center center', 

上記コードで言うと
左側の center が「トリガーとなる要素」における位置
右側の center が「ブラウザの画面内」における位置
をそれぞれ指定しています。
指定の方法は色々あり、例えばtop、center、bottomと指定すると
image.png
画像におけるそれぞれの位置を指定することができ、他にも
「20%」「−80%」「top+=300px」「bottom-=50%」など色々な指定方法により柔軟に対応することが可能です。

これら、指定した2つの位置が交差したタイミングでアニメーションが発火します。
つまり上記サンプルの場合は、.box の中心(center)が、画面の中心(center)と交差した時に要素を右に400px動かす、という指定をしていることになります。

と言っても、いやどこなんだよ、わかりづらいわ、となりますよね、、、
大丈夫です、このわかりずらさを見事に解消してくれるマーカー機能があります。

###マーカー

See the Pen how to markers by watanabe (@watanabe-hazime) on CodePen.

倍率を ×0.5 にしてご覧ください

gsap.to('.box', {
  x: 400,
  scrollTrigger: {
    trigger: '.box',
    start: 'center center',
    markers: true,  // マーカーを表示させる
  }
});

のマーカーが表示されていると思います。
表示されているマーカー start scroller-start が交差したタイミングでアニメーションが開始します。
ここでは start は「トリガーとなる要素」における指定位置を表し、scroller-start は「ブラウザの画面内」における指定位置を表します。

これでアニメーションの開始位置が非常にわかりやすくなりましたよね。
え、end なるものがある?はい、この後説明します。(説明するまでもなさそうですが、、)

##ScrollTriggerによって簡単に実装できる複雑な機能
ここまででScrollTriggerを触る上での最低限の説明はできたかと思いますので、ここからScrollTriggerを使用することで簡単に実装できる機能を紹介していきます。

###スクロールにリンクした動き

See the Pen LYRLemv by watanabe (@watanabe-hazime) on CodePen.

倍率を ×0.5 にしてご覧ください

gsap.to('.box1', {
  x: 400,
  scrollTrigger: {
    trigger: '.container',
    start: 'center 70%',
    end: 'center 30%', // アニメーションの終了位置の指定
    scrub: true, // スクロールの進捗とアニメーションの進捗をリンクさせる
  }
});

上記のサンプルでは、
.container の中心が、画面の(上から)70%の位置と交差した時にアニメーションが開始され、
.container の中心が、画面の(上から)30%の位置と交差した時にアニメーションが終了し、
スクロールに合わせてこれが繰り返されます。(x:0 〜 x:400を行き来する)

scrub の値に数値を指定することで遅延させることができ(スムーズに追いつきます)、数値が大きくなるほど遅延が大きくなります。
またこの際、数値は秒単位で指定します。
上記サンプルの下のボックスには scrub に「2」を指定しているので、2秒遅延してスムーズに追いつくアニメーションになります。

###ピン留め

See the Pen how to pin by watanabe (@watanabe-hazime) on CodePen.

倍率を ×0.5 にしてご覧ください

gsap.to('.box', {
  x: 400,
  scrollTrigger: {
    trigger: '.container',
    start: 'top center-=20%',
    end: 'bottom center-=100px',
    markers: true,
    scrub: true,
    pin: true, // start から end で指定した間、トリガー要素を固定表示させる
  }
});

pin を「true」とすること、start から end で指定した間をスクロールした時に、トリガー要素を固定表示させることができます。

基本はこれだけで大丈夫です。
ただ、色々な場合に備えて複数の補助設定が可能になっています。

properties
pinSpacing pin を設定するとデフォルトでは、固定表示が終わったタイミングで次のコンテンツが追いつくように、他の要素を下に押し下げるために下方にパディングが設定されます。
また false にすることでパディング無しにできます。
( margin にするとパディングではなくマージンで設定される)
anticipatePin 基本 1 に設定。(デフォルトは 0 )
pin を設定した際、素早くスクロールしたときにピン留めが少し遅れることがあります。anticipatePin に数値を設定することで少し早めにピン留めさせることで解決させることができます。

##コールバック
便利なコールバックを一部紹介します。

callback
onEnter スクロール位置が start を超えて前方に移動したときのコールバック
onEnterBack スクロール位置が end を過ぎて後方に移動したときのコールバック
onLeave スクロール位置が end を超えて前方に移動したときのコールバック
onLeaveBack スクロール位置が start を過ぎて後方に移動したときのコールバック
onRefresh リフレッシュ(通常はリサイズイベント)が発生した時に、ScrollTriggerに全ての位置を再計算させるためのコールバック
onUpdate スクロールトリガーの進捗状況が変化するたびに呼び出されるコールバック
onToggle スクロール位置が start または end を超えた時のコールバック

これらのコールバックは、ScrollTriggerインスタンスを受け取ることができます。
ScrollTriggerインスタンスのプロパティを一部紹介します。

properties, methods
progress 進行状況( start から end で指定した間での進行状況を0(開始)〜1(終了)で取得 )
direction 1 を前方、-1 を後方としたスクロールの方向を取得
isActive スクロール位置が start から end で指定した間にある場合にのみ true になる
getVelocity() スクロール速度をピクセル/秒単位で取得

下記にそれぞれのサンプルを置いております。

onEnter, onEnterBack, onLeave, onEnterBack

See the Pen how to callback 01 by watanabe (@watanabe-hazime) on CodePen.

倍率を ×0.5 にしてご覧ください

onUpdate
表示は上から progress, direction, isActive, getVelocity()

See the Pen how to onUpdate() by watanabe (@watanabe-hazime) on CodePen.

倍率を ×0.5 にしてご覧ください

onToggle
サンプルとして発火の度にインクリメントさせています

See the Pen zYKzRpO by watanabe (@watanabe-hazime) on CodePen.

倍率を ×0.5 にしてご覧ください

##その他

  • timelineと組み合わせることもできます
  • 更新のスロットリング、スクロール時の労力を最小限に抑えるための交差点の事前計算、変換の活用、GPU を利用するための要素のレイヤー化など、あらゆる種類のテクニックを使用してパフォーマンスを最大化、最適化されています。
  • (当たり前ですが、、)GSAPをベースに構築されています。
  • もちろん、IE11でも問題なく動きます。(私が試した範囲では問題ありませんでした。)

##所感

  • 普通のクラスの操作や簡単な実装であれば、スクラッチや IntersectionObserver などでいいかと思いました。
    複雑な処理(スクロールにリンクした動き、ピン留め)など、上記のものでは実装が大変な場合や、面倒な場合には、ScrollTrigger を使用することでとても簡単に実装できるものが多いかもしれません。
  • ファイルサイズも大きい訳ではありませんが、GSAPも一緒に入れる必要がありますので、GSAPを入れている場合(入れたい場合)で複雑なスクロールアニメーションを実装する必要がある場合には、積極的に採用してもいいかもしれませんね。

##参考
【2020年最新】GSAPの「ScrollTrigger」を使って爆速でスクロールアニメを実装する
ScrollTrigger公式ドキュメント

63
48
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?