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

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

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

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

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

JavaScript

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

jQuery

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

Q&A

解決済

3回答

1635閲覧

JS アコーディングメニュー 開閉時のアイコン切り替え

crigw

総合スコア24

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

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

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2020/01/27 01:34

編集2020/01/27 02:20

前提

以下のJSでアコーディオンメニューを作成しています。また、現在地を取得してクラス名を付与しており、これによりページ読み込み時にクラス名is-mainNavKids--currentがついた場合には最初から子メニュー開いていたいためCSSで先述のクラス名にdisplay: block;を指定しています。さらに、CSSでアコーディオン閉じる時にはアイコンをに、開いた時にに設定しています。

実現したいこと

初期状態でアコーディオンが開いていると、開いてる状態でアイコンが、閉じた時にになってしまうので、初期状態で開いているアコーディオンにis-toggle-accNav--openを付与しを表示させ、閉じた時に付与を取り消し+にしたい。

クラス名の付与以外をCSSだけで完結できるのであれば、そちらの方が好ましいです。(IE11対応必須)

該当のソースコード

js

1//Nav 2$(function(){ 3 $('.is-toggle-accNav').each(function(){ 4 $(this).on('click',function(){ 5 $(this).toggleClass('is-toggle-accNav--open'); 6 $("+.mainNavKids",this).slideToggle() 7 return false; 8 }); 9 }); 10}); 11 12//current 13$(function(){ 14 $('.mainNav__item__link').each(function(){ 15 var $href = $(this).attr('href'); 16 if(location.href.match($href)) { 17 $(this).parent('.mainNavKids__item').addClass('current'); 18 $(this).parents('.mainNav__item').addClass('current'); 19 $(this).parents('.mainNavKids').addClass('is-mainNavKids--current'); 20 } else { 21 $(this).parent().removeClass('current'); 22 } 23 }); 24});

css

1.is-toggle-accNav:after { 2 background: #33105f; 3 content: '\f067'; 4 display: block; 5 font-family: 'Font Awesome 5 Free'; 6 font-weight: 900; 7 line-height: 60px; 8 position: absolute; 9 right: 0; 10 text-align: center; 11 top: 0; 12 width: 60px; 13} 14.is-toggle-accNav.is-toggle-accNav--open:after { 15 content: '\f068'; 16} 17.is-mainNavKids--current { 18 display: block; 19}

html

1<nav class="collapsibleNav"> 2 <button type="button" class="is-collapsibleNav-openBtn"></button> 3 <ul class="mainNav"> 4 <li class="mainNav__item"> 5 <a href="#" class="mainNav__item__link is-toggle-accNav">親メニュー1(クリックで開く)</a> 6 <ul class="mainNavKids is-mainNavKids--current"> 7 <li class="mainNavKids__item"><a href="./index.html" class="mainNav__item__link">サブメニュー1</a></li> 8 <li class="mainNavKids__item"><a href="#" class="mainNav__item__link">サブメニュー1</a></li> 9 <li class="mainNavKids__item"><a href="#" class="mainNav__item__link">サブメニュー1</a></li> 10 </ul> 11 </li> 12〜略〜

問題のスクショ

以下、メニュー1にis-mainNavKids--currentが付与されている状態。メニュー2のアイコン表示が正しい状態。
イメージ説明
イメージ説明

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

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

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

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

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

kyoya0819

2020/01/27 02:00 編集

大幅に書き直しても大丈夫でしょうか?
crigw

2020/01/27 02:05 編集

現状の求めている動きを維持できてかつ複雑でなければ、大幅に書き直していただいても問題ありません。 また、こちらのJSとも喧嘩しなければ大丈夫です。 //collapsibleNav $(function(){ document.querySelector('.is-collapsibleNav-openBtn').addEventListener('click', function(event) { document.querySelector('.collapsibleNav').classList.toggle('is-collapsibleNav-closed'); }, false); });
miyabi_takatsuk

2020/01/27 02:13 編集

jQueryのバージョンはなんでしょうか? 最新のバージョンだと、slideToggleが廃止されている可能性があります。 (私が検証した限りでは、3.4.1〜では、slideToggleメソッドがありませんでした。)
crigw

2020/01/27 02:16

え、そうなんですか? 該当の3.4.1を読み込んでいるようです…動きはするのと廃止しているのとはまた別なのですね…
miyabi_takatsuk

2020/01/27 02:18 編集

なるほど・・・。 つまり、slideToggleの動作はしているということでしょうか? こちらも再度検証します。
miyabi_takatsuk

2020/01/27 02:19

asuchi0819さん、ありがとうございます。 こちらの検証不足ですね。 失礼しました。 再度検証していきます。
miyabi_takatsuk

2020/01/27 02:21

crigwさん > 大変失礼しました。 slimバージョンを読み込んでいるのが原因でした。 どうやら、メソッドもかなり削減されてしまうようですね。 こちらも勉強になりました。
crigw

2020/01/27 06:56

asuchi0819さん、miyabi_takatsukさん SlideToggleについて、いろいろご確認や検証いただきありがとうございました。
guest

回答3

0

あきらかな間違いは下記ですね。

(this).toggleClass('.is-toggle-accNav--open');

ドット(.)が余分です。

(this).toggleClass('is-toggle-accNav--open');

とりあえず上記を修正して希望の動作になるか確認してみてください。

追記

あと、初期状態で、カレントなら開いた状態、それ以外は閉じた状態にしておきたいのなら、CSSで設定しておきましょう。

css

1.mainNavKids { 2 display: none; 3} 4.is-mainNavKids--current { 5 display: block; 6}

サンプルを作成したのでリンク置いておきます。

カレント開閉の処理で、カレントの時の処理で、親メニュー要素に is-toggle-accNav--openクラスを付与するコードが必要に思います。

DOMツリー構造をみて、辿っていけばいいでしょう。

子メニューがカレントの場合は、祖先の.mainNavKids の一つ前の要素にis-toggle-accNav--openクラスを付与すればいいので、下記のような感じで。

$(this).parents('.mainNavKids').prev().addClass('is-toggle-accNav--open');

親メニューがカレントの場合は、別途コードが必要になりますが、それはご自分で考えてみてください。

js

1//Nav 2$(function(){ 3 $('.is-toggle-accNav').each(function(){ 4 $(this).on('click',function(){ 5 $(this).toggleClass('is-toggle-accNav--open'); 6 $("+.mainNavKids",this).slideToggle() 7 return false; 8 }); 9 }); 10}); 11 12//current 13$(function(){ 14 $('.mainNav__item__link').each(function(){ 15 var $href = $(this).attr('href'); 16 if($href === 'https://teratail.com') { 17 $(this).parent('.mainNavKids__item').addClass('current'); 18 $(this).parents('.mainNav__item').addClass('current'); 19 $(this).parents('.mainNavKids').addClass('is-mainNavKids--current'); 20 $(this).parents('.mainNavKids').prev().addClass('is-toggle-accNav--open'); 21 } else { 22 $(this).parent().removeClass('current'); 23 } 24 }); 25});

動作確認用サンプル

投稿2020/01/27 02:28

編集2020/01/27 10:46
hatena19

総合スコア33715

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

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

crigw

2020/01/27 06:54

ご指摘いただきました内容はすでに修正済みとなっております。 また今回の質問は`開閉時のアイコン切り替えについて`でして、カレント開閉の動作はすでに対応済みです…ですがご配慮頂きありがとうございました。
hatena19

2020/01/27 08:16

カレント開閉の処理で、カレントの時の処理で、親メニュー要素に is-toggle-accNav--openクラスを付与するコードが必要に思います。
crigw

2020/01/27 08:24

その記述方がわからずにいるためにこちらの質問を建てた次第です。
hatena19

2020/01/27 09:46

DOMツリー構造をみて、辿っていけばいいでしょう。 子メニューがカレントの場合は、祖先の.mainNavKids の一つ前で、下記のような感じで。 $(this).parents('.mainNavKids').prev().addClass('is-toggle-accNav--open'); 他にも辿り方はありますので一例です。
guest

0

メニューの表示条件は@crigwさんの判定したいものに読み替えてください。
面倒なのでindexを判定していますので、無視してください。

親メニューのチェックと子メニューのチェックを分離すれば、'is-toggle-accNav--open'を付けるDOMツリー見えてくると思います。

javascript

1$(function(){ 2 $('.is-toggle-accNav').each(function(){ 3 $(this).on('click',function(){ 4 $(this).toggleClass('is-toggle-accNav--open'); 5 $("+.mainNavKids",this).slideToggle() 6 return false; 7 }); 8 }); 9 // 親メニューの条件判定 10 $('.mainNav__item__link'+'.is-toggle-accNav').each(function(index) { 11 $("+.mainNavKids",this).hide(); // 一旦子メニューはすべて閉じる 12 if (index == 2) {//<=ここの条件式はお好きなように 13 // 初期表示open 14 $("+.mainNavKids",this).show(); 15 $(this).addClass('is-toggle-accNav--open'); 16 } 17 }); 18 // 親メニューがすべて閉じていた場合は、子メニューのチェックをする 19 if ($('.mainNav__item__link'+'.is-toggle-accNav'+'.is-toggle-accNav--open').length < 1) { 20 $('ul.mainNavKids .mainNav__item__link').each(function(index) { 21 if (index == 0) {//<=ここの条件式はお好きなように 22 // 初期表示open 23 $(this).parents('li.mainNav__item').find('ul.mainNavKids').show(); 24 $(this).parents('li.mainNav__item').find('a.mainNav__item__link'+'is-toggle-accNav') 25 .addClass('is-toggle-accNav--open'); 26 } 27 }); 28 } 29});

投稿2020/01/27 10:22

storm3

総合スコア330

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

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

0

自己解決

結果的に以下1行の追加で希望していた動きになりました。
お二人ともありがとうございました。

//current $(function(){ $('a.mainNav__item__link, a.mainNavKids__item__link').each(function(){ var $href = $(this).attr('href'); if(location.href.match($href)) { $(this).addClass('current'); $(this).parents('.mainNav__item').addClass('current'); $(this).parents('.mainNavKids').addClass('current'); $(this).parents('.mainNavKids').prev().addClass('is-toggle-accNav--open'); //この行の追加 } else { $(this).parent().removeClass('current'); } }); });

投稿2020/02/03 02:09

crigw

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問