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

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

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

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

1047閲覧

ハンバーガーメニューをページ内リンクをクリックして閉じたい

ringo5656

総合スコア1

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/11/27 09:02

編集2021/11/27 09:39

前提・実現したいこと

ハンバーガーメニューのページ内リンクをクリックすると、ハンバーガーメニューが閉じるようにしたいです。
過去の同様の質問を見ながら自分で書いてみたのですが、リンクをクリックしても閉じません。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

html

1<p class="humbergerBtn open"><span class="fas fa-stream fa-2x"></span></p> 2<p class="humbergerBtn close"><span class="fas fa-times fa-3x"></span></p> 3 4<nav class="humberger"> 5 <ul class="humbergerUl"> 6 <li><a href="#about"><i class="fas fa-sm fa-feather-alt"></i> <span>A</span>BOUT</a></li> 7 <li><a href="#news"><i class="fas fa-sm fa-feather-alt"></i> <span>N</span>EWS</a></li> 8 <li><a href="#service"><i class="fas fa-sm fa-feather-alt"></i> <span>S</span>ERVICE</a></li> 9 <li><a href="#contact"><i class="fas fa-sm fa-feather-alt"></i> <span>C</span>ONTACT</a></li> 10 <li><a href="#company"><i class="fas fa-sm fa-feather-alt"></i> <span>C</span>OMPANY</a></li> 11 </ul> 12</nav>

css

1.open, .close { 2 margin-right: 20px; 3 display: none; 4} 5 6.humberger { 7 position: fixed; 8 z-index: 20; 9 top: 100px; 10 transform: translateY(-200%); 11 transition: all 1s; 12 width: 100%; 13 background-color: #FFFFFF; 14} 15 16nav.humberger a { 17 border-bottom: solid 1px #ebebec; 18} 19 20nav.humberger li { 21 height: 50px; 22 line-height: 50px; 23} 24 25nav.humberger li a { 26 display: block; 27 text-align: center; 28} 29 30nav.humberger.active { 31 transform: translateY(0%); 32} 33 34 /* スマホ向けレイアウト */ 35 @media all and (max-width: 800px) { 36 37 header {align-items: center;} 38 .header-menu {display: none;} 39 .open {display: block;} 40 .open.active {display: none;} 41 .close.active {display: block;} 42 43 44} 45

javascript

1 $(function() { 2 $('.humbergerBtn').click(function() { 3 $(this).toggleClass('active'); 4 if ($(this).hasClass('active')) { 5 $('.humberger').addClass('active'); 6 $('body').addClass('overflowHidden'); 7 $('.open').addClass('active'); 8 $('.close').addClass('active'); 9 } else { 10 $('.humberger').removeClass('active'); 11 $('.open').removeClass('active'); 12 $('.close').removeClass('active'); 13 $('body').removeClass('overflowHidden'); 14 } 15 }); 16 17 $('.humberger a').click(function() { 18 $('.humbergerBtn').trigger('click'); 19 }); 20 21 22 }); 23

試したこと

ソースに記載しているように、過去の同様の質問を見ながら、下記を追記してみましたが、何も変わりませんでした・・・。
$('.humberger a').click(function() {
$('.humbergerBtn').trigger('click');
});
探り探りで作っている状況で、勉強不足でお恥ずかしいですが、どこがおかしいのかご教授いただけるとありがたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

原因、解決策、原因を見つけた方法、その他気になった点について、回答します。

原因

ハンバーガーメニューのページ内リンクをクリックした際に、ハンバーガーメニューが閉じない原因についてです。
質問者さんが「試したこと」で追記した下記のコードにより、 .humbergerBtn というクラス名のついた要素に対してクリックイベントが実行されるようになりますが、

JavaScript

1 $('.humberger a').click(function () { 2 $('.humbergerBtn').trigger('click'); 3 });

ここで問題になるのが、 .humbergerBtn というクラス名を持つ要素が下記の2つあるということです。

HTML

1 <p class="humbergerBtn open"><span class="fas fa-stream fa-2x"></span></p> 2 <p class="humbergerBtn close"><span class="fas fa-times fa-3x"></span></p>

その為、クリックイベントが2回実行されてしまい、.active クラスを外したのに、すぐにまた .active クラスが付けられて、結果的にハンバーガーメニューが閉じない状態になっています。

解決策

いくつか解決策あるかもしれませんが、一番手っ取り早い解決策は、下記のように .open もしくは .close を追記して、一つの要素に対してクリックイベントが実行されるようにすることです。

JavaScript

1 $('.humberger a').click(function () { 2 $('.humbergerBtn.open').trigger('click'); // .open もしくは .close を追記する 3 });

原因を見つけた方法

原因と解決策だけだと自走力がつかないので、原因を見つけた方法についてもお伝えしておきます。
JavaScriptで意図した通りに動かないというような場合、console.log()メソッドで、ログを出力してみてください。
(Chrome開発者ツールのコンソールタブ(Console)に出力される)
そうすることで、呼び出しているはずの関数が実際に呼び出されてるのか、変数に意図したものが入っているのか、ということを確認できます。

今回の場合、下記のように、.humbergerBtn のクリック時に実行される関数内に、console.log()を仕込みました。
その結果、ハンバーガーメニューのページ内リンクをクリックした際に、ログが2回出力されたので、関数が2回実行されてることに気づきました。

JavaScript

1 $('.humbergerBtn').click(function () { 2 // 下記のようにログに出してみる 3 console.log('*** .humbergerBtn がクリックされた。***'); 4 console.log(' this: ', this); 5 console.log(' this.classList: ', this.classList); 6 7 $(this).toggleClass('active'); 8 if ($(this).hasClass('active')) { 9 $('.humberger').addClass('active'); 10 $('body').addClass('overflowHidden'); 11 $('.open').addClass('active'); 12 $('.close').addClass('active'); 13 } else { 14 $('.humberger').removeClass('active'); 15 $('.open').removeClass('active'); 16 $('.close').removeClass('active'); 17 $('body').removeClass('overflowHidden'); 18 }

デバッグ方法は色々あると思いますが、ログに出力してみるのは有効な方法の一つですので、今後何か詰まった際に試してみてください(^^)b

その他気になった点

  • ハンバーガーのスペルが違う(誤: humberger 、正: hamburger)
  • 貼っていただいた css や JS のコードのインデントが揃っていない

    => Mac で vscode 使ってる場合は alt+shift+F でフォーマットを綺麗にできます。


以上、うまくいくよう願っています。
ファイトです!!

投稿2021/11/28 02:28

編集2021/11/28 02:35
hirotry

総合スコア53

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

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

ringo5656

2021/11/28 02:51

どうもありがとうございます! humbergerBtnだとクラスを2つもっているとのこと、そういうことだったのかと気づけました! また、console logを検証ツールで使ったことがなかったため、大変勉強になりました。今まで動かないときにどう探せばいいのか全くわからず、ただコードを眺めるだけだったので、本当にありがたいです。 スペルミスお恥ずかしいです…インデントもきちんと揃えるように致します。 本当にありがとうございました。
guest

0

ソースの記述が大変わかりづらかったため、別途質問させていただきます。

投稿2021/11/28 01:31

ringo5656

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問