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

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

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

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

Q&A

解決済

1回答

1307閲覧

JSでハンバーガーメニュー開いた後、メニュー外をクリックで閉じたい

nakaji-junk

総合スコア3

JavaScript

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

0グッド

0クリップ

投稿2020/06/19 04:42

初心者のためご教授頂けますと嬉しいです。

前提・実現したいこと

使用言語 javascript
btnをクリックでハンバーガーメニューを開くことはできます。
同じbtnをクリックで閉じることもできます。

btn以外の要素(container要素)をクリックしてもメニューを閉じる実装がしたいです。

該当のソースコード

HTML

<!--global-container--> <div class="global-container" id="global-container"> <!--mobile-menu--> <nav class="mobile-menu" id="mobile-menu"> ~略~ </nav><!--/mobaile-menu--> <!--container--> <div class="container" id="container"> <!--humberger--> <div class="humberger"> <button class="humberger-btn" id="humberger-btn"> <span></span> <span></span> <span></span> </button> </div><!--/humberger--> <!--main--> <section class="main"> ~以下、略~ </div><!--/container--> </div><!--/global-container-->

Javascript

const gCon = document.getElementById('global-container'); const con = document.getElementById('container'); const hBtn = document.getElementById('humberger-btn'); const mMenu = document.getElementById('mobile-menu'); hBtn.addEventListener('click', () => { gCon .classList.toggle('menu-open'); con.classList.toggle('menu-open'); mMenu.classList.toggle('menu-open'); }); con.addEventListener('click', () => { if(con.classList === 'menu-open') { gCon .classList.remove('menu-open'); con.classList.remove('menu-open'); mMenu.classList.remove('menu-open'); } });

エラーはないですが実行もされないです。

試したこと

試したこと①
比較演算子 === を == にした。
→変わらず。
containerに2つのクラスがあるからできない?(container,menu-open)

試したこと②
if文を消した
→開くこともできなくなった。

試したこと③
hasClassに変更
→エラー(Uncaught TypeError: con.hasClass is not a function
at HTMLDivElement.<anonymous>)

con.addEventListener('click', () => { if(con.hasClass('menu-open')) { gCon .classList.remove('menu-open'); con.classList.remove('menu-open'); mMenu.classList.remove('menu-open'); } });

色々と調べてみたのですが、jQueryの情報が多く解決できませんでした。
javascriptのみで実装がしたいのでどなたかご教授ください。
宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

btn以外の要素をクリックしてもメニューを閉じる

この仕様を愚直に実装すると以下のようになると思います。

javascript

1document.addEventListener('click', ({ target }) => { 2 if (target instanceof Element && target.closest('#humberger-btn')) return; 3 closeMenu(); 4});

カッコ書きの通り #container に限定するのであれば con.addEventListener( ... でいいのですが、
if (con.classList === 'menu-open') このif文が誤っています。
Element.prototype.classList が返す型は DOMTokenList というArrayLikeです。
これと文字列比較をしても当然一致するわけがないですよね?
DOMTokenListcontains メソッドを持っています。これを使えばいいです。

ただ、 DOMTokenList.prototype.remove は別に対象のトークンが無かったからといってエラーを出すものでもありません。
別にif文でガードする必要もないのではないかと思います(実現したい仕様によりますけど)

投稿2020/06/19 07:03

htsign

総合スコア870

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

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

nakaji-junk

2020/06/21 14:01

htsignさん、ご回答ありがとうございました! 上記の記述+closeMenu()の中身を記述したら希望通りの動きが実装できました。 また細かい解説もすごく勉強になりました。 まだ完全に理解できてはいませんが調べなら理解できるようにしたいと思います。
nakaji-junk

2020/06/21 14:02

迅速なご回答だったのにも関わらず返信が遅くなりすみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問