質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1911閲覧

うぇぶもよう様カスタマイズのmeanmenuを1ページで使う場合、ページトップに戻った際の挙動について。

kohal

総合スコア17

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/02/25 08:45

編集2020/02/25 08:51

うぇぶもよう

うぇぶもよう様カスタマイズの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});

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

メニューが開いているかどうかは内部で管理しているので見た目だけ変えても駄目です。 .trigger() でメニュー開閉ボタンをクリックしたことにします。

jQuery

1 $('.mean-nav ul li a').on('click', function() { 2 $('.meanmenu-reveal').trigger('click'); 3 // スクロール処理...

https://api.jquery.com/trigger/

カスタマイズの「(オーバーレイマスクを)タップでメニューを閉じたい。」で同様のことをしているので確認してください。

jQuery

1 .on('touchend click', '.mean-bar .mask', function(e) { 2 $('.mean-bar .meanmenu-reveal').trigger('click'); 3 return false; 4 });

投稿2020/02/26 06:16

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kohal

2020/02/26 15:18

x_x様 ご回答ありがとうございます。 返信が遅くなり申し訳ありません。 >>(オーバーレイマスクを)タップでメニューを閉じたい。」で同様のことをしているので ご教示いただいた箇所にまとめた方が良いかと .on('touchend click', '.mean-bar .mask .mean-nav ul li a', function(e) { と入れてみましたらmaskをクリックしても何も起きなくなってしまったので 別に書いてみることにして、リンクにクラスをつけて '.mean-bar .mask'の箇所をつけたクラスに書き換えて同じように追記しました。 追加クラスも最初は'.mean-bar .mask'のところにまとめたのですが、 全く動かなくなったので行を丸ごとコピペで増やしました。 結果、やはり期待した挙動にはなりませんでした。 色々と書き方を変えて試してみましたがなかなか難しそうです。 一点気になったのは、ulメニュークリック後に一回消えてまた出てくるという挙動で 本体のjquery.meanmenu.min.jsで以下のeventがあるようでした。 これが何をしているのかはわかりません。 function() { jQuery(".mean-nav ul:first").slideUp(), A = !1, jQuery(M).toggleClass("meanclose").html(s) } とても面倒そうならこれを使うのは諦めて他を探してみようかと思いますが もしも簡単な追記の方法がありそうならば具体的に教えていただけませんでしょうか。 よろしくお願いします。
x_x

2020/02/27 01:12

わたしも参考サイトからダウンロードして検証しているので動かないということはないと思うのですが、提示されていないコード箇所(HTML)でおかしなことをしていないか見てみてください。 また、「2018/8/16追記」とあって修正されているので、それ以前に取得したものであれば変わっている可能性があります。 なお、気にしているコードは最新版の圧縮前で次のようになっているところです。 jQuery('.mean-nav ul > li > a:first-child').on( "click" , function () { jQuery('.mean-nav ul:first').slideUp(); menuOn = false; jQuery($navreveal).toggleClass("meanclose").html(meanMenuOpen); }); https://github.com/meanthemes/meanMenu/blob/master/jquery.meanmenu.js onePage オプションが true のときの処理で今回の要件に合っていて使えそうなのですが、参考サイトのカスタマイズとは合わないのでカスタムが必要なら避けたほうがよさそうです。
kohal

2020/02/27 07:44

x_x様 ダウンロードまでして試してくださってありがとうございます。 私が作ったhtml他が悪さをしているかもとのことで、ダウンロードしたままのファイルでonePageオプションもいじらずに、以下を入れて試してみました。 メニューのリンクのみページ内リンクに変更しました。 //ページ内リンク時の処理 $(document) .on('touchend click', '.mean-nav ul li a', function(e) { $('.mean-bar .meanmenu-reveal').trigger('click'); return false; }); 無事に色々消えました。 先のコメント時には書き方が間違っていたかもしれません。お騒がせしました。 が、リンク先に飛びません。元はbodyがtop:0pxでfixされていたのが原因かと思ったのですが教えていただいたコードでfixedは取れています。(top:0pxは取れません) >>参考サイトのカスタマイズとは合わないのでカスタムが必要なら避けたほうがよさそうです。 ページ内リンクで使う想定はされていないのでしょうか。 でしたら、せっかく色々教えていただきましたのに、残念ですが諦めるしかないかもしれませんね…。
x_x

2020/02/27 10:50

return false;としてデフォルトの動きをキャンセルしているのであればリンク先に飛ばないので自前で処理する必要があります。コメントで// スクロール処理...と書いたところですね。 > ページ内リンクで使う想定はされていない 参考サイトはそうでしょうね。また、避けたほうがいいと言っているのは onePage オプションを使うことです。 当初の回答通りにしていれば使わずにページ内リンクで行けるかと思います。
kohal

2020/02/27 15:21

x_x様 度々ありがとうございます。 >>当初の回答通りにしていれば使わずにページ内リンクで行けるかと思います。 $('.mean-nav ul li a').on('click', function() { $('.meanmenu-reveal').trigger('click'); // スクロール処理... .on('touchend click', '.mean-nav ul li a', function(e) { $('.mean-bar .meanmenu-reveal').trigger('click'); return false; }); 「当初の回答通り」というとこういう書き方でしょうか。 「// スクロール処理...」のところはどう書けば良いですか? すみませんが、具体的な記述を教えていただけませんか? よろしくお願いします。
x_x

2020/02/28 02:53

そんな書き方でエラーが出ていないのですか? カスタムによってスクロールバーが消されているので出るのを待ってからスクロールするようにすればいいです。 var a = this; setTimeout(function() { var position = $(a.hash).offset().top; $('body,html').animate({ scrollTop: position }); }, 750);
kohal

2020/03/01 16:55

x_x様 なんどもありがとうございました。 お返事が遅くなり申し訳ありません。 どうしても私のスキルでは難しそうですので今回は残念ですが諦めることにいたします。 なんどもコメントいただきましたのにすみません。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問