jQuery Web制作

【jQuery】固定ヘッダーでページ内リンクのジャンプ先の位置を調整する方法

2020年5月5日

※ 当サイトではアフィリエイト広告を利用しています

ページ内リンクの位置を少し変えたい時はどうしたらいいんだろう?

例えばヘッダーを固定させた場合など、ページ内リンクを普通に作ると移動先の見出しなどが、ヘッダーの下に隠れてしまう事があります。

こちらのデモのように、メニューをクリックするとそのセクションに移動しますが、上の方がヘッダーの下に隠れてしまいます。

See the Pen
ページ内リンク(ポジション修正しない場合)
by junpei (@junpei-sugiyama)
on CodePen.

そういう場合、『ページ内リンクの遷移先をヘッダーと重ならないようにしたい』といったケースが出てくると思います。

今回は、その方法について解説したいと思います。

じゅんぺいブログは、Web制作コーディングWordPress制作)の技術記事を中心に、約500記事公開しています。ぜひ他の記事も参考にしてみてください!
完全無料のプログラミングスクール『ZeroPlus Gate』
30日間でWeb制作を学べる無料のプログラミングスクールがこちら
いきなり数十万するプログラミングスクールは厳しい・・・という人のお試しに最適です。
現在は無料ですがいつ有料になるか分からないので、気になる方はお早めに👇
(有料になっていたらすいません🙇‍♂️)

\ 完全無料 /

ZeroPlus Gate公式サイト

毎日先着制!

固定ヘッダーでページ内リンクのジャンプ先の位置を調整する方法

まずは、今回の完成形を見てみます。

See the Pen
Untitled
by junpei (@junpei-sugiyama)
on CodePen.

これはページ内リンクのジャンプ先の位置を調整するだけでなく、コンテンツがヘッダーの下に隠れないように、ヘッダーの高さ分コンテンツを下げています。

ヘッダーの高さを取得して高さ分コンテンツを下げる方法については以下の記事を参照下さい。

あわせて読みたい
【jQuery】ヘッダーの高さを取得して高さ分コンテンツを下げる方法
【jQuery】ヘッダーの高さを取得して高さ分コンテンツを下げる方法

続きを見る

ちなみに、コンテンツを下げないとこのようになります。

See the Pen
ヘッダーの高さ分コンテンツを下げない
by junpei (@junpei-sugiyama)
on CodePen.

一番上のセクションであるABOUTの一番上が、ヘッダーの下に隠れてしまっています。

また、ヘッダーを固定しない場合のページ内リンクはこちらです。

See the Pen
ページ内リンク
by junpei (@junpei-sugiyama)
on CodePen.

どちらもsectionの見出しの上に移動するようにしています。

このヘッダーを固定しないページ内リンクについては、以下の記事を参照下さい。

あわせて読みたい
【コピペOK!】jQueryを使ったスムーススクロールで移動するページ内リンク(アンカーリンク)の作り方
【コピペOK!】jQueryを使ったスムーススクロールで移動するページ内リンクの作り方

続きを見る

 

コード解説

それでは、本題である今回作るページ内リンクのHTMLを見てみます。

<header class="header js-header">
  <nav>
    <ul>
      <li><a href="#about">ABOUT</a></li>
      <li><a href="#works">WORKS</a></li>
      <li><a href="#gallery">GALLERY</a></li>
      <li><a href="#service">SERVICE</a></li>
    </ul>
  </nav>
</header>
<main>
  <section id="about" class="section01">ABOUT</section>
  <section id="works" class="section02">WORKS</section>
  <section id="gallery" class="section03">GALLERY</section>
  <section id="service" class="section04">SERVICE</section>
</main>

特に変わったところはなく、通常のページ内リンクの時と同じです。

CSSも特に変わったところはありません。

なので、HTMLとCSSに関してはヘッダーの高さを取得して高さ分コンテンツを下げる方法と同じですが、jQueryにちょっと手を加えます。

jQueryを使うので、jQuery本体の読み込みを忘れないようにしましょう。

jQueryを使ったことがない人はこちらの記事を参照下さい。

あわせて読みたい
【初心者向け】jQueryとは?CDNを使った本体の読み込み方についても分かりやすく解説
【初心者向け】jQueryとは?CDNを使った本体の読み込み方も分かりやすく解説

続きを見る

// ヘッダーの高さ分だけコンテンツを下げる
$(function () {
  const height = $(".js-header").height();
  $("main").css("margin-top", height);
});
// ページ内スクロール
$(function () {
  // ヘッダーの高さ取得
  const headerHeight = $(".js-header").height();
  $('a[href^="#"]').click(function () {
    const speed = 600;
    let href = $(this).attr("href");
    let target = $(href == "#" || href == "" ? "html" : href);
    // ヘッダーの高さ分下げる
    let position = target.offset().top - headerHeight;
    $("body,html").animate({ scrollTop: position }, speed, "swing");
    return false;
  });
});

最初はヘッダーの高さ分だけコンテンツを下げるコードで、ページ内スクロールの方はjQueryを使ったスムーススクロールで移動するページ内リンクの作り方とほぼ同じですが、以下の2点が追記されています。

// ヘッダーの高さ取得
const headerHeight = $(".js-header").height();

// ヘッダーの高さ分下げる
let position = target.offset().top - headerHeight;

ヘッダーの高さ取得に関しては『ヘッダーの高さ分だけコンテンツを下げる』と同じです。

そしてその高さ分『headerHeight』をマイナスして位置を下げている形になります。

上記コードは『ヘッダーの高さ分だけコンテンツを下げる』『ページ内リンクのジャンプ先の位置を調整&スムーススクロール』を分けて書きましたが、以下のようにまとめても大丈夫です。

$(function () {
  // ヘッダーの高さを取得
  const height = $(".js-header").height();
  // ヘッダーの高さ分コンテンツを下げる
  $("main").css("margin-top", height);
  // ページ内スクロール
  $('a[href^="#"]').click(function () {
    const speed = 600;
    let href = $(this).attr("href");
    let target = $(href == "#" || href == "" ? "html" : href);
    // ヘッダーの高さ分下げる
    let position = target.offset().top - height;
    $("body,html").animate({ scrollTop: position }, speed, "swing");
    return false;
  });
});

 

CSSのscroll-padding-topだけでも可能

今回のjQueryを使う方法は、ヘッダーの高さが可変でもOKというメリットがあります。

しかし、ヘッダーの高さが固定であれば、jQueryは不要で以下のCSSだけでもOKです。

html {
  scroll-padding-top: 50px; /* ヘッダーの高さ */
}

これはヘッダーの高さが50pxの場合です。

詳しくは、以下の記事を参照下さい(と言っても、上記のコードを書くだけですが)

あわせて読みたい
CSSだけで固定ヘッダー時のページ内スクロール位置がズレないようにする方法【scroll-padding-top使用】
CSSだけで固定ヘッダー時のページ内スクロール位置がズレないようにする方法【scroll-padding-top使用】

続きを見る

まとめ

それでは最後にもう一度完成形をみてみます。

See the Pen
Untitled
by junpei (@junpei-sugiyama)
on CodePen.

以上になります。

あわせて読みたい
【コピペOK!】jQueryを使ったスムーススクロールで移動するページ内リンク(アンカーリンク)の作り方
【コピペOK!】jQueryを使ったスムーススクロールで移動するページ内リンクの作り方

続きを見る

あわせて読みたい
【jQuery】ヘッダーの高さを取得して高さ分コンテンツを下げる方法
【jQuery】ヘッダーの高さを取得して高さ分コンテンツを下げる方法

続きを見る

この記事が役に立ったと思ったら、シェアボタンからX(旧Twitter)などにシェアすると、いいねされてフォロワーが増えたりすることがあるよ!

 

  • この記事を書いた人

じゅんぺい

37歳からWeb制作とブログ開始。Web制作歴5年目でコーディングとWordPressオリジナルテーマ制作が中心。これまで120件以上を納品。当ブログ月間最高15万PVで、370記事以上はWeb制作の技術記事。コンテンツ販売→累計売上1200万円&1500部超え。X(旧Twitter)フォロワー7200人以上。2024年3月からブログの経験を活かしてライターとしても活動を開始。

-jQuery, Web制作