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

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

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

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

レスポンシブWebデザイン

レスポンシブWebデザイン(RWD)は、スクリーンのサイズ、プラットフォーム、オリエンテーションに基づいて様々なデバイスで最適のサイトを生成するのウェブデザインとその開発のアプローチ方法を呼びます。

jQuery

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

CSS

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

Q&A

0回答

1088閲覧

【jQuery】matchMediaで画面幅を判定してアコーディオンの有無を切り替えたい

ync_pp

総合スコア11

JavaScript

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

レスポンシブWebデザイン

レスポンシブWebデザイン(RWD)は、スクリーンのサイズ、プラットフォーム、オリエンテーションに基づいて様々なデバイスで最適のサイトを生成するのウェブデザインとその開発のアプローチ方法を呼びます。

jQuery

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

CSS

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

0グッド

0クリップ

投稿2020/10/20 08:13

編集2020/10/21 07:42

実現したいこと

フッターのサイトマップリストの項目が多いため、
PCでは全て表示し、SPではアコーディオンにして項目ごとに開閉させたいです。

現在480px以下で次のようになります。
0. pクリックでulにクラスsp-accordionを追加
0. p.sp-accordion + ulを一旦すべて非表示
0. クリックしたp.sp-accordion + ulslideToggleで表示
0. クリックしたp.sp-accordion + ul以外で開いている要素はslideUpで閉じる

しかし、再度リサイズしてブラウザ幅が480px以上になったときに、
クラスの付けはずしは処理されるのですが、slideToggleは実行されてしまいます。
$(this).next('.sp-accordion ul').slideToggle();にして
480px以上では .sp-accordion が存在しない状態でも開閉が実行されました。

また、そこから再度480px以下にブラウザ幅を縮めると、
slideToggleが「開いてすぐ閉まる」という動作になり、ulが表示されたままになりません。

リサイズに伴うクラスの付けはずしはなされているので、
slideToggleの書き方や書く位置が問題なのでしょうか。

jQueryを使わずCSSのみで開閉アニメーションも試したのですが、
動きがやや不自然だったのでjQueryを使って実現したいと考えています。

どうすれば望む内容を実現できるのか、お力をお貸しいただけますと幸いです。

html

1<div> 2 <p class="midashi">コンテンツ1</p> 3 <ul> 4 <li><a href="">ページ 1-1</a></li> 5 <li><a href="">ページ 1-2</a></li> 6 <li><a href="">ページ 1-3</a></li> 7 <li><a href="">ページ 1-4</a></li> 8 </ul> 9</div> 10<div> 11 <p class="midashi">コンテンツ2</p> 12 <ul> 13 <li><a href="">ページ 2-1</a></li> 14 <li><a href="">ページ 2-2</a></li> 15 <li><a href="">ページ 2-3</a></li> 16 <li><a href="">ページ 2-4</a></li> 17 </ul> 18</div>

jQuery

1$(function() { 2 var mql = window.matchMedia('(max-width: 480px)'); 3 4 function spSitemap(mql) { 5 if (mql.matches) { 6 $('.midashi').addClass('sp-accordion'); 7 $('.sp-accordion + ul').hide(); 8 $('.sp-accordion').on("click", function() { 9 $(this).next().slideToggle(300); 10 $('.sp-accordion').not($(this)).next().slideUp(300); 11 }) 12 } else { 13 $('.midashi').removeClass('sp-accordion'); 14 $('.midashi + ul').show(); 15 } 16 } 17 18 spSitemap(mql); // 初回実行 19 mql.addEventListener("change", spSitemap ,false); 20 21 // addEventListener 時と変わらず 22 // mql.addListener(spSitemap); 23 24 // SP → PC → SP でulが閉じない / クリックで閉 → 開となる 25 //window.onresize = spSitemap; 26});

===========================================

追記です。

別の方法でひとまず解決したため追記します。

しかし、元々の投稿内容についてのご意見も伺いたいので
まだ少し質問を閉じずにいたく思います。
問題点やヒントをご教示いただけるようでしたら、引き続きよろしくお願いいたします。

しかし、再度リサイズしてブラウザ幅が480px以上になったときに、
クラスの付けはずしは処理されるのですが、slideToggleは実行されてしまいます。
$(this).next('.sp-accordion ul').slideToggle();にして
480px以上では .sp-accordion が存在しない状態でも開閉が実行されました。

また、そこから再度480px以下にブラウザ幅を縮めると、
slideToggleが「開いてすぐ閉まる」という動作になり、ulが表示されたままになりません。


以下は質問したコードとは別の書き方による解決方法です。

使ったことがなかったのですが、CSSのpointer-eventsであっさり実現して拍子抜けしました。
スマホ実機での検証はまだ出来ていませんが、あっさりし過ぎたのでこれで良いのか不安です。
問題ある書き方でしたらこちらもご指摘いただけると幸いです。

元の質問ではCSSで動作に関わる記述はしていませんでしたが、
この方法ではCSSにもアコーディオンに関わる内容を記述しています。

jQuery

1// 解決したコード 2$(function(){ 3 var mql = window.matchMedia('(max-width: 480px)'); 4 5 $('.midashi').click(function() { 6 $(this).toggleClass('selected'); 7 $(this).next().slideToggle(300); 8 $('.midashi').not($(this)).next().slideUp(300); 9 }); 10 function spSitemap(mql) { 11 if (!mql.matches) { 12 $('.midashi + ul').attr('style','inline-block'); 13 } 14 } 15 spSitemap(mql); 16 mql.addEventListener("change", spSitemap ,false); 17});

css

1// 解決したコード 2#footer .midashi { 3 pointer-events: none; 4} 5#footer .midashi + ul { 6 display: inline-block; 7} 8@media screen and (max-width: 480px) { 9 #footer .midashi { 10 pointer-events: all; 11 } 12 #footer .midashi + ul { 13 display: none; 14 } 15}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問