解決したいこと
スクリプト自体は動くのですがここからもっとシンプルに簡潔に書きたいのですがどのように書けばもっと簡素化できるでしょうか?
また簡素化できるポイントを見つけるコツなどはありますでしょうか?
宜しくおねがいします。
html
1<div class="btn_list list01"> 2<p class="btn">ボタンA</p> 3<dl> 4<dt>コンテンツ</dt> 5<dd>コンテンツテキスト</dd> 6</dl> 7</div> 8<!-- btn_list --> 9 10<div class="btn_list list02"> 11<p class="btn">ボタンB</p> 12<dl> 13<dt>コンテンツ</dt> 14<dd>コンテンツテキスト</dd> 15<dd>コンテンツテキスト</dd> 16<dd>コンテンツテキスト</dd> 17</dl> 18</div> 19<!-- btn_list --> 20 21<div id="wrap"> 22<div class="option_wrap"> 23<select> 24<optgroup label=""> 25<option value="a">AAA</option> 26<option value="b">BBB</option> 27<option value="c">CCC</option> 28</optgroup> 29</select> 30</div> 31 32<div class="option_wrap"> 33<select> 34<optgroup label=""> 35<option value="a">AAA</option> 36<option value="b">BBB</option> 37<option value="c">CCC</option> 38</optgroup> 39</select> 40</div> 41 42<div class="option_wrap"> 43<select> 44<optgroup label=""> 45<option value="a">AAA</option> 46<option value="b">BBB</option> 47<option value="c">CCC</option> 48</optgroup> 49</select> 50</div> 51</div>
css
1 2body{ 3 padding-top:3vw; 4} 5.btn{ 6 padding:15px; 7 text-align:center; 8 color:#000; 9 background: #ccc; 10 border:1px solid #000; 11 margin:0; 12} 13.btn_list dl{ 14 display: none; 15 margin:0; 16} 17#wrap .option_wrap{ 18 position: absolute; 19 width: 100%; 20 left:50%; 21 margin-left: -50%; 22} 23#wrap .option_wrap option{ 24 width: 100%; 25} 26#wrap .option_wrap:nth-of-type(1){ 27 top:0; 28} 29#wrap .option_wrap:nth-of-type(2){ 30 top:20vw; 31} 32#wrap .option_wrap:nth-of-type(3){ 33 top:30vw; 34}
javascript
1<script> 2 3jQuery(function($){ 4 const w = $(window).width(); 5 const bh01 = parseInt($(".list01 dl").innerHeight()); 6 const bh02 = parseInt($(".list02 dl").innerHeight()); 7 const vw01 = (bh01 / w)*100; 8 const vw02 = (bh02 / w)*100; 9 10 const oh01 = parseInt($("#wrap .option_wrap:nth-of-type(2)").css('top')); 11 const oh02 = parseInt($("#wrap .option_wrap:nth-of-type(3)").css('top')); 12 13 const ov01 = (oh01 / w)*100; 14 const ov02 = (oh02 / w)*100; 15 16 const f01 = vw01 + ov01; 17 const f02 = vw01 + ov02; 18 const s01 = vw02 + ov01; 19 const s02 = vw02 + ov02; 20 21 $('.list01 dl').css('display','none'); 22 $('.list02 dl').css('display','none'); 23 $(".list01 p.btn").on("click", function(){ 24 if ($(this).hasClass('active01')) { 25// 開いている状態 26 $('.list02 dl').slideUp(); 27 $('.list02 p').removeClass('active02'); 28 $(this).removeClass('active01').next().slideToggle(); 29 $('#wrap .option_wrap:nth-of-type(2)').animate({'top': ov01 + 'vw'}); 30 $('#wrap .option_wrap:nth-of-type(3)').animate({'top': ov02 + 'vw'}); 31 } else{ 32// 閉じている状態 33 $('.btn_list.list02 dl').slideUp(); 34 $('.list02 p').removeClass('active02'); 35 $(this).addClass('active01').next().slideToggle(); 36 $('#wrap .option_wrap:nth-of-type(2)').animate({'top': f01 + 'vw'}); 37 $('#wrap .option_wrap:nth-of-type(3)').animate({'top': f02 + 'vw'}); 38 } 39 }); 40 41 $(".list02 .btn").on("click", function(){ 42 if ($(this).hasClass('active02')) { 43// 開いている状態 44 $('.btn_list.list01 dl').slideUp(); 45 $('.list01 p').removeClass('active01'); 46 $(this).removeClass('active02').next().slideToggle(); 47 $('#wrap .option_wrap:nth-of-type(3)').animate({'top': ov02 + 'vw'}); 48 $('#wrap .option_wrap:nth-of-type(2)').animate({'top': ov01 + 'vw'}); 49 } else{ 50// 閉じている状態 51 $('.btn_list.list01 dl').slideUp(); 52 $('.list01 p').removeClass('active01'); 53 $(this).addClass('active02').next().slideToggle(); 54 $('#wrap .option_wrap:nth-of-type(3)').animate({'top': s02 + 'vw'}); 55 $('#wrap .option_wrap:nth-of-type(2)').animate({'top': s01 + 'vw'}); 56 } 57 }); 58}); 59</script>
HTMLに $("p.tit_pat01") に該当する要素が見つかりませんでした。
ご提示のHTMLに不足があるのかもしれません。
HTML も上げてください
「早く処理」とは具体的にはどれぐらいの速さでしょうか。
当方の環境では、それほど気にならない早さで動作しましたが、 kakeru99さんの環境ではかなり待たされる感じですか?
Lhankor_Mhyさん
>>すみません、言葉に語弊がありました。
処理の速さではなく簡潔に書きたいということです。
.option_wrap を絶対配置するのは、必須条件ですか?
必須条件です。一応レスポンシブでtopの高さが変わらないように計算しています。
絶対配置なんですか? 提示コードでさえ上にかぶってきていて不安になりますが
フローで配置した方が無難なように思いますが……
その辺については考慮しない、ということで回答しますね。