GSAP使用|スクロールに連動して文字の色が左から右へ変わっていくテキストアニメーションを実装

当サイトには広告が含まれています。

こんにちは。

お客様からのご要望があったので、スクロールに連動して文字の色が左から右へゆっくりと変化するテキストアニメーションを、JavaScriptライブラリ「GSAP(GreenSock Animation Platform)」を使って実装してみました。

動きはとてもシンプルですが、ユーザーの視線を自然に誘導できたり、重要なコピーにさりげないアクセントを加えたりと、さまざまな場面で活用できます。

「スクロールに合わせて変化する表現を取り入れたい」「GSAPを試してみたい」という方は、ぜひ使ってみてください。おしゃれでかっこいいです。

目次

完成サンプル

スクロールに連動して文字の色が変わってます。

See the Pen Untitled by Goro goro works (@gorogoroworks-jp) on CodePen.

まずはGSAPを導入する

今回のアニメーションでは、GSAP(GreenSock Animation Platform)と、そのプラグインである ScrollTrigger を使用します。

どちらもCDNで簡単に読み込めるため、環境構築はとてもシンプルです。

以下の2行を、HTMLファイルの <head> タグ内または <body> タグの最後(</body> の直前)に追加するだけでOKです。

HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/ScrollTrigger.min.js"></script>

GSAP(ジーサップ) とは、Webサイト上のアニメーションを自由にコントロールできるJavaScriptライブラリです。正式名称は「GreenSock Animation Platform」で、テキストや画像、SVG、スクロールなど、あらゆる要素を滑らかに動かすことができます。

HTML構造

今回のアニメーションでは、1つのテキストを「2重構造」で配置することで、上に重ねた文字の横幅をスクロールに応じて広げていき、色が変わったように見せる仕組みになっています。

ですので、同じ内容のテキストを2行書く必要があります。以下のコードを参考にしてください。

HTML
<div class="gsapBlock">
  <div class="gsapBox">
    <div class="gsapText gsapText-front">
      <p>吾輩は猫である。名前はまだ無い。</p>
    </div>
    <div class="gsapText gsapText-back">
      吾輩は猫である。名前はまだ無い。
    </div>
  </div>
</div>

<div class="gsapBlock">
  <div class="gsapBox">
    <div class="gsapText gsapText-front">
      <p>どこで生れたかとんと見当がつかぬ。</p>
    </div>
    <div class="gsapText gsapText-back">
      どこで生れたかとんと見当がつかぬ。
    </div>
  </div>
</div>

<div class="gsapBlock">
  <div class="gsapBox">
    <div class="gsapText gsapText-front">
      <p>何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。</p>
    </div>
    <div class="gsapText gsapText-back">
      何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
    </div>
  </div>
</div>

ポイント

  • 上にある .gsapText-front の <p> 要素がアニメーションで 幅0% → 100% に広がります。
  • 下にある .gsapText-back は白文字(初期状態の文字)です。
  • そのため、文字がスクロールで白→グレーに変化していくように見えます。

CSS

こちらがCSSです。サンプルのためにマージン大きめにしてたりするので、その辺はお好みで変更してください。

CSS
.gsapBlock {
  margin-top: 48px;
}

.gsapBox {
  height: max-content;
  position: relative;
  width: max-content;
}

.gsapText {
  font-size: 20px;
  font-weight: 300;
  line-height: 2;
  z-index: 0;
}

/* 前面に重なる文字 */
.gsapText-front {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  color: #fcba03;  /* 上の文字色 */
  z-index: 1;
  pointer-events: none;
}

.gsapText-front p {
  display: block;
  height: 100%;
  overflow: hidden;
  white-space: nowrap;
  width: 0%;
  margin: 0;
}

/* 背景側の白文字 */
.gsapText-back {
  position: relative;
  color: #fff;
  z-index: 0;
}

Java script

JavaScript
gsap.registerPlugin(ScrollTrigger);

  // すべての .gsapBlock を取得
  document.querySelectorAll(".gsapBlock").forEach(block => {
    const redText = block.querySelector(".gsapText-front p");

    // 初期化(幅0%)
    redText.style.width = "0%";

    // アニメーション設定
    gsap.to(redText, {
      scrollTrigger: {
        trigger: block,
        start: "top 80%",
        end: "bottom 60%",
        scrub: true
      },
      width: "100%"
    });
  });
  • .gsapText-front p 要素の width を 0% → 100% にアニメーション
  • scrub: true によってスクロール連動で滑らかに動きます
  • 各 .gsapBlock に対して 個別にScrollTriggerが設定されているため、行ごとに時間差が生まれ、自然なズレが出ます

ぜひ参考にしてみてください。

デザイン作るの難しい〜!と感じたら

デザイン・ホームページで

お困りのことがありましたら、
私たちクートスラボにご依頼ください!
実績多数の女性クリエイターチームが、

どんなお悩みも解決します。

\ 無料相談・ご依頼はこちら /

シェアお願いします!
  • URLをコピーしました!
目次