HOME > jQuery > ナビを途中から固定にする

ナビを途中から固定にする

メインビジュアルの下などに配置したグロナビ(メニューなど)がスクロールでブラウザ画面の上部に来た時に、画面トップで固定表示に変更する方法をメモ。

HTMLはベーシックなものを。

<header id="header">ロゴ</header>
<main>
<div id="mv><img src="/images/mv.png" alt="" /></div>
<nav id="gNavi">
<ul>
<li>メニュー</li>
<li>メニュー</li>
<li>メニュー</li>
</ul></nav>

</main>

スクロールに応じて、グロナビにクラス名「fixed」を追加して、fixedの時は、position:fixedにするよ、と。

#gNavi{
display: flex;
width: 100%;
}
#gNavi.fixed{
position:fixed;
top:0;
left:0;
right:0;
}

jQueryはグロナビの位置までスクロールしたら、クラス名を追加・削除しますよ、というもの。

var navPos = jQuery( '#gNavi' ).offset().top; // グローバルメニューの位置
$(window).on( 'scroll', function() {
	if ( $( this ).scrollTop() > navPos ) {
		$( '#gNavi' ).addClass( 'fixed' );
	} else {
		$( '#gNavi' ).removeClass( 'fixed' );
	}
});

こちらのjQueryはヘッダーが固定で、グロナビをヘッダーの次に固定する場合。fixedするときのtopの値をヘッダーの高さにすることで、cssで値に悩まないで済みます。

var headerHeight = jQuery( '#header' ).outerHeight(); // ヘッダーの高さ
var navPos = jQuery( '#gNavi' ).offset().top - headerHeight; // グローバルメニューの位置
$(window).on( 'scroll', function() {
	if ( $( this ).scrollTop() > navPos ) {
		$( '#gNavi' ).css( 'top', headerHeight );
		$( '#gNavi' ).addClass( 'fixed' );
	} else {
		$( '#gNavi' ).css( 'top', 0 );
		$( '#gNavi' ).removeClass( 'fixed' );
	}
});
参考サイト