アンカーリンクと固定ヘッダーの問題とは?
アンカーリンクの基本的な仕組み
ページ内リンク(アンカーリンク)は、<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を使う場合、ヘッダーの高さを考慮しているか?
✅ スムーズスクロールとの併用時に位置ズレが発生していないか?
固定ヘッダーとアンカーリンクが意図した動きにならない場合は、以上のポイントをチェックしてみましょう!
コメント