2021.01.30

jQuery

ヘッダー固定時のページ内リンクスムーススクロール

デモページはこちら

ページ内リンクへの移動をスムーススクロールで実装します。ヘッダーは上部に固定しています。以下のhtml構造でテストします。

<header>
	<button type="button" class="drawer-toggle drawer-hamburger">
		<span class="sr-only">toggle navigation</span>
		<span class="drawer-hamburger-icon"></span>
	</button>
	<nav class="drawer-nav">
		<ul class="drawer-menu">
			<li><a href="index.html">メニュー01</a></li>
			<li><a href="#">メニュー02</a></li>
			<li><a href="#">メニュー03</a></li>
			<li><a href="#">メニュー04</a></li>
			<li><a href="#page01">ページ内リンク</a></li>
		</ul>
	</nav>
	<div class="header_inner">
		<nav class="hamburger_nav">
			<ul>
				<li><a href="index.html">メニュー01</a></li>
				<li><a href="#">メニュー02</a></li>
				<li><a href="#">メニュー03</a></li>
				<li><a href="#">メニュー04</a></li>
				<li><a href="#page01">ページ内リンク</a></li>
			</ul>
		</nav>
	</div>
</header>

ページ内リンクのaタグはhref属性で「#page01」と「index.html#page01」の2パターンが考えられます。#から始まるhref属性のみを対象にするとファイル名を含むパターンが動作しないため、どちらでも動作するようにします。
全てのaタグクリック時の動作から、テレタップとtarget属性のないaタグのみセレクタで除外します。ページ内リンクの判定は、if文のand条件を「URLにhref属性のファイル名を含む」と「href属性に#を含む」にします。href属性にファイル名がないパターンの場合、1つ目のindexOfの検索対象は空白文字になりますが、その場合は-1ではなく0が戻り値となるため、ページ内リンクの条件を満たします。
スクロール位置は固定しているヘッダーの高さを差し引いて設定するのがポイントです。

$(function() {
  $('a:not([href^="tel:"]):not([target])').on('click tap', function(e) {
    var ref = location.href;
    var url = $(this).attr('href');

    if( ref.indexOf(url.replace(/#.*$/, '')) != -1 && url.indexOf('#') != -1 ) {
      var speed = 300;
      var href= url.match(/#.*$/);
      var target = $(href[0]);
      var position = target.offset().top - $('.header_inner').outerHeight();
      $('body, html').animate({ scrollTop: position }, speed, 'swing');
      return false;
    }
  });
});

関連記事

2022.08.26

jQuery

jQueryで最初・最後の要素を取得(first・last)

jQueryのfirst・lastメソッドで最初・最後の要素を取得します。また、first・lastをセレクタとして使用します。以下のhtmlの構造で確認します…

2020.09.23

jQuery

jQueryで要素の幅と高さを取得(width・innerWidth・outerWidth・height・innerHeight・outerHeight)

デモページはこちら jQueryで要素の幅と高さを取得するメソッドのまとめです。まず幅ですが、対象要素の幅を取得するwidth、対象要素のpaddingを含めた…

2020.09.09

jQuery

jQueryのCDN読み込み

コンテンツ・デリバリー・ネットワーク(CDN)は、アクセス元から一番近くのキャッシュサーバーへ接続してファイルが提供される仕組みです。jQueryのCDNはjQ…

2020.10.02

jQuery

jQueryのeachメソッドの使い方

デモページはこちら jQueryのeachメソッドの使い方です。eachメソッドには関数を指定します。関数の引数として「index(インデックス番号)」と「el…

2020.08.16

jQuery

loadメソッドでhtmlファイルを読み込み

jQueryのloadメソッドはajaxの機能を限定的にした簡易版のような位置づけで、htmlファイルを読み込んで出力するだけの機能に特化しています。空のdiv…

上に戻る