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

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

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

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

Q&A

解決済

1回答

1930閲覧

バーガーメニューのページ内リンクをクリックしたときにバーガーメニューが閉じない

yudai_1220

総合スコア3

JavaScript

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

0グッド

1クリップ

投稿2022/09/09 05:46

前提

Webサイトのハンバーガーメニューの開閉をJavascriptで制御しているのですが、ハンバーガーメニューを開いた時にページ内リンクであるナビメニューを押してもハンバーガーメニューが閉じてくれません。

ハンバーガーメニューの開閉はクラスの付与・削除の切り替えで制御しており、エラーは表示されていません。

エラーが表示されていないということはどこかで単純なミスを犯していると思うのですが、JavaScript初学者のため自分ではどこが間違っているのかわかりません。

JavaScriptの以下の部分がうまく機能しません。

JavaScript

1navItems.forEach( (navItem) => { 2 navItem.addEventListener('click', () => { 3 burgerBtn.classList.remove('active'); 4 headerNav.classList.remove('slide-in'); 5 body.classList.remove('no-scroll'); 6 }); 7});

実現したいこと

  • ハンバーガーメニューのページ内リンクをクリックしたときにもハンバーガーメニューを閉じるようにしたい。

該当のソースコード

HTML

1<nav class="header-nav"> 2 <ul class="nav-list"> 3 <li class="nav-item"><a href="#works">Works</a></li> 4 <li class="nav-item"><a href="#service">Service</a></li> 5 <li class="nav-item"><a href="#about">About</a></li> 6 <li class="nav-item"><a href="contact.html">Contact</a></li> 7 </ul> 8</nav>

SCSS

1.burger-btn { 2 display: block; 3 position: relative; 4 z-index: 30; 5 cursor: pointer; 6 width: 50px; 7 height: 50px; 8 transition: all .5s; 9 .burger-btn-area { 10 transition: all .5s; 11 span { 12 display: inline-block; 13 transition: all .5s; 14 position: absolute; 15 width: 45%; 16 height: 3px; 17 background-color: #fff; 18 left: 14px; 19 border-radius: 2px; 20 &:nth-of-type(1) { 21 top: 15px; 22 } 23 &:nth-of-type(2) { 24 top: 23px; 25 } 26 &:nth-of-type(3) { 27 top: 31px; 28 } 29 } 30 } 31 /* ハンバーガーメニューがクリックされた後 */ 32 &.active { 33 .burger-btn-area { 34 transform: rotateY(-360deg); 35 } 36 .bar { 37 &:nth-of-type(1) { 38 top: 18px; 39 left: 18px; 40 transform: translateY(6px) rotate(-135deg); 41 } 42 &:nth-of-type(2) { 43 opacity: 0; 44 } 45 &:nth-of-type(3) { 46 top: 30px; 47 left: 18px; 48 transform: translateY(-6px) rotate(135deg); 49 } 50 } 51 } 52} 53 54.no-scroll { 55 overflow: hidden; 56} 57 58.header-nav { 59 position: fixed; 60 top: -100%; 61 left: 100%; 62 z-index: 20; 63 background-color: #333; 64 width: 100vw; 65 height: 100vh; 66 transition: all 1s; 67 &.slide-in { 68 top: 0; 69 left: 0; 70 } 71 .nav-list { 72 position: absolute; 73 top: 50%; 74 left: 50%; 75 transform: translate(-50%, -50%); 76 text-align: center; 77 .nav-item { 78 margin-bottom: 20px; 79 } 80 a { 81 font-size: rem(20); 82 font-weight: bold; 83 color: #fff; 84 position: relative; 85 transition: all .5s; 86 } 87 } 88 } 89 } 90 }

JavaScript

1const burgerBtn = document.querySelector('.burger-btn'); 2const headerNav = document.querySelector('.header-nav'); 3const navItems = document.querySelectorAll('.nav-item'); 4const body = document.querySelector('body'); 5 6burgerBtn.addEventListener('click', () => { 7 burgerBtn.classList.toggle('active'); 8 headerNav.classList.toggle('slide-in'); 9 body.classList.toggle('no-scroll'); 10}); 11 12headerNav.addEventListener('click', () => { 13 burgerBtn.classList.toggle('active'); 14 headerNav.classList.toggle('slide-in'); 15 body.classList.toggle('no-scroll'); 16}); 17 18navItems.forEach( (navItem) => { 19 navItem.addEventListener('click', () => { 20 burgerBtn.classList.remove('active'); 21 headerNav.classList.remove('slide-in'); 22 body.classList.remove('no-scroll'); 23 }); 24});

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

イベントのバブリングが原因ですね。
クリックすると祖先要素のクリックイベントも発生します。

そのため、リンクでクラスをremoveしても、 header-navの toggle でクラスが付加されます。

stopPropagation メソッドでバブリングを停止すればいいでしょう。

JavaScript

1navItems.forEach( navItem => { 2 navItem.addEventListener('click', () => { 3 burgerBtn.classList.remove('active'); 4 headerNav.classList.remove('slide-in'); 5 body.classList.remove('no-scroll'); 6 event.stopPropagation(); //追加 7 }); 8});

投稿2022/09/09 07:20

編集2022/09/09 11:10
hatena19

総合スコア33715

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

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

yudai_1220

2022/09/10 10:01

回答ありがとうございます! event.stopPropagation();を追加したところ、ちゃんと挙動してくれました。 イベントの伝播についてあまり知らなかったので、また一つ勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問