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

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

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

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

Q&A

1回答

245閲覧

スクリプトを簡潔に書きたい

kakeru99

総合スコア17

JavaScript

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

0グッド

1クリップ

投稿2019/04/16 04:30

編集2019/05/09 05:19

解決したいこと

スクリプト自体は動くのですがここからもっとシンプルに簡潔に書きたいのですがどのように書けばもっと簡素化できるでしょうか?
また簡素化できるポイントを見つけるコツなどはありますでしょうか?

宜しくおねがいします。

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>

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

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

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

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

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

Lhankor_Mhy

2019/04/16 11:31

HTMLに $("p.tit_pat01") に該当する要素が見つかりませんでした。 ご提示のHTMLに不足があるのかもしれません。
x_x

2019/04/26 09:20

HTML も上げてください
Lhankor_Mhy

2019/05/09 04:41

「早く処理」とは具体的にはどれぐらいの速さでしょうか。 当方の環境では、それほど気にならない早さで動作しましたが、 kakeru99さんの環境ではかなり待たされる感じですか?
kakeru99

2019/05/09 05:18

Lhankor_Mhyさん >>すみません、言葉に語弊がありました。 処理の速さではなく簡潔に書きたいということです。
Lhankor_Mhy

2019/05/09 05:20

.option_wrap を絶対配置するのは、必須条件ですか?
kakeru99

2019/05/09 06:34

必須条件です。一応レスポンシブでtopの高さが変わらないように計算しています。
x_x

2019/05/09 06:38

絶対配置なんですか? 提示コードでさえ上にかぶってきていて不安になりますが
Lhankor_Mhy

2019/05/09 08:29

フローで配置した方が無難なように思いますが…… その辺については考慮しない、ということで回答しますね。
guest

回答1

0

元のコードをなるべく生かすとこんな感じかと。

js

1 const w = $(window).width(); 2 3 const oh01 = parseInt($("#wrap .option_wrap:nth-of-type(2)").css('top')); 4 const oh02 = parseInt($("#wrap .option_wrap:nth-of-type(3)").css('top')); 5 6 const ov01 = (oh01 / w)*100; 7 const ov02 = (oh02 / w)*100; 8 9 $('.btn_list').each(function(i,target){ 10 const bh = parseInt($("dl", target).innerHeight()); 11 const vw = (bh / w)*100; 12 13 14 const f01 = vw + ov01; 15 const f02 = vw + ov02; 16 17 $('dl', target).css('display','none'); 18 $("p.btn", target).on("click", function(){ 19 let targetList = $(this).parent(); 20 if ($(this).hasClass('active')) { 21 // 開いている状態 22 $('.btn_list dl').not( $('dl', targetList) ).slideUp(); 23 $('.btn_list p').not( $('p', targetList) ).removeClass('active'); 24 $(this).removeClass('active').next().slideToggle(); 25 $('#wrap .option_wrap:nth-of-type(2)').animate({'top': ov01 + 'vw'}); 26 $('#wrap .option_wrap:nth-of-type(3)').animate({'top': ov02 + 'vw'}); 27 } else{ 28 // 閉じている状態 29 $('.btn_list dl').not( $('dl', targetList) ).slideUp(); 30 $('.btn_list p').not( $('p', targetList) ).removeClass('active'); 31 $(this).addClass('active').next().slideToggle(); 32 $('#wrap .option_wrap:nth-of-type(2)').animate({'top': f01 + 'vw'}); 33 $('#wrap .option_wrap:nth-of-type(3)').animate({'top': f02 + 'vw'}); 34 } 35 }); 36 37 });

『簡素化できるポイントを見つけるコツ』は「慣れ」でしょうか。配列や、配列にできそうなもの(ここで言うと$('.btn_list'))に着目するといいと思います。

投稿2019/05/09 09:06

Lhankor_Mhy

総合スコア36076

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問