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

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

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

SCSSは、SassのCSSメタ言語です。Webページのスタイルを指定するCSSを効率的に記述することができます。ネストと呼ばれる入れ子構造で記述するため、CSSの全体の記述量を減らせる点が特徴です。さらに変数も利用できるため、変更や修正の際に少ない作業量で対応することもできます。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

0回答

227閲覧

JavaScriptでのアコーディオンメニュー

happycoding

総合スコア0

SCSS

SCSSは、SassのCSSメタ言語です。Webページのスタイルを指定するCSSを効率的に記述することができます。ネストと呼ばれる入れ子構造で記述するため、CSSの全体の記述量を減らせる点が特徴です。さらに変数も利用できるため、変更や修正の際に少ない作業量で対応することもできます。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

1クリップ

投稿2022/07/23 05:31

前提

JavaScriptを使用したアコーディオンメニューの実装

実現したいこと

pcメインで制作しているサイトのメガメニューを、sp表示の際にハンバーガーメニューにしており、JavaScriptでのアコーディオンメニューを実装したいと考えております。
対象の要素(<a href="" class="lower__item">)をクリック時に、要素(<div class="dropdown">)にクラス名の着脱をすることによって、アコーディオンメニューの表示・非表示を切り替えたいです。

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

アコーディオンメニューが開いた瞬間に、Browsersync:connected と表示され、一瞬でハンバーバーメニューごと閉じてしまいます。(勝手にリロードが行われているのでしょうか?)
JavaScriptに慣れておらず何時間も費やしてしまっているので、お力添えをいただけますと幸いです。

該当のソースコード

headerの記述量が多いため、一部を抜粋しています。

<button class="header__hamburger hamburger" id="js-hamburger"> <span></span> <span></span> <span></span> </button> <div class="l-header__lower" id="js-nav"> <ul class="l-header__list"> <li> <a href="" class="lower__item">企業情報<span class="c-icon_open"></span></a> <div class="dropdown"> <div class="dropdown__inner"> <div class="dropdown__list"> <div class="dropdown__item"> <p class="dropdown__title">メッセージ</p> <div> <a href="#">CEOメッセージ</a> <span class="c-icon arrow-right"></span> </div> <div> <a href="#">会長メッセージ</a> <span class="c-icon arrow-right"></span> </div> </div> <div class="dropdown__item"> <p class="dropdown__title">基本理念 / WORLD VISION</p> <div> <a href="#">基本理念 / WORLD VISION</a> <span class="c-icon arrow-right"></span> </div> </div> </div> </div> </div> </li> <!--本来は同じ構造の<li>タグがこの後も続きます--> </ul> </div> </div>
.header__hamburger { width: 25px; height: 100%;} .hamburger{z-index: 1; margin-left: 16px; span {width: 100%; height: 2px; position: relative; transition: ease .4s; display: block; background-color: #111111; &:nth-child(1){top: 0;} &:nth-child(2){margin: 4px 0;} &:nth-child(3){top:0;} } &.is-active{ span:nth-child(1){top:5px; transform: rotate(45deg);} span:nth-child(2){opacity: 0;} span:nth-child(3){top:-6.5px; transform: rotate(-45deg);} } } .l-header__lower{display: none; &.is-active{display: block; padding: 0; background-color: #fff; transform: translateX(0); .l-header__list{display: block; &:first-child{@include border-top;} li{margin: 0; padding: 0; .lower__item{position: relative; display:inline-block; font-size: $font_m_vw; font-weight: normal; @include border-bottom; padding: 16px 10px; width: 100%;} } a:not(.lower__item),p:not(.dropdown__title){padding: 16px 0;} } } } .dropdown{ background-color: #EDEDED; box-shadow: none; display: block; position: static; padding: 0; line-height: 0; height: 0; overflow: hidden; opacity: 0; transition-duration: .4s; &__inner{padding: 0;} &__list{display: block; padding-top: 0;} &__item{width: auto; div{padding-left: 42px;} } &__title{font-weight: normal; font-size: $font_s_vw; @include border-bottom; padding: 16px 0 16px 16px;} &.is-open{line-height: normal; height: auto; opacity: 1; } }
//ハンバーガーメニュー var ham = document.querySelector("#js-hamburger"); var nav = document.querySelector("#js-nav"); ham.addEventListener("click", function () { ham.classList.toggle("is-active"); nav.classList.toggle("is-active"); }); // アコーディオンメニュー var acco = document.querySelectorAll(".lower__item"); function accordion() { var content = this.nextElementSibling; content.classList.toggle("is-open"); }; for (let i = 0; i < acco.length; i++) { acco[i].addEventListener("click", accordion); };

試したこと

検証ツールで確認をしましたが、エラーは何も表示されていません。

<div class="dropdown">に手動で.is-openクラスを追加すると思い通りに表示されるので、cssの問題ではないと思っています。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問