アニメーションを作成する際の便利ライブラリで横スクロールコンテンツを作成したのでメモします。
GSAPを実装する
ライブラリを設定しましょうCDNは以下です。
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
今回はスクロールをトリガーとするのでScrollTrigger.min.jsも使用します。
javascriptを記述する
ファンクションとなるjavascriptを記述します。
javascript
const wrapper = document.querySelector(".js-wrapper"); if (wrapper) { const slides = gsap.utils.toArray(".js-scroll"); const wrapperWidth = wrapper.offsetWidth; // 横スクロールアニメーションの設定 const horizontalTimeline = gsap.to(slides, { xPercent: -100 * (slides.length - 1), ease: "none", scrollTrigger: { trigger: wrapper, pin: true, scrub: 1, end: `+=${wrapperWidth}`, }, }); }
-X軸方向に移動にします。
xPercent: -100 * (slides.length - 1)
アニメーション開始のトリガー要素を設定します。
trigger: wrapper,
要素を固定する。
pin: true,
スクロール量に合わせてアニメーションします。
scrub: 1,
アニメーションが終わる位置を設定します。
end: `+=${wrapperWidth}`,
基本的にはこれだけで動作します。
フェードインアニメーションを追加する
スクロールでコンテンツが表示されたらフェードインで表示されるようにしてみます。
基本のスクリプトにアニメーションしたいパーツの変数を追加し、それぞれにスクリプトを記述します。
今回はイメージとその上に表示されているテキストをアニメーションにしました。
javascript
const wrapper = document.querySelector(".js-wrapper"); if (wrapper) { const slides = gsap.utils.toArray(".js-scroll"); const wrapperWidth = wrapper.offsetWidth; const texts = gsap.utils.toArray('.side-scroll-item p'); const imgs = gsap.utils.toArray('.side-scroll-item img'); // 横スクロールアニメーションの設定 const horizontalTimeline = gsap.to(slides, { xPercent: -100 * (slides.length - 1), ease: "none", scrollTrigger: { trigger: wrapper, pin: true, scrub: 1, end: `+=${wrapperWidth}`, }, }); texts.forEach((text, i) => { gsap.fromTo(text, { autoAlpha: 0 }, { autoAlpha: 1, duration: 1, scrollTrigger: { trigger: text, containerAnimation: horizontalTimeline, start: "left center", toggleActions: "play none none reverse" } }); }); imgs.forEach((images, i) => { gsap.fromTo(images, { autoAlpha: 0 }, { autoAlpha: 1, duration: 1, scrollTrigger: { trigger: images, containerAnimation: horizontalTimeline, start: "left center", toggleActions: "play none none reverse" } }); }); }
テキストとイメージ変数を定義します。
const texts = gsap.utils.toArray('.side-scroll-item p'); const imgs = gsap.utils.toArray('.side-scroll-item img');
テキストアニメーションを設定します。
texts.forEach((text, i) => { gsap.fromTo(text, { autoAlpha: 0 }, { autoAlpha: 1, duration: 1, scrollTrigger: { trigger: text, containerAnimation: horizontalTimeline, start: "left center", toggleActions: "play none none reverse" } }); });
イメージアニメーションを設定します。
imgs.forEach((images, i) => { gsap.fromTo(images, { autoAlpha: 0 }, { autoAlpha: 1, duration: 1, scrollTrigger: { trigger: images, containerAnimation: horizontalTimeline, start: "left center", toggleActions: "play none none reverse" } }); });
これでそれぞれにアニメーションが追加されます。
まとめ
横スクロールを可能にするライブラリは、いくつかありますがGSAPは比較的簡単に実装できます。
またアニメーションのオプションも豊富なので、表現の幅が広がりますね。