スマホのアコーディオンメニューで、縦に長くなった場合、メニューをスクロールできると同時に、バックのスクロールは動作しないようにする

fixedでメニューを表示すると、bodyの位置が0になるため、スマホではメニューを表示すると、メニューの下にある画面はスクロールした位置から元の位置へ移動する。

fixedでメニュー表示しても、下の画面もスワイプすると動作してスクロールする。bodyをhiddenで固定して動かないようにする。

メニューのスクロールは、メニューの親枠に高さを設定して、スクロールをautoで表示させる。

    var currentScroll;//画面の位置を保管する変数
    var body = $("body");
    // スマホ用メニュー表示ボタン
    $(".sp_btn_menu img").click(function(){
        var spm_css = $("#sp_menu").css("display");//現在のメニューの状態を取得
        if(spm_css == "block") {//メニューを閉じる
            $("html, body").attr("style", "");//スワイプの動作でスクロールできるようにする
            $("body").scrollTop(currentScroll);//scroll位置を調整
            $("#sp_menu").slideUp("fast");//メニュー閉じる
            $(this).attr('src', $(this).attr('src').replace('_close', '_open'));//メニュー表示ボタンの画像を変更
        } else {//メニューを開く
            //メニュー表示時に後ろの画面が元表示の位置にとどまるようにする
            currentScroll = $(window).scrollTop();
            body.css({
                position: 'fixed',
                width: '100%',
                top: -1 * currentScroll
            });
            $("html").css("overflow", "hidden");//スワイプで後ろが動かないようにする
            var w_h = $(window).height();//画面の縦幅を取得
            $("#sp_menu").show().css("height", w_h - 60);//メニュー表示
            $(this).attr('src', $(this).attr('src').replace('_open', '_close'));//メニュー表示ボタンの画像を変更
        }
    })