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

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

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

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

Q&A

解決済

1回答

1463閲覧

『もっと見る』クリックで、n件の要素を表示させる機能を複数設置したい

takatouaya

総合スコア10

JavaScript

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

0グッド

0クリップ

投稿2023/06/16 13:06

編集2023/06/16 13:17

実現したいこと

  • 『もっと見る』クリックで、n件の要素を表示させる機能を同じページ内に複数設置したい

前提

jQueryを使用せず、Vanilla JSで実装したいと考えています。

発生している問題・エラーメッセージ

『もっと見る』のブロックが一つの時は動作するのですが、 2つ以上になると正しく動作させることができていません。

該当のソースコード

JavaScript

1var firstView = 10; 2var addItems = 10; 3var hidden = 'is-hidden'; 4var count = document.querySelectorAll('.item__box'); 5var target = ('.item__box--item'); 6var targets = document.querySelectorAll(target); 7var moreView = document.querySelectorAll('.item__box--more'); 8 9if (moreView) { 10 document.addEventListener('DOMContentLoaded', () => { 11 var targets_length = moreView.previousElementSibling.children.length; 12 if (targets_length > firstView) { 13 for (var i = firstView; i < targets_length; i++) { 14 targets[i].classList.add(hidden); 15 } 16 } 17 else { 18 moreView.style.display = 'none'; 19 } 20 }); 21 22 moreView.addEventListener('click', () => { 23 var hiddens = document.querySelectorAll(target + "." + hidden); 24 if (hiddens.length < addItems) { 25 addItems = hiddens.length; 26 } 27 for (var i = 0; i < addItems; i++) { 28 hiddens[i].classList.remove(hidden); 29 } 30 if (document.querySelectorAll(target + "." + hidden).length === 0) { 31 moreView.style.display = 'none'; 32 } 33 }); 34} 35

HTML

1<div class="item__box"> 2 <p class="item__box--title">List01</p> 3 <ul class="item__box--list"> 4 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs01.jpg" alt=""></a></li> 5 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs02.jpg" alt=""></a></li> 6 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs03.jpg" alt=""></a></li> 7 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs04.jpg" alt=""></a></li> 8 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs05.jpg" alt=""></a></li> 9 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs06.jpg" alt=""></a></li> 10 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs07.jpg" alt=""></a></li> 11 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs08.jpg" alt=""></a></li> 12 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs09.jpg" alt=""></a></li> 13 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs10.jpg" alt=""></a></li> 14 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs11.jpg" alt=""></a></li> 15 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs12.jpg" alt=""></a></li> 16 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs13.jpg" alt=""></a></li> 17 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs14.jpg" alt=""></a></li> 18 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs15.jpg" alt=""></a></li> 19 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs16.jpg" alt=""></a></li> 20 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs17.jpg" alt=""></a></li> 21 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs18.jpg" alt=""></a></li> 22 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs19.jpg" alt=""></a></li> 23 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs20.jpg" alt=""></a></li> 24 </ul> 25 <span class="item__box--more">View More</span> 26</div> 27 28<div class="item__box"> 29 <p class="item__box--title">List02</p> 30 <ul class="item__box--list"> 31 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs01.jpg" alt=""></a></li> 32 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs02.jpg" alt=""></a></li> 33 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs03.jpg" alt=""></a></li> 34 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs04.jpg" alt=""></a></li> 35 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs05.jpg" alt=""></a></li> 36 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs06.jpg" alt=""></a></li> 37 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs07.jpg" alt=""></a></li> 38 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs08.jpg" alt=""></a></li> 39 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs09.jpg" alt=""></a></li> 40 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs10.jpg" alt=""></a></li> 41 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs11.jpg" alt=""></a></li> 42 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs12.jpg" alt=""></a></li> 43 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs13.jpg" alt=""></a></li> 44 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs14.jpg" alt=""></a></li> 45 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs15.jpg" alt=""></a></li> 46 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs16.jpg" alt=""></a></li> 47 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs17.jpg" alt=""></a></li> 48 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs18.jpg" alt=""></a></li> 49 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs19.jpg" alt=""></a></li> 50 <li class="item__box--item"><a href="#"><img src="/assets/img/img-thumbs20.jpg" alt=""></a></li> 51 </ul> 52 <span class="item__box--more">View More</span> 53</div>

試したこと

まずは『もっと見る』のボックスがひとつの時のものを作り、
2つに増やしたところ、同じ親要素に『.item__box』を持つ『.item__box--item』ではなく、
同じページ内にある『.item__box--item』全てに対して影響を与えてしまったので、
『.item__box--more』に隣接している『.item__box--list』内の
『.item__box--item』を数えるように変更しました。

この状態だと『List01』の方は意図した挙動になったのですが、
『List02』の方が動作しないので、
『.item__box』ごとに処理をループさせたいと考えたのですが、
うまくループさせる方法がわからずに、ソースコードの状態になっています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こうしてみると、どうでしょう?

javascript

1document.addEventListener('DOMContentLoaded', () => { 2 3 const firstView = 10; 4 5 document.querySelectorAll('.item__box').forEach(box => { 6 7 const items = box.querySelectorAll('.item__box--item'); 8 const moreView = box.querySelector('.item__box--more'); 9 10 if (items.length <= firstView) { 11 moreView.classList.add('is-hidden'); 12 return; 13 } 14 15 [...items].slice(firstView).forEach(item => { 16 item.classList.add('is-hidden'); 17 }); 18 19 moreView.addEventListener('click', () => { 20 const hiddenItems = box.querySelectorAll('.item__box--item.is-hidden'); 21 if (hiddenItems.length > 0) { 22 hiddenItems.forEach(item => { 23 item.classList.remove('is-hidden'); 24 }); 25 moreView.textContent = 'View Less'; 26 } else { 27 [...items].slice(firstView).forEach(item => { 28 item.classList.add('is-hidden'); 29 }); 30 moreView.textContent = 'View More'; 31 } 32 }); 33 }); 34});

追記

コメントから

可能であれば、最初にis-hiddenで非表示になったitemを、 任意の数ずつ表示させるようにしたいと考えていました。

とのことでしたので、

任意の数ずつ表示

できるように修正し、あわせて、いくつかまとまった処理を関数化したものを以下に挙げておきますので、使えそうな部分があれば参考にしてください。

HTML への追加

閉じるための <span> を以下のように View More の後に追加します。初期状態は非表示なのでis-hiddenをCSSクラスに入れておきます。

diff

1 </ul> 2 <span class="item__box--more">View More</span> 3+ <span class="item__box--close is-hidden">Close</span> 4</div>

javascript 修正案

  • 初期表示での件数、View Moreをクリックするごとに追加表示する件数の定数名を FIRST_VIEWADD_ITEMS にしました。
  • HTML要素の配列を引数にとり、これらの表示、非表示を設定する処理を関数 showhide にしました。
  • .item__box に対する設定を関数 itemBoxSetting にしました。

javascript

1const FIRST_VIEW = 5; 2const ADD_ITEMS = 3; 3 4const hide = (elements) => { 5 elements.forEach(elm => { 6 elm.classList.add('is-hidden'); 7 }); 8}; 9 10const show = (elements) => { 11 elements.forEach(elm => { 12 elm.classList.remove('is-hidden'); 13 }); 14}; 15 16const itemBoxSetting = (box) => { 17 const items = box.querySelectorAll('.item__box--item'); 18 const moreView = box.querySelector('.item__box--more'); 19 const closeView = box.querySelector('.item__box--close'); 20 21 if (items.length <= FIRST_VIEW) { 22 hide([moreView]); 23 return; 24 } 25 26 hide([...items].slice(FIRST_VIEW)); 27 28 moreView.addEventListener('click', () => { 29 const hiddenItems = box.querySelectorAll('.item__box--item.is-hidden'); 30 if (hiddenItems.length > 0) { 31 show([...hiddenItems].slice(0, ADD_ITEMS)); 32 if (hiddenItems.length - ADD_ITEMS <= 0) { 33 hide([moreView]); 34 } 35 show([closeView]); 36 } 37 }); 38 39 closeView.addEventListener('click', () => { 40 hide([...items].slice(FIRST_VIEW)); 41 hide([closeView]); 42 show([moreView]); 43 }); 44} 45 46document.addEventListener('DOMContentLoaded', () => { 47 document.querySelectorAll('.item__box').forEach(itemBoxSetting); 48});

投稿2023/06/17 01:59

編集2023/06/17 22:15
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takatouaya

2023/06/17 18:34

ご回答いただきまして、ありがとうございます! 大変勉強になります。 可能であれば、最初にis-hiddenで非表示になったitemを、 任意の数ずつ表示させるようにしたいと考えていました。 例えば『.item__box--item』が30個あった場合、 最初は10件だけ表示しているのですが『View More』ボタンクリックで、 is-hiddenがついている要素を一気に表示させるのではなく、 10件ずつ表示させるといった形で… ご提示いただいた内容は、考えていた挙動に近いので、 もう少し考えてみたいと思います!
退会済みユーザー

退会済みユーザー

2023/06/17 22:18

コメントありがとうございます。 > もう少し考えてみたいと思います! とのことなので、回答に修正案を追記しました。 使えそうな部分があれば参考にしていただければと思います。
takatouaya

2023/06/19 02:28

修正案までいただきまして、ありがとうございます! 追加でいただいた内容も参考にさせていただき、 実装したいと考えていた挙動が実現できました。
退会済みユーザー

退会済みユーザー

2023/06/19 03:37

🎉👏
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問