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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

1727閲覧

スライドショーをループさせたい

miyabeam

総合スコア16

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/10/17 08:06

やりたいこと

下記サイトの「Single Item」のようなループするスライドショーを作成したいです。
http://kenwheeler.github.io/slick/

困っていること

スライドとドットを順番に動かすところまでは出来ました。
その先ループさせていくにはどうしたらいいかわからず困っております。
3枚目のあとに1枚目に戻る(左方向の動き)というよりは、参考サイトのように3枚目の次に1枚目が来る(右方向の動き)形にしたいです。

現状のソース

HTML

1<div class="slideBlock"> 2 <ul class="slider"> 3 <li><img src="http://placehold.jp/24/cc9999/000/300x150.png" alt=""></li> 4 <li><img src="http://placehold.jp/24/99cc99/000/300x150.png" alt=""></li> 5 <li><img src="http://placehold.jp/24/9999cc/000/300x150.png" alt=""></li> 6 </ul> 7</div> 8 9<ul class="dots"> 10 <li class="is-active">●</li> 11 <li>●</li> 12 <li>●</li> 13</ul> 14 15<button class="is-next">次へ</button>

SCSS

1.slideBlock { 2 position: relative; 3 height: 150px; 4} 5 6.slider { 7 position: absolute; 8 top: 0; 9 left: 0; 10 display: flex; 11 transition: .8s all; 12} 13 14.dots { 15 display: flex; 16 17 > li { 18 color: black; 19 20 &.is-active { 21 color: red; 22 } 23 } 24}

JavaScript

1function slideShow() { 2 const slider = $('.slider'); 3 const slides = slider.find('li'); 4 const slideLength = slides.length; 5 const slideWidth = slides.width(); 6 let slideNumber = 0; 7 8 const dots = $('.dots li'); 9 const activeClass = 'is-active'; 10 11 const nextBtn = $('.is-next'); 12 13 nextBtn.on('click', () => { 14 // 現在のスライド番号を更新 15 slideNumber++; 16 17 // スライドの動き 18 const sliderPosition = slideWidth * slideNumber; 19 slider.css('left', `-${ sliderPosition }px`); 20 21 // ドットの付け替え 22 dots.removeClass(activeClass); 23 dots.eq(slideNumber).addClass(activeClass); 24 }); 25} 26 27slideShow();

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

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

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

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

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

guest

回答2

0

ベストアンサー

「次へ」ボタン押下時に、先頭のスライドを末尾に再配置するようにすれば、実現できるかと思います。
具体的なコードは、以下の通りです。

コード

html

1<!-- 修正なし -->

css

1/* 修正部分のみ抜粋 */ 2.slider { 3 position: relative; /* absolute -> relative */ 4 top: 0; 5 left: 0; 6 display: flex; 7 /* transition: .8s all; */ /* 削除 */ 8} 9 10.slider li { 11 position: absolute; /* 追加 */ 12 /* transition: .8s all; */ /* 削除 */ 13}

js

1function slideShow() { 2 const slider = $('.slider'); 3 const slides = slider.find('li'); 4 const slideLength = slides.length; 5 const slideWidth = slides.first().width(); 6 let slideNumber = 0; 7 8 const dots = $('.dots li'); 9 const activeClass = 'is-active'; 10 11 const nextBtn = $('.is-next'); 12 13 //初期位置の設定 14 //予め、末尾の要素を先頭に移動しておく 15 const lastSlide = slides.last(); 16 slider.prepend(lastSlide); 17 18 const currentSlides = slider.find('li'); 19 20 for(let i = 0; i < currentSlides.length; i++){ 21 const slide = currentSlides.eq(i); 22 const slidePosition = slideWidth * (i - 1); 23 slide.css('left', `${ slidePosition }px`) 24 } 25 26 27 nextBtn.on('click', () => { 28 29 //現在のli要素を取得する 30 const currentSlides = slider.find('li'); 31 32 //先頭の要素を末尾に再配置する 33 const lastSlide = currentSlides.first(); 34 slider.append(lastSlide); 35 36 const lastSlidePosition = slideWidth * (slideLength - 1) 37 lastSlide.css('left', `${ lastSlidePosition }px`) 38 39 40 //先頭~末尾1つ前(旧2番目~末尾)の要素を移動する 41 for(var i = 1; i < slideLength; i++){ 42 const slide = currentSlides.eq(i); 43 const slidePosition = slideWidth * (i - 2); 44 slide.animate({left: `${ slidePosition }px`}, 800); 45 } 46 47 //末尾の要素(旧先頭の要素)も移動する 48 const movedLastSlidePosition = slideWidth * (slideLength - 2) 49 lastSlide.animate({left: `${ movedLastSlidePosition }px`}, 800) 50 51 //スライド番号はループするようにする 52 slideNumber++; 53 slideNumber %= slideLength; 54 55 // ドットの付け替え 56 dots.removeClass(activeClass); 57 dots.eq(slideNumber).addClass(activeClass); 58 }); 59} 60 61slideShow();
補足

元のコードは、スライドを含むul要素自体を移動していましたが、このコードでは、li要素(スライド)自体を動かすようにしています。
「次へ」ボタンを押すと、先頭のスライドを末尾に再配置し、その後、jQueryのanimate関数を使って、全てのスライドを左に動かしています。CSSのtransitionを使用しなかった理由は、先頭のスライドをappendで末尾に再配置する際に、意図しないアニメーションが発生するからです。

なお、このコードには2つの問題があります。
1つは、「次へ」ボタンを押した際に、1番左の要素がすぐに消えてしまうことです。これを解決するには、スライドの表示を適切に制御し、真ん中のスライドのみ見えるようにする必要があります。
もう1つは、「次へ」ボタンを連打できてしまうことです。スライドが移動を終える前に、さらに「次へ」ボタンが押されると、先頭のスライドが末尾に移動する際に、他のスライドの上を横切って移動するように見えます。これを解決するには、スライドが移動している間は、ボタンを反応しないようにする必要があります。

投稿2018/10/17 15:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

miyabeam

2018/10/18 00:18

くわしくありがとうございます! appendがうまくいかず、原因がtransitionとは思いませんでした。 `slideNumber %= slideLength` でループできるのはスマートでいいですね。 大変参考になりました!
guest

0

失礼しました
公式ドキュメント読んでます?

中学生レベルの英語で書いてあるので一度読んで見る事をオススメします。
わかんなかったらもう一度聞いて下さい。

投稿2018/10/17 13:16

編集2018/10/17 13:24
oikashinoa

総合スコア2826

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

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

miyabeam

2018/10/17 13:20

概要欄読んでます? Slickを使うなんて一言も言ってないです。
oikashinoa

2018/10/17 13:25

失礼しました。自前で作っているんですね。 ちょっと動かしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問