【JavaScript】アンカーリンクのスムーススクロールを実装する方法

【JavaScript】アンカーリンクのスムーススクロールを実装する方法 JavaScript

Webページ内で特定のセクションにスムーズにスクロールさせたい場合、JavaScriptを使うことで簡単に実装できます。本記事では、jQueryを使わずに、純粋なJavaScriptでスムーススクロールを実装する方法を紹介します。

スポンサーリンク

scrollIntoView を使った簡単なスムーススクロール

scrollIntoView メソッドを使えば、簡単にスムーススクロールを実装できます。

document.addEventListener("DOMContentLoaded", function () {
  const links = document.querySelectorAll('a[href^="#"]'); // #で始まるリンクを取得

  links.forEach(link => {
    link.addEventListener("click", function (e) {
      e.preventDefault(); // デフォルトの動作を無効化
      const targetId = this.getAttribute("href").substring(1); // IDを取得
      const targetElement = document.getElementById(targetId);

      if (targetElement) {
        targetElement.scrollIntoView({ behavior: "smooth", block: "start" });
      }
    });
  });
});

document.querySelectorAll(‘a[href^=”#”]’) でページ内リンクを取得し、scrollIntoView({ behavior: “smooth” }) を使ってスムーススクロールを実現しています。

この方法は簡単に実装でき、JavaScriptの標準機能で動作するため軽量ですが、ナビゲーションバーが固定されている場合にスクロール位置がずれることがあります。

window.scrollTo を使ったスムーススクロール(オフセット調整可能)

固定ナビゲーションバーがある場合など、スクロール位置を調整したい場合は window.scrollTo を使用すると便利です。

document.addEventListener("DOMContentLoaded", function () {
  const links = document.querySelectorAll('a[href^="#"]');

  links.forEach(link => {
    link.addEventListener("click", function (e) {
      e.preventDefault();
      const targetId = this.getAttribute("href").substring(1);
      const targetElement = document.getElementById(targetId);

      if (targetElement) {
        const offsetTop = targetElement.getBoundingClientRect().top + window.scrollY - 50;

        window.scrollTo({
          top: offsetTop,
          behavior: "smooth"
        });
      }
    });
  });
});

getBoundingClientRect().top + window.scrollY で正確なスクロール位置を取得し、- 50 でスクロール位置を調整することで、固定ナビゲーションバーがある場合にも対応できます。

この方法はスクロール位置を細かく調整でき、scrollIntoView より柔軟な制御が可能ですが、コードが少し長くなります。

よくある質問(FAQ)

Q. JavaScriptでアンカーリンクのスムーズスクロールを実装するには?
A. aタグのclickイベントでpreventDefault()し、hrefのハッシュから対象要素を取得、scrollIntoView({behavior: “smooth”})を呼び出します。CSSのscroll-behavior: smoothだけで実装することもできます。
Q. 固定ヘッダーがある場合のスムーズスクロールのオフセット調整は?
A. getBoundingClientRect().top + window.scrollY – headerHeightを計算してwindow.scrollTo({top: offset, behavior: “smooth”})を使います。CSSのscroll-margin-topプロパティを使う方法も簡単です。
Q. ページ外からのハッシュリンクでもスムーズスクロールするには?
A. window.location.hashをDOMContentLoadedで確認し、ハッシュが存在する場合にスクロール処理を実行します。URLに#sectionが付いていても即時ジャンプにならないよう制御できます。

まとめ

JavaScriptを使えば、jQueryなしでも簡単にスムーススクロールを実装できます。scrollIntoView を使えばシンプルに実装できますが、固定ナビゲーションがある場合は window.scrollTo を使うことで、より調整しやすくなります。

用途に応じて最適な方法を選び、快適なユーザー体験を提供しましょう!