スマホのアコーディオンメニューで、縦に長くなった場合、メニューをスクロールできると同時に、バックのスクロールは動作しないようにする
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'));//メニュー表示ボタンの画像を変更 } })