実現したいこと
フッターのサイトマップリストの項目が多いため、
PCでは全て表示し、SPではアコーディオンにして項目ごとに開閉させたいです。
現在480px以下で次のようになります。
0. p
クリックでul
にクラスsp-accordion
を追加
0. p.sp-accordion + ul
を一旦すべて非表示
0. クリックしたp.sp-accordion + ul
をslideToggle
で表示
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}
あなたの回答
tips
プレビュー