web関連

【css・js】スマホメニューの「position: fixed;」の使い方

【css・js】スマホメニューの「position: fixed;」の使い方

スマホでメニューボタンを押したら全画面でメニューが表示されるようにしたんだけど、スクロールすると後ろのコンテンツも動いちゃうんで調べた時の備忘録

やりたいこと

ハンバーガーメニューを押す

全体が暗転

メニューが出てくる

メニューはスクロール可能

後ろのコンテンツは固定

再度ハンバーガーメニューを押したら押した位置で暗転解除

【デモ(失敗例)】後ろのコンテンツが動いちゃってこれをどうにかしたかったのが今回調べるきっかえけになった

ソースコード

jquery

jQuery(function($){
    var scrollPos;//グローバルで初期かしておかないと上にもどっちゃう
    $('ボタン').on('click', function() {
        if($('body').hasClass('fix')){
            $('body').removeClass('fix').css('top',0 + 'px');
            window.scrollTo( 0 , scrollPos );//初期化
        }else{
            scrollPos = $(window).scrollTop();//現在のスクロール位置
            $('body').addClass('fix').css('top',-scrollPos + 'px');
        }
    });
});

ボタンを押したらbodyにclassを付与して現在のスクロール位置をcssでbodyに与える
再度ボタンを押したらclassとcssは解除

最初に「scrollPos」はグローバル変数?として宣言しておかないと解除した時に上に戻っちゃった

css

body.fix{
    position: fixed;
    /*指定しておかないとなんか右側が空く*/
    width: 100%;
}
.メニュー{
    /*↓書き方次第では不必要*/
    background: rgba(0, 0, 0, .8);
    display: none;
    /*↓必要*/
    height: 100%;
    width: 100%;
}
body.fix .メニュー{
    /*↓書き方次第では不必要*/
    display: block;
    color: white;
    padding: 20px;
    /*↓必要*/
    position:fixed;
    top: 0;
    overflow-y: scroll;
    /*スマホ時に慣性スクロールでヌルットスクロールさせるやつ*/
    -webkit-overflow-scrolling:touch;
}
【デモ(成功例)】前面のコンテンツだけスクロール可能
ボタンを押したら前面に出てくる要素と後ろのbodyどっちにも「position:fixed;」はかけないと駄目だったのか… cssでも理解しきれていない部分が多々あって勉強不足を痛感