Web production note

 【更新日 :

【jQuery】ページ外アンカーリンクをヘッダーの高さ分ずらす

Category:
jQuery

既存コードの編集が難しいケースなどを想定して公開していましたが、現代の実装では scroll-margin-topなどの利用で解決できる可能性が高いため、可能な限りCSSで調整することを推奨します。

別ページからアンカーリンクへ飛んだ時、ヘッダーをfixしていると要素に被ってしまう問題の対策です。

//別ページからのアンカーリンク設定
$(window).load(function (e) {
	//アンカーリンク取得
	var hash = location.hash;
	//アンカーリンクがあった場合
	if($(hash).length){
		e.preventDefault();
		//ヘッダーの高さ取得
		headerH = header.height();
		//アンカーリンクの位置取得
		var position = $(hash).offset().top;
		//アンカーリンクの位置まで移動
		$("html, body").scrollTop(Number(position)-headerH);
	}
});

IEで上手く動かなかった…

実機ではなく仮想環境での確認ですが、何故かIEで上手く動きませんでした。
無理やり対応したのが下記のコードです。

//別ページからのアンカーリンク設定
$(window).load(function (e) {
	//アンカーリンク取得
	var hash = location.hash;
	//アンカーリンクがあった場合
	if($(hash).length){
		e.preventDefault();
		//ヘッダーの高さ取得
		headerH = header.height();
		//IE判別
		var ua = window.navigator.userAgent.toLowerCase();
		var isIE = (ua.indexOf('msie') >= 0 || ua.indexOf('trident') >= 0);
		//IEだった場合
		if (isIE) {
			setTimeout(function(){
				var position = $(hash).offset().top;
				$("html, body").scrollTop(Number(position)-headerH);
			},500);
		//IE以外
		} else {
			//アンカーリンクの位置取得
			var position = $(hash).offset().top;
			//アンカーリンクの位置まで移動
			$("html, body").scrollTop(Number(position)-headerH);
		}
	}
});

setTimeoutで若干ラグを作り動かしています。
もっと良い方法があるかと思いますので、上記は参考程度にしていただければと思います。