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

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

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

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

HTML

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

CSS

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

Q&A

解決済

1回答

2540閲覧

【アコーディオンメニュー】1つだけ展開したい(他は閉じる)

okuzono311

総合スコア9

jQuery

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

HTML

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

CSS

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

1グッド

0クリップ

投稿2020/03/13 19:19

前提・実現したいこと

jQueryを利用してアコーディオンメニューを作成中です。選択した1つのメニューのみ展開して、その他は閉じるものを作成したいです。
ご回答よろしくお願いします。

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

メニューは4つあります。上2つのメニューはうまく展開し自動で閉じることができますが、下2つのメニューが展開はするものの、他を選択した際に自動で閉じることができません。

該当のソースコード

HTML

1 <div class="accordion"> 2 <div class="accordion-wrap"> 3 <div class="accordion-item"> 4 <p class="accordion-header">はじめての方へ</p> 5 <i class="fa fa-angle-down tap" aria-hidden="true"></i> 6 </div> 7 <div class="accordion-text"> 8 <p>Moonのお客様は3割がはじめて来店されるお客さまです。はじめての方でも落ち着ける店内で、優しいママが歓迎します。</p> 9 </div> 10 </div> 11 <div class="accordion-wrap"> 12 <div class="accordion-item"> 13 <p class="accordion-header">お一人様へ</p> 14 <i class="fa fa-angle-down tap" aria-hidden="true"></i> 15 </div> 16 <div class="accordion-text"> 17 <p>1名様でもご遠慮なくお越しください。日頃のストレスは忘れて、ゆっくりお話ししませんか?Moonでは全く気を遣う必要がございませんよ。</p> 18 </div> 19 </div> 20 <div class="accordion-wrap"> 21 <div class="accordion-item"> 22 <p class="accordion-header">女性の方へ</p> 23 <i class="fa fa-angle-down tap" aria-hidden="true"></i> 24 </div> 25 <div class="accordion-text"> 26 <p>女性のお客様にもよくおいでになります。お友達感覚でお話しできると好評です。多い時には半分が女性のお客様の時も…!</p> 27 </div> 28 </div> 29 <div class="accordion-wrap"> 30 <div class="accordion-item"> 31 <p class="accordion-header">団体様へ</p> 32 <i class="fa fa-angle-down tap" aria-hidden="true"></i> 33 </div> 34 <div class="accordion-text"> 35 <p>団体様もぜひお越しください。広くはない店内ですが、座席数は最大11席です。(6席+簡易イス5席)ご予約いただけると幸いです。</p> 36 </div> 37 </div> 38 </div> 39

SCSS

1 .accordion{ 2 .accordion-wrap{ 3 padding-top: 20px; 4 width: 50%; 5 margin: 0 auto; 6 .accordion-item{ 7 display: flex; 8 justify-content: space-between; 9 align-items: center; 10 border-bottom: 2px solid #00afcc; 11 padding-top: 20px; 12 cursor: pointer; 13 transition: ease-in-out 300ms; 14 &.border-none{ 15 border-bottom: none; 16 } 17 .accordion-header{ 18 padding: 0; 19 transition: ease-in-out 300ms; 20 &.color-blue{ 21 color: rgb(31, 78, 121); 22 } 23 } 24 .tap{ 25 display: inline-block; 26 transition: ease-in-out 300ms; 27 &.rotate{ 28 transform: rotateX(180deg); 29 } 30 } 31 } 32 .accordion-text{ 33 display: none; 34 text-align: left; 35 font-size: 0.8rem; 36 border-bottom: 2px solid #00afcc; 37 &.block{ 38 display: block; 39 } 40 } 41 } 42 }

jQuery

1$('.accordion-wrap').click(function(){ 2 $(this).children().eq(1).slideToggle(300); 3 $(this).children().eq(0).toggleClass('border-none'); 4 $(this).find('.accordion-header').toggleClass('color-blue'); 5 $(this).find('.tap').toggleClass('rotate'); 6 7 $('.accordion-wrap').not(this).children().eq(1).slideUp(300); 8 $('.accordion-wrap').not(this).children().eq(0).removeClass('border-none'); 9 $('.accordion-wrap').not(this).find('.accordion-header').removeClass('color-blue'); 10 $('.accordion-wrap').not(this).find('.tap').removeClass('rotate'); 11});
s.k👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/03/13 22:57

jQuery UI を使わない理由があるのでしょうか?
okuzono311

2020/03/14 01:37

jQuery UI、恥ずかしながらその存在自体初めて知りました。教えて下さりありがとうございます。
okuzono311

2020/03/14 01:39

ただjQueryを学ぶために、できればUIを利用しない方法も知りたいです。 よろしければその際のご回答もお願いします。
guest

回答1

0

ベストアンサー

直接的な問題解決ではないですが、トリガーを1つ (以下の例だと.activeというクラス) に集約させると楽だと思います。

↓まずCSS側で「アクティブ時の見た目」と「非アクティブ時の見た目」を作り、

CSS

1.accordion-wrap { 2 /* 非アクティブ時の見た目 */ 3} 4.accordion-wrap.active { 5 /* アクティブ時の見た目 */ 6}

↓そのあとJavaScript側で、クリックした.accordion-wrapにだけ.activeクラスを付与するという処理を加えます。

jQuery

1$('.accordion-wrap').click(function() { 2 if ($(this).hasClass('active')) { 3 $(this).removeClass('active'); 4 } 5 else { 6 // いったんすべての.accordion-wrapからアクティブ時のクラスを削除 7 $('.accordion-wrap').removeClass('active'); 8    9 // クリックした.accordion-wrapにのみアクティブ時のクラスを追加 10 $(this).addClass('active'); 11 } 12});

こうすることで、JavaScript側、CSS側それぞれで考えることが少なくなり、表示がうまくいかないときの原因特定が楽になると思います。

また、現状デザイン変更時にJavaScriptにも手を加える必要がありますが、トリガーを1つに集約させることでCSSだけを修正すればよくなるので、その際も楽です。

投稿2020/03/14 00:31

編集2020/03/14 01:02
new1ro

総合スコア4528

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

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

okuzono311

2020/03/14 02:13

この方法ですぐに解決できました。 ・トリガーを1つに集約する方法があること ・activeクラスの使い方 を学べました。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問