実現したいこと
イメージとしては以下のサイトにある
https://wp-emanon.jp/emanon-premium/demo02/
お客様の声スライダーのようなものになります。
これをプロフィールスライダーとして使います。
各人物のアイコンや簡単なプロフィールの部分からそれぞれの詳細ページへリンクします。
これをhtml、css、jsで作りたいです。
人物は9人分です。
インジケーターは〇でスライドの下に9つ作ります。
インジケーターによる左右どちらにも行ける手動操作と、オートプレイによる左から右へ流れるスライドを両立させます。
スライドは画面の中途半端な位置に止まらないようにしたいです。
発生している問題・分からないこと
スライダーは3人分ずつスライドするようになっていますが、それだと動作が早すぎるので1人分ずつスライドするように修正したいです。
但し、画面の見た目は、一度に3人分表示で変更しません。
つまり、1/3づつスライドさせる構造にします。
該当のソースコード
html
1 <div class="testimonial-slider"> 2 <div class="testimonial-track"> 3 <div class="testimonial"> 4 <img src="path-to-image1.jpg" alt="Customer 1" class="testimonial-img"> 5 <p class="testimonial-comment">"Customer 1's comment..."</p> 6 </div> 7 <div class="testimonial"> 8 <img src="path-to-image2.jpg" alt="Customer 2" class="testimonial-img"> 9 <p class="testimonial-comment">"Customer 2's comment..."</p> 10 </div> 11 <div class="testimonial"> 12 <img src="path-to-image3.jpg" alt="Customer 3" class="testimonial-img"> 13 <p class="testimonial-comment">"Customer 3's comment..."</p> 14 </div> 15 <div class="testimonial"> 16 <img src="path-to-image4.jpg" alt="Customer 4" class="testimonial-img"> 17 <p class="testimonial-comment">"Customer 4's comment..."</p> 18 </div> 19 <div class="testimonial"> 20 <img src="path-to-image5.jpg" alt="Customer 5" class="testimonial-img"> 21 <p class="testimonial-comment">"Customer 5's comment..."</p> 22 </div> 23 <div class="testimonial"> 24 <img src="path-to-image6.jpg" alt="Customer 6" class="testimonial-img"> 25 <p class="testimonial-comment">"Customer 6's comment..."</p> 26 </div> 27 <div class="testimonial"> 28 <img src="path-to-image7.jpg" alt="Customer 7" class="testimonial-img"> 29 <p class="testimonial-comment">"Customer 7's comment..."</p> 30 </div> 31 <div class="testimonial"> 32 <img src="path-to-image8.jpg" alt="Customer 8" class="testimonial-img"> 33 <p class="testimonial-comment">"Customer 8's comment..."</p> 34 </div> 35 <div class="testimonial"> 36 <img src="path-to-image9.jpg" alt="Customer 9" class="testimonial-img"> 37 <p class="testimonial-comment">"Customer 9's comment..."</p> 38 </div> 39 </div> 40 <div class="testimonial-indicators"> 41 <!-- 9つのインジケーターを追加 --> 42 <span class="indicator" onclick="goToSlide(0)"></span> 43 <span class="indicator" onclick="goToSlide(1)"></span> 44 <span class="indicator" onclick="goToSlide(2)"></span> 45 <span class="indicator" onclick="goToSlide(3)"></span> 46 <span class="indicator" onclick="goToSlide(4)"></span> 47 <span class="indicator" onclick="goToSlide(5)"></span> 48 <span class="indicator" onclick="goToSlide(6)"></span> 49 <span class="indicator" onclick="goToSlide(7)"></span> 50 <span class="indicator" onclick="goToSlide(8)"></span> 51 </div> 52 </div>
css
1 .testimonial-slider { 2 position: relative; 3 width: 100%; 4 overflow: hidden; 5 } 6 7 .testimonial-track { 8 display: flex; 9 transition: transform 0.5s ease; 10 } 11 12 .testimonial { 13 flex: 0 0 33.3%; 14 text-align: center; 15 } 16 17 .testimonial-img { 18 width: 80px; 19 height: 80px; 20 border-radius: 50%; 21 margin-bottom: 10px; 22 } 23 24 .testimonial-comment { 25 font-size: 1rem; 26 color: #333; 27 max-width: 200px; 28 margin: 0 auto; 29 } 30 31 .testimonial-indicators { 32 display: flex; 33 justify-content: center; 34 margin-top: 15px; 35 } 36 37 .indicator { 38 width: 12px; 39 height: 12px; 40 margin: 0 5px; 41 background-color: #ccc; 42 border-radius: 50%; 43 cursor: pointer; 44 transition: background-color 0.3s; 45 } 46 47 .indicator.active { 48 background-color: #333; 49 }
js
1let currentIndex = 0; 2const maxIndex = 2; // インジケータ数に合わせた最大インデックス 3 4// オートプレイ機能でスライドを移動 5function showNextTestimonial() { 6 const track = document.querySelector('.testimonial-track'); 7 8 // 現在のインデックスがmaxIndexを超えたら0に戻す 9 currentIndex = (currentIndex + 1) % (maxIndex + 1); 10 track.style.transform = `translateX(-${100 * currentIndex}%)`; 11 12 // インジケータを更新 13 updateIndicators(); 14} 15 16// インジケータのクリックで指定のスライドに移動 17function goToSlide(index) { 18 const track = document.querySelector('.testimonial-track'); 19 20 // インデックスが範囲内か確認 21 if (index >= 0 && index <= maxIndex) { 22 currentIndex = index; 23 track.style.transform = `translateX(-${100 * currentIndex}%)`; 24 updateIndicators(); 25 } 26} 27 28// インジケータの更新処理 29function updateIndicators() { 30 const indicators = document.querySelectorAll('.indicator'); 31 indicators.forEach((indicator, index) => { 32 indicator.classList.toggle('active', index === currentIndex); 33 }); 34} 35 36// 初期設定:最初のインジケータをアクティブに設定 37updateIndicators(); 38 39// オートプレイ機能:5秒ごとに次のスライドを表示 40setInterval(showNextTestimonial, 5000); 41
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
今の段階では3人分づつスライド。インジケーターは9人分表示。インジケータは3までしか動作していません。これを9まで動作するように直したいです。オートプレイと連動させます。
補足
特になし
回答1件
あなたの回答
tips
プレビュー