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

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

新規登録して質問してみよう
ただいま回答率
85.35%
メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

1812閲覧

jQueryナビゲーションクリックでメニュー表示

jyoze

総合スコア48

メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/08/12 10:20

jQueryを使ってメガメニューを作成したいのですが、JSの部分がどおしても上手くいきません。
下記のJSを書いており、現状メニューをクリック後、別のメニューをクリックしても、
最初にクリックしたメニューが非表示となりません。
.fadeToggleを使っているので、非表示にしたいメニューをもう一度クリックすれば、非表示にはなるのですが、
よく見る一般的なメガメニューのように、他のメニューをクリックした時に、
自動的にそれ意外のメニューを非表示にできればと考えております。

js

1$(".header__sub-nav").hide();

いろいろ試しており、上記のコードを最初に加えることで、非表示にすることは可能となりました。
ただ、このコードだと、例えばMENU01を2回クリックしても、非表示にできません...
つまり一度メガメニューを開くと「メガメニューが表示されていない状態」に戻すことができません。

一般的なメガメニューを作成するにはどのようにコードを変更すればよろしいでしょうか。

codepenで同じ状態を再現しております。
https://codepen.io/jyoze/pen/bGWzXpG

html

1 <header class="header"> 2 <div class="header__inner"> 3 <div class="header__right"> 4 <nav class="header__nav"> 5 <ul> 6 <li><a href="#sub1">MENU01</a></li> 7 <li><a href="#sub2">MENU02</a></li> 8 <li><a href="#sub2">MENU03</a></li> 9 </ul> 10 </nav> 11 </div> 12 </div> 13 14 <div class="header__sub-nav" id="sub1"> 15 <h2 class="no-style">サブナビ01</h2> 16 <ul> 17 <li><a href="">MENU</a></li> 18 <li><a href="">MENU</a></li> 19 <li><a href="">MENU</a></li> 20 <li><a href="">MENU</a></li> 21 </ul> 22 </div> 23 <div class="header__sub-nav" id="sub2"> 24 <h2 class="no-style">サブナビ03</h2> 25 <ul> 26 <li><a href="">MENU</a></li> 27 <li><a href="">MENU</a></li> 28 <li><a href="">MENU</a></li> 29 <li><a href="">MENU</a></li> 30 </ul> 31 </div> 32 <div class="header__sub-nav" id="sub3"> 33 <h2 class="no-style">サブナビ03</h2> 34 <ul> 35 <li><a href="">MENU</a></li> 36 <li><a href="">MENU</a></li> 37 <li><a href="">MENU</a></li> 38 <li><a href="">MENU</a></li> 39 </ul> 40 </div> 41 42 </header>

scss

1 2.header { 3 &__inner { 4 position: relative; 5 display: flex; 6 align-items: center; 7 justify-content: space-between; 8 width: calc(100% - 30px); 9 padding: 15px 15px; 10 margin: 0 auto; 11 box-sizing: content-box; 12 line-height: 1; 13 } 14 &__nav { 15 ul { 16 display: flex; 17 justify-content: flex-end; 18 li:not(:last-child) { 19 margin-right: 20px; 20 } 21 } 22 a { 23 color: #000; 24 } 25 } 26 &__sub-nav { 27 display: none; 28 position: absolute; 29 // bottom: 0; 30 left: 0; 31 z-index: 9999; 32 width: 100vw; 33 background-color: #fff; 34 } 35}

js

1 <script> 2 $(function(){ 3 $('.header__nav li a').on('click', function () { 4 $($(this).attr("href")).fadeToggle(); 5 if( $("[href^='#']") ){ 6 return false; 7 } 8 }); 9 }); 10 </script>

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記の形でどうでしょうか。

js

1$(function(){ 2 let openedId = ''; //開いているメニューのIDを保存 開いていない時は空とする 3 $('.header__nav li a').on('click', function () { 4 //開いているメニューがある時は閉じる 5 if(openedId!=='') $(openedId).stop(false, false).fadeOut(); 6 //開いていたメニューと押したメニューが同じ場合は空、違う場合はIDを保存 7 openedId = (openedId===$(this).attr("href")) ? '' : $(this).attr("href"); 8 //IDが保存されている場合はそのメニューを開く 9 if(openedId!=='') $(openedId).stop(false, false).fadeIn(); 10 }); 11});

途中の.stop(false, false)はメニューを連打された時、遅れてアニメーションが実行されないために入れています。意味がわからなかったら、2箇所の.stop(false, false)を消して、メニューを連打してみてください。

投稿2021/08/12 13:22

webgoto

総合スコア1293

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

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

jyoze

2021/08/13 03:40

webgotoさん、ご教示ありがとうございます。 上記内容で作りたかった形ができましたm(_ _)m 一点だけすみません、サイト内に高さがあるときに、ナビゲーションをクリックすると、 上記方法だとアンカーリンクのように、下にスライドしてしまいます。 こちらは防げないでしょうか? 下記でテストしております。 https://codepen.io/jyoze/pen/ZEKPXLR
webgoto

2021/08/13 12:26

clickの引数にeを追加して、e.preventDefault()で通常のリンククリックを無効にすると良いと思います。 $('.header__nav li a').on('click', function (e) { e.preventDefault();
jyoze

2021/08/13 16:51

webgotoさん、大変ありがとうございます。 申し訳ございません、 メガメニューでは無く通常のリンクをが含まれる場合は、if分で分ける必要があるかと思うのですが、その場合は、どのようになりますでしょうか。 if($(this).indexOf('#')) { e.preventDefault(); } このようにしてみたのですが、上手く動きませんでした... a要素ではなくli要素にIDを付ける方法も試してみたのですが、うまく動きませんでした...
webgoto

2021/08/14 00:21

通常のリンクは元から除外したほうが良いと思いますので、メニューを開くaに.megaとクラス名を追加して、 $('.header__nav li a.mega').on('click', function () { としてメニューを開くリンクがクリックされた時だけ、関数が実行されるようにするのが良いと思います。
jyoze

2021/08/14 03:05

webgotoさん、ありがとうございます。 丁寧に教えていただき、とても助かりました。 無事解決いたしました。とても単純な方法で解決できるのですね。 解決までお付き合いいただき、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問