はじめに
今回は、GSAPのScrollTriggerとposition stickyでスクロール連動の固定アニメーションの作り方をまとめました。案件で遭遇した時は随時この記事で追加していく予定です。
デモ数が多くコードの解説は少なめなので実際のCodePen上でコードを見てほしいのと、左の目次に実装例が載っていますので気になる実装がありましたら飛んでみてください🚀
全体
JavaScriptで操作するクラスとして固定させる要素を.js-sticky
、画像などを.js-sticky-img
としています。
また、スクロール連動アニメーションを使う際に素のままだとアニメーションに違和感が出るので全てのデモで慣性スクロールライブラリーのLenisを使って実装しています。
👇️全てで使っているLenisのコード
それぞれのデモの表現はscroll()メソッドに記述しています。
それではデモを見ていきましょう!
【デモ01】画像が重なる表現
最初はヒーローセクションでスクロールすると画像が重なる表現になります。
HTML
最初に書いたように固定させる要素を.js-sticky
で囲って、重なる画像には.js-sticky-img
クラスを付けて中に入れてます。
CSS
画像が重なるように.js-sticky
にposition: stickyを設定しています。
JavaScript
これだけで画像が重なる表現が実現できます!
画像がパララックスみたいになるように.js-sticky-img
にy: -100を設定しscrollTriggerのendの位置までに100px上に動くようにしています!
【デモ02】画像が途中で重なる表現
文章で説明するのが難しいのですが、2つ目のデモは画像が途中で重なる表現になります。
こちらは最初のデモと似たような表現になるので最初のデモのコードの変更点は少ないです。
HTMLは変わらずなのでCSSとJavaScriptを見ていきましょう!
CSS
CSSは以下が変更点になります。
画像が途中で重なるのでtopで画像を固定する位置を決めます。ここではCSSカスタムプロパティを使いJavaScriptで操作するようにします。
heightに関しては100vhからoffsetの値を引くことで最後の画像に到達したらスクロールできるようになります。
JavaScript
JavaScriptはScrollTrigger部分は最初のと変更はありません。
画像を固定する位置をCSSカスタムプロパティで設定するのでその部分だけ追加します。
【デモ03】カードコンポーネントがスクロールに応じて奥に移動する表現
デモ03はカードコンポーネントがスクロールに応じて奥に移動する表現になります。
ScrollTriggerでスクロールに応じてscaleを小さくすることで実現してます。
それでは見ていきましょう!
HTML
カードコンポーネントになりますので、.c-card
クラスを付けています。
CSS
CSSに関しては最初のデモと変わりはないです。カードコンポーネントのスタイルについてはCodePenのコードを見てください。
JavaScript
最初に書いたようにscaleとyPercentを変更することでカードコンポーネントが奥に移動するようにしています。また、isLastIndex
で最後の要素かどうかを判定し、最後の要素以外のカードコンポーネントを奥に移動させています。
【デモ04】フッターが隠れながら表示する表現
デモ04はフッターが隠れながら表示する表現になります。
フッターが隠れながら表示するだけならposition: stickyだけで実現できます!フッターが見えた時にフェードインするようにScrollTriggerを使っている感じですね!
HTML
HTMLはfooter要素に.js-sticky
クラスを付け、テキストをJSでフェードインさせるために.js-sticky-text
クラスを付けています。
CSS
フッターが隠れながら表示するようにするにはposition: stickyを設定してbottom: 0を設定します!
JavaScript
JavaScriptはテキストをフェードインさせるだけなので👇️のようになります!
これだけで簡単にフッターが隠れながら表示する表現になりますね!
【デモ05】横にある画像がスクロールに応じて切り替わる表現
デモ05は横にある画像がスクロールに応じて切り替わる表現になります。
HTML
HTMLはテキストと画像を左右で分けます。テキストの子要素には.js-sticky-text
クラスを付け、画像には.js-sticky-img
クラスを付けて個数分用意します。
CSS
重要な箇所のみ抜粋します。
画像.img
にposition: stickyを設定し固定するようにしてます。
また、任意のテキストで画像が切り替わるようにするために最初にopacity: 0を設定し非表示にします。
JavaScript
テキストの位置によって画像を切替えるようにするので、textsをforEachで回しscrollTriggerでトリガーを設定して、設定した位置に来たら画像のopacityを1にして表示させます。
こうすることで、スクロールに応じて画像が切り替わるようになります!
まとめ
GSAPのScrollTriggerとposition stickyでスクロール連動の固定アニメーションの作り方を何種類かまとめました。position: stickyを使うことでGSAPのpinを使用せずに固定アニメーションを実現することが確認できたかと思います!
スクロール連動の固定アニメーションを実装する機会は多いかと思いますので、ぜひ試してみてください!
この記事が参考になれば幸いです。