CSS の position:fixed や position: sticky でヘッダーを上部固定にするとアンカーリンクのずれ問題が発生しますが、それを jQuery で解決する方法

jQuery

768px の部分にはサイトのブレークポイントを指定してください。

/*** スムーススクロール & 固定ヘッダアンカーリンクずれ ***/
const spMediaQuery = '(max-width: 767.98px)';
const spHeaderHeight = 60;
const pcHeaderHeight = 100;
// ページ内
jQuery(window).on('load', function() {
	if (window.matchMedia( spMediaQuery ).matches) {
		const headerHight = spHeaderHeight; //スマートフォンの位置調整 px
	} else {
		const headerHight = pcHeaderHeight; //PCの位置調整 px
	}
	const url = jQuery(location).attr('href');
	if(url.indexOf("#") != -1){
		const anchor = url.split("#");
		const target = jQuery('#' + anchor[anchor.length - 1]);
		if(target.length){
			const position = Math.floor(target.get( 0 ).offsetTop) - headerHight;
			jQuery("html, body").animate({scrollTop:position}, 500);
		}
	}
});
// ページ外
jQuery(document).on('click','*[href^="#anchor-"]', function() {
	if (window.matchMedia( spMediaQuery ).matches) {
		const headerHight = spHeaderHeight; //スマートフォンの位置調整 px
	} else {
		const headerHight = pcHeaderHeight; //PCの位置調整 px
	}
	const url = jQuery(this).attr('href');
	if(url.indexOf("#") != -1){
		const anchor = url.split("#");
		const target = jQuery('#' + anchor[anchor.length - 1]);
		if(target.length){
			const position = Math.floor(target.get( 0 ).offsetTop) - headerHight;
			jQuery("html, body").animate({scrollTop:position}, 500);
		}
	}
});

アンカーリンクの接頭辞に anchor- を使う場合

id をアンカーリンクとは別の用途で使うことがある場合に アンカーリンクに接頭辞「anchor-」を追加して問題を回避するパターン。例) h2 id=”anchor-xxx”, a href=”page.html#anchor-xxx”

/*** スムーススクロール & 固定ヘッダアンカーリンクずれ ***/
const spMediaQuery = '(max-width: 767.98px)';
const spHeaderHeight = 60;
const pcHeaderHeight = 100;
// ページ内
jQuery(window).on('load', function() {
	if (window.matchMedia( spMediaQuery ).matches) {
		const headerHight = spHeaderHeight; //スマートフォンの位置調整 px
	} else {
		const headerHight = pcHeaderHeight; //PCの位置調整 px
	}
	const url = jQuery(location).attr('href');
	if(url.indexOf("#anchor-") != -1){
		const anchor = url.split("#anchor-");
		const target = jQuery('#anchor-' + anchor[anchor.length - 1]);
		if(target.length){
			const position = Math.floor(target.get( 0 ).offsetTop) - headerHight;
			jQuery("html, body").animate({scrollTop:position}, 500);
		}
	}
});
// ページ外
jQuery(document).on('click','*[href^="#anchor-"]', function() {
	if (window.matchMedia( spMediaQuery ).matches) {
		const headerHight = spHeaderHeight; //スマートフォンの位置調整 px
	} else {
		const headerHight = pcHeaderHeight; //PCの位置調整 px
	}
	const url = jQuery(this).attr('href');
	if(url.indexOf("#") != -1){
		const anchor = url.split("#anchor-");
		const target = jQuery('#anchor-' + anchor[anchor.length - 1]);
		if(target.length){
			const position = Math.floor(target.get( 0 ).offsetTop) - headerHight;
			jQuery("html, body").animate({scrollTop:position}, 500);
		}
	}
});

コメントを残す

メールアドレスが公開されることはありません。