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

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

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

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

1回答

208閲覧

プロフィールをスライダー化したい

naaS

総合スコア7

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

1クリップ

投稿2024/11/16 00:46

実現したいこと

イメージとしては以下のサイトにある
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まで動作するように直したいです。オートプレイと連動させます。

補足

特になし

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

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

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

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

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

guest

回答1

0

ベストアンサー

js で手書きしていた transform を css に持ってきて 移動幅を 100% から 100% の 1/3 づつにします。(これは js でやってもいいですが、操作を単純にしたいのでやります。
(別途移動量を 定義してそれを使ってもいいかもしれません

css

1.testimonial-track { 2 --currentIndex: 0; 3 transform: translateX(calc(( -100% / 3) * var(--currentIndex))) 4}

あとは

  • インジゲーターの数を取得して -1 を maxIndex として処理する
  • --currentIndex を更新する

だけではないでしょうか?

js

1let currentIndex = 0; 2/** インジケータ数に合わせた最大インデックス */ 3const maxIndex = 4 document.querySelectorAll(".testimonial-indicators .indicator").length - 1; 5// オートプレイ機能でスライドを移動 6function showNextTestimonial() { 7 const track = document.querySelector(".testimonial-track"); 8 9 // 現在のインデックスがmaxIndexを超えたら0に戻す 10 currentIndex = (currentIndex + 1) % (maxIndex + 1); 11 track.style.setProperty("--currentIndex", currentIndex); 12 13 // インジケータを更新 14 updateIndicators(); 15} 16 17// インジケータのクリックで指定のスライドに移動 18function goToSlide(index) { 19 const track = document.querySelector(".testimonial-track"); 20 21 // インデックスが範囲内か確認 22 if (index >= 0 && index <= maxIndex) { 23 currentIndex = index; 24 track.style.setProperty("--currentIndex", currentIndex); 25 updateIndicators(); 26 } 27} 28 29// インジケータの更新処理 30function updateIndicators() { 31 const indicators = document.querySelectorAll(".indicator"); 32 indicators.forEach((indicator, index) => { 33 indicator.classList.toggle("active", index === currentIndex); 34 }); 35} 36 37// 初期設定:最初のインジケータをアクティブに設定 38updateIndicators(); 39 40// オートプレイ機能:5秒ごとに次のスライドを表示 41setInterval(showNextTestimonial, 5000);

以上。

参考

投稿2024/11/16 04:43

編集2024/11/16 04:48
juner

総合スコア453

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

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

naaS

2024/11/16 06:37

自分のPCだと動作しないので、Windows8.1だと無理なのでしょうか?
juner

2024/11/16 10:04 編集

ブラウザのバージョンを教えてください。 Edge?Chrome? …… もしかして IE? 低いブラウザのバージョンを対象とするのであれば質問文に対象ブラウザまで入れていただかないと厳しいところがあります。 カスタムプロパティ ❌IE ⭕ Edge 16~ Chrome 49~ 主なブラウザで使えるようになった時期:2017年 https://caniuse.com/css-variables calc() ▲IE9~ ⭕Edge 12~ Chrome 26~ 主なブラウザで使えるようになった時期:2013年 https://caniuse.com/calc
juner

2024/11/16 10:08

いや、そもそも livecodes.io は IE非対応だわ。
naaS

2024/11/16 11:22

グーグルクロムを使っています。 以下コピペ 今後、Google Chrome のアップデートを受信するには、Windows 10 以降が必要となります。このパソコンでは Windows 8.1 が実行されています。 詳細 バージョン: 109.0.5414.168(Official Build) (64 ビット)
juner

2024/11/18 00:23 編集

Chrome 109 なら動きそうなものですが……(css nesting の一部が動かないだけで 特に css の custom property や スライドが止まるような要因にはならない気がしますが。 どの様に「動作しない」とされていますでしょうか? ページが開けない、ページが正常に表示されない、スクリプトが動作しない 等等……
naaS

2024/11/18 23:38

livecodes.io playground模範コード 最初はプロフィールが3人分表示されますが、 すぐに消え画面が白くなります。 インジケータは押しても機能しません。 playgroundのようなこちらが求めている動作はしません。 グーグルの検証画面でも、エラーメッセージはありません。
juner

2024/11/18 23:55

livecodes.io で再現を作っていただくか、 codepen.io で再現するものを作っていただいた方が良い感じでしょうか……?(その挙動は想定外です
naaS

2024/11/20 13:21 編集

juner氏のコードをヒントにコードを書き直してみたのです。 css :root { --currentIndex: 0; } body { font-family: Arial, sans-serif; } .testimonial-slider { position: relative; width: 100%; max-width: 1400px; margin: 0 auto; overflow: hidden; } .testimonial-track { display: flex; transition: transform 0.5s ease; transform: translateX(calc(-33.33% * var(--currentIndex))); } .testimonial { flex: 0 0 33.33%; text-align: center; /*padding: 10px;*/ } .testimonial-img { width: 80px; height: 80px; border-radius: 50%; margin-bottom: 10px; } .testimonial-comment { font-size: 1rem; color: #333; max-width: 200px; margin: 0 auto; } .testimonial-indicators { display: flex; justify-content: center; margin-top: 15px; } .indicator { width: 12px; height: 12px; margin: 0 5px; background-color: #ccc; border-radius: 50%; cursor: pointer; transition: background-color 0.3s; } .indicator.active { background-color: #333; } @media screen and (max-width: 480px) { .testimonial-track { display: flex; transition: transform 0.5s ease; transform: translateX(calc(-100% * var(--currentIndex))); } .testimonial { flex: 0 0 100%; text-align: center; /*padding: 10px;*/ } }
naaS

2024/11/20 13:25 編集

jsの書き直し <script> let currentIndex = 0; const maxIndex = 9; // 次のスライドを表示 function showNextTestimonial() { currentIndex = (currentIndex + 1) % maxIndex; updateSlider(); } // 特定のスライドに移動 function goToSlide(index) { currentIndex = index; updateSlider(); } // スライダーの更新 function updateSlider() { document.documentElement.style.setProperty("--currentIndex", currentIndex); updateIndicators(); } // インジケータの更新 function updateIndicators() { const indicators = document.querySelectorAll(".indicator"); indicators.forEach((indicator, index) => { indicator.classList.toggle("active", index === currentIndex); }); } // 初期化 updateSlider(); setInterval(showNextTestimonial, 5000); // 5秒ごとにスライド </script> 最初の投稿と違いカラーにならないので、我ながら投稿方法を間違えているような気がする。 修正方法が分からない… スライダーの動作は成功。 juner氏のコードが参考になったので厚くお礼を申し上げます。
naaS

2024/11/20 13:26

junerさん回答ありがとうございます。 回答は非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問