わたしがいつも使用しているコードで、headerがページ上部に固定されている場合に、header内のアンカーリンクでページ内遷移をした際、headerと遷移先のコンテンツがかぶってしまうことを防ぐためのコードです。
まずはコードから。
// ヘッダー位置調整
$(window).on('load', function() {
let headerHeight = $('.l-header').outerHeight();
let urlHash = location.hash;
if (urlHash) {
let position = $(urlHash).offset().top - headerHeight;
$('html, body').animate({ scrollTop: position }, 0);
}
});
const headerFunc = ()=>{
let headerHeight = $('.l-header').outerHeight();
let urlHash = location.hash;
if (urlHash) {
let position = $(urlHash).offset().top - headerHeight;
$('html, body').animate({ scrollTop: position }, 0);
}
}
window.addEventListener('hashchange', headerFunc, false);jQueryを使用しているので、必ずjqueryを読み込んだ後に記述してください。
jQuerの読み込み方法はこちら
コード解説
1. ヘッダー位置調整 ($(window).on('load', ...))
$(window).on('load', function() { ... }); は、ページが完全に読み込まれたときに実行される処理を定義しています。
let headerHeight = $('.l-header').outerHeight(); は、.l-header というクラスを持つヘッダー要素の高さを取得します。このヘッダーの高さを、後でスクロール位置の計算に使用します。
let urlHash = location.hash; では、現在のURLのハッシュ部分(#anchor など)を取得します。ページがハッシュ付きURL(例えば example.com/#section1)で読み込まれた場合、そのハッシュ(#section1)を urlHash に代入します。
if (urlHash) { ... } の部分では、ハッシュが存在する場合にスクロール処理を行います。
$(urlHash).offset().top は、ハッシュで指定された要素のページ上での位置(縦方向のオフセット値)を取得します。
let position = $(urlHash).offset().top - headerHeight; では、その位置からヘッダーの高さを引いて、表示したいスクロール位置を計算します。これは、ヘッダーがコンテンツに被らないようにするためです。
$('html, body').animate({ scrollTop: position }, 0); で、指定した位置まで即座にスクロールします。この場合、アニメーション時間は 0 なので瞬時にスクロールが完了します。もしアニメーションに余裕を持たせたい場合はここの数字を変更してください。
2. headerFunc 関数
この関数は、URLのハッシュが変更されたときにスクロール位置を調整する処理を定義しています。上記の「ヘッダー位置調整」の部分と同じ処理が行われています。
ヘッダーの高さを取得し、ハッシュに対応する要素までスクロールします。
3. ハッシュ変更時のイベントリスナー (window.addEventListener('hashchange', ...))
window.addEventListener('hashchange', headerFunc, false); は、URLのハッシュが変更されたときに headerFunc 関数を呼び出すイベントリスナーを設定します。
ハッシュが変わると(例えば、#section1 から #section2 に切り替わると)、自動的にスクロール位置が再計算され、ヘッダーの高さを考慮した位置にスクロールします。
まとめ
アンカーリンクでの遷移の際に、header分スクロール位置をずらすコードを解説しました。
よく使用するコードなのでぜひ日常業務に取り入れてみてください!
記事にしてほしい・解説してほしい内容のリクエストもお待ちしています。