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

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

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

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

Q&A

解決済

2回答

1186閲覧

スライドショーが動かない原因が知りたいです。

退会済みユーザー

退会済みユーザー

総合スコア0

jQuery

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

0グッド

0クリップ

投稿2020/01/10 04:59

html

1 <div class="slider"> 2 <div class="slideSet"> 3 <div class="slide"><img src="%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A-1.jpg"></div> 4 <div class="slide"><img src="8.jpg"></div> 5 <div class="slide"><img src="7.png"></div> 6 7 </div> 8 9 10 <div class="prevBtn">pre</div> 11 <div class="nextBtn">next</div> 12 </div> 13 14

css

1 2.slider { 3 position: relative; 4 overflow: hidden; 5 width: 500px; 6 height: 500px; 7 margin: 0 auto 8} 9 10.slideSet { 11 position: absolute; 12} 13 14.slide { 15 display: flex; 16 float: left; 17 width: 500px; 18 height: 500px; 19 background: #333 20} 21 22.prevBtn { 23 position: absolute; 24 top: 50%; 25 left: -1%; 26 border-radius: 50%; 27 width: 30px; 28 height: 30px; 29 background: #fff 30} 31 32.nextBtn { 33 position: absolute; 34 top: 50%; 35 right: -1%; 36 border-radius: 50%; 37 width: 30px; 38 height: 30px; 39 background: #fff 40} 41

jquery

1 'use strict'; 2 $(function() { 3 4 var dir = -1; 5 var interval = 1000; 6 var duration = 600; 7 var timer; 8 9 $('.slideSet').prepend($('.slide:last-child')); 10 $('.slideSet').css( 11 'left', 12 -500); 13 14 timer = setInterval(slideTimer, interval); 15 16 function slideTimer() { 17 if (dir == -1) { 18 $('.sildeSet').animate({ 19 'left': '-=500px' 20 }, 21 duration, 22 function() { 23 $(this).append($('.slide:first-child')); 24 $(this).css('left', '-500'); 25 }); 26 } else { 27 $('.sildeSet').animate({ 28 'left': '+=500px' 29 }, duration, function() { 30 $(this).prepend($('.slide:last-child')); 31 $(this).css('left', '-500'); 32 33 dir = -1; 34 35 }); 36 37 } 38 } 39 40 $('.prevBtn').on('click', function() { 41 dir = 1; 42 clearInterval(timer); 43 timer = setInterval(slideTimer, interval); 44 slideTimer(); 45 }); 46 $('.nextBtn').on('click', function() { 47 dir = -1; 48 clearInterval(timer); 49 timer = setInterval(slideTimer, interval); 50 slideTimer(); 51 }); 52

コンソールでエラーチェックを見ても何も表示されていないので原因がわかりません。

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

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

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

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

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

m.ts10806

2020/01/10 05:18

自作のものですよね。でしたら「動かない」では他者にはわかりません。 どういう思想や仕様で組んだのか、ゴールも明示した上で、起きている現象もご提示ください。 あと、どの処理が動いてるかデバッグしてみましたか?
guest

回答2

0

ベストアンサー

意図した動きにならなかった原因は、以下の3点かと思います。

  • $('.slideSet').css('left', -500); ➡ **'-500px'**とする.
  • $(this).css('left', '-500'); ➡ **'-500px'**とする.
  • $(''.sildeSet').animate(... ➡ **'.slideSet'**とする.タイプミス(iとl逆)

質問者さんの考えた作りであれば、else文は必要ないかと思いますが、どうなんでしょう。
表示が終わった要素は子要素の末尾に回してるので、if内の処理だけで実現できているかと思いますが。

私が気になったのは、
既に表示されている画像はアニメーションで画面外に消えていくことが目視できるが、画面内に入ってくる画像はアニメーション完了後にしか表示されません。
アニメーション開始時点でレンダリングされていない要素はアニメーション中に画面内に現れても、アニメーション終了後にしかレンダリングされないみたいです。
おそらく、質問者さんのスライドショーのイメージは画像が連結している状態で画像が切り替わる動きかとは思いますが。
この現象の改善方法はわかりませんでした。

以下のコードで画像が順番にループ表示されると思います。
クリックイベントは割愛します。

JavaScript

1'use strict'; 2$(function() { 3 4 var dir = -1; 5 var interval = 1000; 6 var duration = 600; 7 var timer; 8 9 $('.slideSet').prepend($('.slide:last-child')); //3番目の画像を先頭へ[初期状態:3 1 2] 10 $('.slideSet').css('left', '-500px'); //中央(2番目)の画像が初期表示 11 12 timer = setInterval(slideTimer, interval); //スライドショースタート 13 14 function slideTimer() { 15 if (dir == -1) { 16 $('.slideSet').animate({'left': '-=500px'}, duration, function(){//画像を左へ1つずらす 17 //アニメーション完了後の処理 18 $(this).append($('.slide:first-child')); //先頭画像を末尾へ移動 19 $(this).css('left', '-500px'); //位置修正.アニメーション完了時のleftは-1000pxとなっているので、初期位置の-500pxに戻す. 20 }); 21 } 22 } 23 24});

投稿2020/01/10 09:16

編集2020/01/10 09:24
KazuSaka

総合スコア640

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

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

KazuSaka

2020/01/10 09:52

あ、クリックイベントでどっち周りか決めてるのか!else文も必要ですね。
退会済みユーザー

退会済みユーザー

2020/01/10 22:54

わかりました。ありがとうございます。 あとひとつお聞きしたいのですが、 .animate({'left': '-=500px'}と.animate({'left': '-500px'だとスライドの仕方が異なり前者だと左にずれながら動くのですが、後者だと一瞬で画像が切り替わってしまいます。 なぜそうなるのか-=500pxと-500pxでの違いはどういう仕組みなのでしょうか。
KazuSaka

2020/01/10 23:17

前者:移動前のLEFT値からさらに-500pxした位置までアニメーションで動く. 後者:移動前のLEFT値から-500pxまでアニメーションで動く. 今回の移動前のLEFT値は-500pxなので、 前者の場合、-500px➡-1000pxまで動きます. 後者の場合、-500px➡-500pxまで動きます(実質動いてない) 後者の場合、動いてないのに画像が切り替わるのはなぜか... animate()の完了イベントで $(this).append($('.slide:first-child')); を実施しているから.
guest

0

修正しないといけない箇所は何点かありますが、とりあえず・・・。

・animate内でプロパティ(今回はleft)を指定する場合は''で囲まないようにする。
・animate内でプロパティ(今回はleft)の値を入れるときは単位(px)は不要です。
・animateのdurationは速度を設定するものです。durationを入れても動かないと思います。
→こちら変数の「duration」を設定していました。失礼しました。

animateの設定方法や処理内容等をリファレンス等で見てみると良いと思います。
animate リファレンス

CSS

1 'use strict'; 2 $(function() { 3 4 var dir = -1; 5 var interval = 3000; 6 var duration = 600; 7 var timer; 8 9 $('.slideSet').prepend($('.slide:last-child')); 10 $('.slideSet').css('left', -500); 11 12 timer = setInterval(slideTimer, interval); 13 14 function slideTimer() { 15 if (dir === -1) { 16 $('.slideSet').animate({ 17 left: '-=500' 18 }, 200); 19 } else { 20 $('.slideSet').animate({ 21 left: '+=500' 22 }, 200, function() { 23 dir = -1; 24 }); 25 } 26 } 27 28 $('.prevBtn').on('click', function() { 29 dir = 1; 30 clearInterval(timer); 31 timer = setInterval(slideTimer, interval); 32 slideTimer(); 33 }); 34 $('.nextBtn').on('click', function() { 35 dir = -1; 36 clearInterval(timer); 37 timer = setInterval(slideTimer, interval); 38 slideTimer(); 39 }); 40});

上記コードでとりあえず動くはずです。
ただし一定時間後に自動的にスクロールする動きになっていますが、そのまま放置すると永遠に左にスクロールする挙動のため画像が表示されなくなります。
この部分はどうしたいのかは記載いただいていないので、想定とする挙動となるよう作ってみてください。

投稿2020/01/10 05:30

編集2020/01/10 07:13
vnsa7221

総合スコア348

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

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

退会済みユーザー

退会済みユーザー

2020/01/10 06:01

上記の内容に function() { $(this).append($('.slide:first-child')); $(this).css('left', '-500'); が抜けていますが、外している理由はなんでしょうか。
vnsa7221

2020/01/10 07:11

外している理由に関しては、現在のコードではそちらのコードがあってもなくても挙動に差がないためです。 おそらくスライドの一番前、一番後ろに画像を追加するように実装しようと思いますが、上で記載したコードに該当コードを追加して確認しても挙動に差はないと思われます。 入れたい場合はこちらの部分も修正が必要と思われます。 また上で「durationの設定方法が間違い」と記載しましたが、こちら変数を入れていたということで指摘に不備がありました。失礼いたしました。
退会済みユーザー

退会済みユーザー

2020/01/10 08:04

左に永遠にスクロールするのではなく、スライド画像が続くようにするにはどのように実装すればよろしいのでしょうか。
vnsa7221

2020/01/10 08:18 編集

おそらく実装したいものは無限ループスライダーだと思われますが、こちらのjQuery実装は調べてみると結構多くの記事があります。そちらを参照してまずは自分で進めてみてはいかがでしょうか? 自分で調べてみてうまくいかない部分が新しく出てきたら再度質問をしてみるなり、こちらの質問に追記するなどして有識者の方にお伺いすると良いのかなと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問