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