#やりたいこと
タイトルのとおりです。
レスポンシブサイトにおいて、639px以下のSPレイアウト時のみ、
通常のコンテンツをアコーディオン開閉式UIに変更するようにしたい。
#現状のソースコード
HTML
1<div class="js-accordion"> 2 <div class="js-acrTitle sp">【アコーディオンタイトル:ボタン機能】</div> 3 <div class="js-acrBody"> 4 【アコーディオンの中身】 5 </div><!-- /.js-acrBody --> 6</div><!-- /.js-accordion -->
CSS
1.sp {display:none;} 2@media screen and (max-width: 639px){ 3 .sp {display:block;} 4 .js-acrBody {display:none;} 5}
JavaScript
1$(function(){ 2 accrdion(); 3}); 4 5function accordion() { 6 var accordionOffset = []; 7 var $accordion = $(".js-accordion"); 8 9 10 var Accordion = { 11 getaccordionOffset: function () { 12 $accordion.each(function (i) { 13 accordionOffset[i] = $(this).offset().top; 14 }); 15 }, 16 hdlClick: function (Selector) { 17 var num = $(".js-acrTitle").index(Selector); 18 $("body,html").stop().animate({"scrollTop": accordionOffset[num] - 50}, 400, function () { 19 Accordion.getaccordionOffset(); 20 }); 21 if (Selector.hasClass("op")) { 22 Selector.removeClass("op"); 23 Selector.next().stop().slideUp(400, function () { 24 Accordion.getaccordionOffset(); 25 }); 26 } else { 27 Selector.next().stop().slideDown(400, function () { 28 Accordion.getaccordionOffset(); 29 }); 30 Selector.addClass("op"); 31 } 32 } 33 } 34 35 Accordion.getaccordionOffset(); 36 $(".js-acrTitle") 37 .on("click",function () { 38 Accordion.hdlClick($(this)); 39 }); 40}
#問題となっているところ
アコーディオンを開閉するタイトル部.js-acrTitle
は、もともとPCレイアウト時は不要で、
SPレイアウト時だけ表示すればよかったので、最初は上記コードでうまく行っていました。
(PCレイアウト時にはそもそもトリガーとなる要素が無いので機能しない)
ところが、別のページでPCレイアウト時には開閉トリガー機能の無い見出しとして.js-acrTitle
を表示し、
639px以下になったところでアコーディオンになるようにする、という変則バージョンのモジュールが出てきてしまいました。
上記スクリプトでは.js-acrTitle
をクリックしたら開閉してしまうので、なんとかしてアコーディオン機能を639px以下の時だけに限定しようとしてif文を書いてみたりもしたのですが、うまくいきませんでした。
#実現したい仕様
1.PCレイアウト時にはただのコンテンツ
2.SPレイアウト時(639px以下)の時はアコーディオン機能
3.PCブラウザでブレイクポイントをまたぐ形で画面幅を変更した際にもアコーディオン機能の実行/停止が正しく判定されるようにする
4.SPでアコーディオン操作で.js-acrBody
を閉じた状態でPCレイアウトに変更した際も、表示状態を全てリセットして元に戻す
5.リサイズ時の判定・実行は、リサイズイベントが完了した時に1度だけ行われるように処理する(iPhoneのスクロール対策)
うまくいかなくて消してしまったので実際のコードを掲載できないのですが、上記仕様の内、1,2,4,5は実現できていました。
ただ、3の時にPC(アコーディオン無し)→SP(アコーディオン実行)は実現できましたが、一旦SPでアコーディオン機能を実行した後、ふたたびPCレイアウトに戻った時にアコーディオン機能を停止することがどうしてもできませんでした。
#教えてほしいこと
基本的にクリックしたタイミングとか、リサイズしたタイミングで画面幅$(window).width()
を取得して、if文で条件分岐、ということをやっていたのですが、やりたい機能全体を通した場合のロジックがうまく作れないので、
どのタイミングで何を取得し、どう判定して何を実行したら良いのか というロジック部分を中心にご教授いただけますと大変助かります。
また、もし画面幅の取得で分岐する以外のもっとスマートな実装方法があるのだとしたら、知りたいです。
(※PC用の見出しとSP用の見出しを重複記述して表示/非表示切り替える手法はNGです)
長々と申し訳ありませんが、どなたかアドバイスいただけますと助かります。
よろしくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/07 16:34
2016/08/07 16:43
2016/08/07 16:48
2016/08/09 11:32