【初心者向け】アンカーリンクの位置調整方法|スクロール位置のズレを解消するテクニック

コーディング

アンカーリンクと固定ヘッダーの問題とは?

アンカーリンクの基本的な仕組み

ページ内リンク(アンカーリンク)は、<a href="#id名">リンク</a> のように記述し、同じページ内の指定した要素へジャンプする仕組みです。

固定ヘッダーが影響する理由

ナビゲーションバーを常に表示するために position: fixed;を使用しているサイトが多いです。
しかし、ページ内リンクをクリックすると、指定した要素が画面の最上部に配置されるため、ヘッダーと重なってしまい、内容が見えなくなってしまうことがあります。

アンカーリンクが固定ヘッダーと被る原因と対処法

CSSだけで簡単に解決する方法

問題点

固定ヘッダーの高さが考慮されず、リンク先の要素がヘッダーに隠れてしまう場合

対処法

scroll-margin-topを使用して適切な余白を確保する
この方法はシンプルで、CSSのみで解決できます。

/* 固定ヘッダーの高さ分の余白を確保 */
.target-section {
  scroll-margin-top: 80px; /* ヘッダーの高さ分 */
}

:target 疑似クラスを活用する方法

問題点

アンカーリンクがうまく動作しない、デザインが崩れる場合

対処法

:targetを活用してスムーズなスクロールを実装します。
:target はアンカーリンクで指定された要素がターゲットになったときに適用されるので、固定ヘッダーがある場合でも適切に表示できます。

/* リンク先の要素に余白を追加 */
:target::before {
  content: "";
  display: block;
  height: 80px; /* ヘッダーの高さ分 */
  margin-top: -80px;
}

JavaScriptを使ったスクロール調整

問題点

CSSだけでは思い通りの動きにならないケースがあります

対処法

その場合は、JavaScriptでスクロール位置を調整します(scrollIntoView + offsetTop
JavaScriptで以下のコードを追加すると、ページ内リンクをクリックした際にヘッダーの高さを考慮したスクロール位置に調整できます。

document.querySelectorAll('a[href^="#"]').forEach(anchor => {
  anchor.addEventListener('click', function(e) {
    e.preventDefault();
    const target = document.querySelector(this.getAttribute('href'));
    const headerOffset = 80; // ヘッダーの高さ
    const elementPosition = target.getBoundingClientRect().top + window.scrollY;
    const offsetPosition = elementPosition - headerOffset;

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

スムーズスクロールとの併用時の注意点

スムーズスクロールと併用すると、スクロール位置がズレることがあります。
その場合は、CSSとJavaScriptのスムーズスクロールを組み合わせましょう。

CSSだけでスムーズスクロールを設定している場合、JavaScriptの scrollIntoView() と競合することがあります。
その場合は、JavaScript側で behavior: "smooth" を指定し、CSSの scroll-behavior: smooth; を無効化するのがオススメです。

/* ブラウザ標準のスムーズスクロールを無効化 */
html {
  scroll-behavior: auto;
}

まとめ

scroll-margin-top を適切に設定しているか?
:targetを活用してデザイン調整しているか?
✅ JavaScriptを使う場合、ヘッダーの高さを考慮しているか?
✅ スムーズスクロールとの併用時に位置ズレが発生していないか?

固定ヘッダーとアンカーリンクが意図した動きにならない場合は、以上のポイントをチェックしてみましょう!

この記事を書いた人
管理人

2012年にWebデザインの勉強を始め、2013年より制作会社に勤務。
これまでに500件以上のWebサイト制作・運用に携わってきました。
現在も制作会社に勤務しながら、Webデザインスクールのトレーナーとしても後進の育成に取り組んでいます。
WordPressやデザインの実践的なノウハウを、初心者にもわかりやすく発信できるよう試行錯誤しています。

管理人をフォローする
コーディング
管理人をフォローする

コメント

タイトルとURLをコピーしました