うぇぶもよう様カスタマイズのjQueryプラグインのmeanmenuを使いたいのですが、シングルページサイトでうまく動きませんでした。
ページ内アンカーで移動したいのですが、リンクをクリックしても移動しない、maskが消えないなどの問題があったので検索をして以下のコードを足しました。
JavaScript
1$('.mean-nav ul li a').on('click', function() { 2$('body').removeClass('fixed').css({'top': 0}); 3$('.mean-container').removeClass("open"); 4$('.mean-nav .mask').hide();
これで移動とmaskを消すことはできたのですが、移動後、ページトップまで戻って再度ハンバーガー開閉ボタンを押すとメニューは出ますがmaskが出ません。
もう一度ハンバーガー開閉ボタンを押すと正しく動いてくれます。
ページトップに戻るリンクで戻っても、スクロールで戻っても同様です。
開発ツールで確認すると、ページトップまで戻って一度目にボタンを押した時の様子は以下の通りです。
- body,mean-containerにはクラスが付与されない
- maskはインラインスタイルの"display: none;"のまま
- ハンバーガー開閉ボタンにはクラスが付与される
- ナビ本体のulはインラインスタイルの"display: none;"が削除されて<ul class="nav" style="">になる
一度で正しく動くようにするにはどうしたら良いかわからず、教えていただけますでしょうか。
meanmenu.jsはうぇぶもよう様にてカスタマイズされており、最新のバージョンではありません。
長くなってしまって申し訳有りませんが、参考までに元のコードと書き足したコードの全体を載せておきます。
元のコード
javascript
1$(function($){ 2 //メニューの表示状態保管用 3 var state = false; 4 //.bodyのスクロール位置 5 var scrollpos = 0; 6 //meanmenuの状態による表示制御 7 function mm_control() { 8 if($('.mean-nav .nav').is(':visible')) { 9 //表示中 10 if(state == false) { 11 scrollpos = $(window).scrollTop(); 12 $('body').addClass('fixed').css({'top': -scrollpos}); 13 $('.mean-container').addClass('open'); 14 $('.mean-nav .mask').show(); 15 state = true; 16 } 17 } else { 18 //非表示中 19 if(state == true) { 20 $('body').removeClass('fixed').css({'top': 0}); 21 window.scrollTo( 0 , scrollpos ); 22 $('.mean-container').removeClass('open'); 23 $('.mean-nav .mask').hide(); 24 state = false; 25 } 26 } 27 } 28 29 $('#gNav').meanmenu({ 30 meanMenuContainer: "#header .h_nav", // メニューを表示させる位置 31 meanScreenWidth: "768" 32 }); 33 $(document) 34 .on('opend.meanmenu closed.meanmenu', function() { 35 mm_control(); 36 }) 37 .on('touchend click', '.mean-bar .mask', function(e) { 38 $('.mean-bar .meanmenu-reveal').trigger('click'); 39 return false; 40 }); 41 //ウィンドウサイズ変更によるメニュー非表示時の制御 42 $(window).on('resize', function() { 43 mm_control(); 44 }); 45});
書き足したコード
javascript
1 2$(function($){ 3 //メニューの表示状態保管用 4 var state = false; 5 //.bodyのスクロール位置 6 var scrollpos = 0; 7 //meanmenuの状態による表示制御 8 function mm_control() { 9 if($('.mean-nav .nav').is(':visible')) { 10 //表示中 11 if(state == false) { 12 scrollpos = $(window).scrollTop(); 13 $('body').addClass('fixed').css({'top': -scrollpos}); 14 $('.mean-container').addClass('open'); 15 $('.mean-nav .mask').show(); 16 state = true; 17 } 18 } else { 19 //非表示中 20 if(state == true) { 21 $('body').removeClass('fixed').css({'top': 0}); 22 window.scrollTo( 0 , scrollpos ); 23 $('.mean-container').removeClass('open'); 24 $('.mean-nav .mask').hide(); 25 state = false; 26 } 27 } 28 } 29 30 $('#gNav').meanmenu({ 31 meanMenuContainer: "#header .h_nav", // メニューを表示させる位置 32 meanScreenWidth: "640" 33 }); 34 $(document) 35 .on('opend.meanmenu closed.meanmenu', function() { 36 mm_control(); 37 }) 38 .on('touchend click', '.mean-bar .mask', function(e) { 39 $('.mean-bar .meanmenu-reveal').trigger('click'); 40 return false; 41 }); 42 43//ページ内リンク時の処理 44 $('.mean-nav ul li a').on('click', function() { 45 $('body').removeClass('fixed').css({'top': 0}); 46 $('.mean-container').removeClass("open"); 47 $('.mean-nav .mask').hide(); 48}); 49//スムーススクロール処理 50$('a[href^="#"]').click(function() { 51 var speed = 400; 52 var href= $(this).attr("href"); 53 var target = $(href == "#" || href == "" ? 'html' : href); 54 var position = target.offset().top; 55 $('body,html').animate({scrollTop:position}, speed, 'swing'); 56 return false; 57 }); 58 //ウィンドウサイズ変更によるメニュー非表示時の制御 59 $(window).on('resize', function() { 60 mm_control(); 61 }); 62});
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/26 15:18
2020/02/27 01:12
2020/02/27 07:44
2020/02/27 10:50
2020/02/27 15:21
2020/02/28 02:53
2020/03/01 16:55