Blog

ブログ

GSAPでページ内リンクのスクロールを実装する方法

前田 大地

今回ご紹介するのは、GSAPでページ内リンク(アンカーリンク)のスクロールを実装する方法です。

GSAPとは

https://greensock.com/

GSAPは、アニメーションのためのJavascriptライブラリです。高速で堅牢、しかもJavascriptからアクセスできるほとんどの要素を操作できるので使用するフレームワークを選びません。Googleも推奨していて、業界標準と言えなくもない雰囲気です。アニメーション版のjQueryみたいなイメージでしょうか。GSAPの本体にプラスして「プラグイン」という追加機能を読み込めば、さらに色々なことができるようになります。

最近は私もなるべくGSAPを採用するようにしていますが、なぜ今までちまちまJavascriptやCSSでアニメーションさせていたのだろう・・・と、ちょっぴり悲しい気分になるほどです。

ページ内リンクのスクロール

GSAPを使ったアンカーリンクのスクロール。完成したコードがこちらです。

/* --------------------
smooth scroll
-------------------- */
gsap.utils.toArray('a[href^="#"]').forEach(function(a) {
  a.addEventListener("click", function(e) {
    e.preventDefault();
    gsap.to( window, {
      duration: 1,
      ease: 'power4.out',
      scrollTo: {
        y: e.target.getAttribute("href"),
        autoKill: false
      }
    });
  });
});

上記コードより前に、GSAPの本体とScrollToプラグインの2ファイルを読み込んでくださいね。

固定ヘッダーがある場合

offsetYを指定することで、固定ヘッダー分の高さを確保できます。レスポンシブなサイトだと画面幅によって固定ヘッダーの高さが変わる場合もあるので、要素クリック時に固定ヘッダーの高さを取得します。

/* --------------------
smooth scroll
固定ヘッダーのとき
-------------------- */

// ヘッダーの要素を取得(例えば.headerだった場合)
const h = document.getElementsByClassName('header')[0];

gsap.utils.toArray('a[href^="#"]').forEach(function(a) {
  a.addEventListener("click", function(e) {
    e.preventDefault();
    gsap.to( window, {
      duration: 1,
      ease: 'power4.out',
      scrollTo: {
        y: e.target.getAttribute("href"),
        autoKill: false,
        offsetY: h.offsetHeight, //ヘッダーの高さをセット
      }
    });
  });
});

以上です。

コードの解説

あっさり話が終わってしまいました。せっかくなのでコードを解説します。

アンカーリンクの取得

gsap.utils.toArray('a[href^="#"]').forEach(function(a) {
  ・・・
});

ハッシュタグのついたアンカーリンクを「gsap.utils.toArray」を使って取得。「forEach」でひとつずつ処理していきます。

クリックイベントの登録

a.addEventListener("click", function(e) {
   ・・・ 
});

「forEach」でひとつずつ取り出した要素に対してクリックイベントを登録していきます。

デフォルトの挙動をキャンセル

e.preventDefault();

a要素がクリックされたときのデフォルトの挙動をキャンセルします。キャンセルしないと、クリックした瞬間にアンカー要素にジャンプしちゃいます。

ページをスクロール

gsap.to( window, {
  duration: 1,
  ease: 'power4.out',
  scrollTo: {
    y: e.target.getAttribute("href"),
    autoKill: false
  }
});

gsap.to」と「scrollTo」を使ってwindowオブジェクトをアニメーション(画面をスクロール)させます。「y」に移動量を指定するのですが、GSAPでは「#top」のように移動先のIDを指定できます。とっても便利。

ちなみに、autoKillをtrueにすると一部環境で挙動がおかしくなるのでfalseが吉。GSAP v3ではautoKillのデフォルト値がfalseになったので記述しなくてもいいのですが、後で見たときに忘れそうなのであえて記述する殺法です。durationとeaseはお好みで変更してください。

やってみた感想

ページ内リンクのスクロールは、Vanilla JSでやろうとするとちょっと面倒で、私はjQueryを使うことが多かったのですが(WordPressサイトであれば常にjQueryも入ってますし)、GSAPでもかんたんに実装できます。今回はいちばんシンプルなカタチでの実装でしたが、要件に応じていろいろとアレンジできるのではないかと思います。

Web Designer / Developer

前田 大地

沼津高専中退。デザイン会社、システム開発会社を経てセブンシックスを設立。マーケティング、デザイン、テクノロジーに精通するオールラウンダーとして、県内の中小企業に向けた戦略型ホームページ制作を開始。一方で、都内の広告代理店からの要請で大企業案件にも多数参加。企業が本当に必要とするホームページ制作とは何か、を日々探求している。

Blog top