固定ヘッダー対応!jQueryベースのアンカーリンク平滑スクロール+位置補正実装

固定ヘッダー対応!jQueryベースのアンカーリンク平滑スクロール+位置補正実装

はじめに

「アンカーリンクをクリックすると、スクロール先の見出しがヘッダーに隠れてしまう」

そんな経験はありませんか?特に固定ヘッダーを導入したウェブサイトでは、ページ内リンクとスクロールの整合性に悩まされることが少なくありません。

今回は、jQuery を用いたスムーズスクロールと動的な位置補正機能を組み合わせたコードを紹介します。ページ読み込み時・ハッシュ変更時・DOM準備完了時のいずれにも対応し、ユーザー体験(UX)を損なうことなくページ内遷移を実現できます。

実装コード

function smoothScrollToHash() {
    const hash = window.location.hash;
    if (!hash) return;
    
    const targetId = hash.substring(1); // #を除去
    const $target = $(`.${targetId}`);
    if (!$target.length) return;
    
 const headerHeight = $(".home .site-header").height();
 const targetPosition = $target.offset().top - headerHeight;
    
    // スムーズスクロール+位置補正機能
    $("html, body").stop().animate({
        scrollTop:  targetPosition
    }, 1000, () => {
        setTimeout(() => {
            // 500ms後に位置を再計算(動的コンテンツ対応)
           const correctedPosition = $target.offset().top - headerHeight;
            $("html, body").animate({
                scrollTop: correctedPosition
            }, 500);
        }, 500);
    });
}

// ページ読み込み時・ハッシュ変更時に発動
$(window).on("load hashchange", smoothScrollToHash);

// DOM準備完了時も実行(ページ内アンカー用)
$(document).ready(smoothScrollToHash);

機能解説

✅ スムーズスクロール

ページ内リンク(例:#section1)が URL に存在する場合、対象要素まで滑らかにスクロール。

✅ 固定ヘッダー対応

.site-header の高さを自動取得し、見出しが隠れないように位置補正。

✅ 動的な再補正

一度目のスクロール後、500msのディレイを設けて再度位置を再計算。これにより、非同期読み込みされた画像やセクションのズレにも対応。

✅ トリガーイベントの網羅

  • $(document).ready():通常のページ読み込み時
  • $(window).on(“load”):画像などのリソース読込後
  • $(window).on(“hashchange”):ハッシュ変更時(SPA対応)

使用シナリオ

このコードは以下のようなシーンで特に有効です:

  • 固定ヘッダーを導入したシングルページアプリケーション(SPA)
  • 目次ナビゲーションのある長尺ページ
  • 画像やセクションを後から読み込む非同期コンテンツ
  • スクロール先がズレて表示される UI 問題の回避

応用と改善のヒント

IDとclass両方に対応したセレクターを使うことで、柔軟性を高められます:

const $target = $(`#${targetId}, .${targetId}`);

ページ内リンククリックにもスムーズスクロールを適用するには以下を追加:

$("a[href^='#']").on("click", function (e) { e.preventDefault(); const hash = this.hash; if (!hash) return; history.pushState(null, null, hash); smoothScrollToHash(); });

まとめ

アンカーリンクによるページ内遷移は UX に直結する要素です。今回紹介した実装は、デザインの美しさと機能の実用性を両立させるための基本テクニックの一つと言えるでしょう。

固定ヘッダーや非同期読み込みなど、現代の Web 開発において発生しやすい問題にも配慮されたコードですので、ぜひ貴社のサイトやプロジェクトに取り入れてみてください。

関連記事
画像の遅延読み込みはこう変わる!2025年最新版・Lazy LoadとIntersectionObserverの最適解
2025年最新の画像遅延読み込み(Lazy Load)完全ガイド。ネイティブloading="lazy"とIntersectionObserverの使い分け・実装例・SEOやLCPへの最新対応ポイントまで徹底解説。パフォーマンスと検索順位アップのための必読ノウハウ!
X SIGHT 編集部
X SIGHT 編集部
1ヶ月前
画像の遅延読み込みはこう変わる!2025年最新版・Lazy LoadとIntersectionObserverの最適解
ページ内の同じ種類のコンテナの高さを、最大値に合わせて統一する。
複数の同一クラス要素の高さを最大値に揃える処理をjQueryで実装。イベント発火時の多重処理を防ぐためデバウンスをかけ、動的なレイアウト変更に対応。効率的かつ堅牢な高さ統一が可能。
Details
Details
26日前
ページ内の同じ種類のコンテナの高さを、最大値に合わせて統一する。
ページ遷移の一般的な方法
本記事では、Webページにおけるページ遷移(リダイレクト)の一般的な実装方法について紹介しています。JavaScript、HTMLのメタタグ、PHP、ASPを用いたリダイレクト方法をそれぞれ具体的なコード例と共に解説しています。
Details
Details
26日前
ページ遷移の一般的な方法
CSS3 object-fit 属性浅析示例
object-fit は、画像や動画などの置き換え要素が、その親要素の枠内でどのように表示されるか(サイズ調整やトリミング)を指定するCSSプロパティです。 目次 CSS3のobject-fit属性の簡単な解説 文法 サンプル さまざまなo […]
Details
Details
18日前
CSS3 object-fit 属性浅析示例
【jQuery】フルスクリーンナビゲーション時に背景のスクロールを無効にする方法
このjQueryコードは、トグルボタンの状態に応じてナビゲーションを開閉し、背景のスクロールを動的に制御します。クラス名 back をトリガーとして、html 要素に適切なスタイルを適用し、快適なフルスクリーンUIを提供します。
Details
Details
26日前
【jQuery】フルスクリーンナビゲーション時に背景のスクロールを無効にする方法
CSS3で複数行テキストを省略記号(…)で表示する方法【2行以上のellipsis対応】
CSS3の-webkit-line-clampを活用し、複数行テキストを自動で省略記号「…」で表示する方法を解説。2行以上の省略も簡単にコピペで実装できます!
Details
Details
26日前
CSS3で複数行テキストを省略記号(…)で表示する方法【2行以上のellipsis対応】
jQuery Sortableがスマホなどのタッチスクリーンで使えない場合の対処法
モバイル端末でのクリックイベントとの競合を避けるため、タップ操作には click より touchstart を使うことを推奨。 jQuery UI のバージョンによっては、内部構造が異なる場合があるため、導入時はテストを行うこと。
Details
Details
26日前
jQuery Sortableがスマホなどのタッチスクリーンで使えない場合の対処法
相対パスと絶対パスの使い方
相対パスは、モジュールやディレクトリ内のローカルな参照に適しており、柔軟性があります。一方、絶対パスはウェブサイト全体で共通のリソース(CSS、画像、CDNなど)を参照する際に便利です。両者を理解して使い分けることで、パスのエラーや読み込み不具合を防げます。
Details
Details
18日前
相対パスと絶対パスの使い方
スクロール位置でアニメ発火!jQueryで特定クラスを追加する方法
jQuery を使ってページのスクロールイベントを監視し、特定の位置に到達した際に要素へ指定したクラスを追加することで、CSS アニメーションを利用した「要素の登場アニメーション」を実現できます。これはウェブデザインでよく使われる手法で、ページのインタラクション体験や視覚的な魅力を高める効果があります。
Details
Details
16日前
スクロール位置でアニメ発火!jQueryで特定クラスを追加する方法