ライブラリを使わず、JSでスライダーを作成しようと思っています。
やりたいこと
自動スライド(2秒ごと)- 画像を3枚表示(両端の画像は半分表示で見切れさせる)
仕組み
かんたんに以下仕組みになります。
- liタグ取得
- for文でli要素をループ
- JSでcss操作し、leftなどとして横移動
- スライド関数実行(setinterval)
悩んでいること
画像スライド時の重なり
添付しているコードあくまでローカル確認用になります
他ファイルに組み込んだ際、横スライドが実現できず、スライドした画像が上に重なってしまいます。
slick
などのように、画像が水平移動するのが理想なのですが、こちら.style.lef
などの指定が問題でしょうか。
代替案あれば教えていただけますでしょうか。
画像を3枚表示(両端の画像は半分表示で見切れさせる)
計6枚画像があるとして、最後の画像(6枚目)を、1の画像の前に表示させたいです。
以下のような形にする場合は、cssで操作するのでしょうか。
jQueryなどのライブラリだとよく見かけるのですが、JSで作成する方法がわからずにいます。
以下の参考サイトの「画像スライダー」にそって進めました。
https://blog.kannart.co.jp/coding/1199/#slide
// 次のスライドを現在のスライドの進行方向後ろに移動させる
のsetTimeout
部分を書き換える必要がありそう?な気がしているのですが、100%コードの意味を把握できていない状況です。
デバックの様子です。
画像が1枚目
画像が1枚目消える
画像が2枚目が表示される
html
1<div class="container"> 2 <div class="wrap"> 3 <ul class="slide-list"> 4 <li class="slide-list-item"><img src="https://placehold.jp/400x200.png" alt=""></li> 5 <li class="slide-list-item"><img src="http://placehold.jp/24/cc9999/993333/400x200.png"" alt=""></li> 6 <li class=" slide-list-item"><img src="https://placehold.jp/400x200.png" alt=""></li> 7 <li class="slide-list-item"><img src="http://placehold.jp/24/cc9999/993333/400x200.png"" alt=""></li> 8 </ul> 9 </div> 10 </div> 11 <script src=" ./index.js"></script>
css
1.container { 2 width: 400px; 3 margin: 0 auto; 4 padding: 50px 0; 5} 6.wrap { 7 position: relative; 8 width: 400px; 9 margin: 0 auto; 10} 11.slide-list { 12 position: relative; 13 width: auto; 14 height: 200px; 15 overflow: hidden; 16 margin: 0 auto; 17} 18.slide-list-item { 19 position: absolute; 20 top: 0; 21 left: 0; 22 width: 400px; 23}
javascript
1var slideItems, 2 slideItemWidth, 3 slidePrev, 4 slideNext, 5 slideItemNum, 6 slideCurrent; 7 8// マッチしたid・class名を持つ要素を取得、変数の定義 9slideItems = document.querySelectorAll('.slide-list-item'); 10slideItemWidth = document.querySelectorAll('.slide-list-item')[0].clientWidth; 11console.log(slideItemWidth); 12slideItemNum = 0; 13slideCurrent = 0; 14 15// スライド表示位置やスライドの初期表示 16for (var i = 0; i < slideItems.length; i++) { 17 slideItems[i].style.left = slideItemWidth + 'px'; 18 if (slideItemNum === slideCurrent) { 19 slideItems[i].style.left = 0 + 'px'; 20 } 21 slideItemNum++; 22} 23 24setInterval(() => { 25 slide(slideCurrent + 1); 26}, 2000); 27 28// スライド関数 29function slide(next) { 30 // 現在のスライドの値と次のスライドの値を比較し、positionで調整 31 var pos; 32 33 if (slideCurrent < next) { 34 pos = -slideItemWidth; 35 } else { 36 pos = slideItemWidth; 37 } 38 // 最初に戻る 39 if (next === slideItemNum) { 40 next = 0; 41 } else if (next === -1) { 42 next = (slideItemNum - 1); 43 } 44 // 最後に戻る 45 46 for (var i = 0; i < slideItems.length; i++) { 47 slideItems[i].style.transition = 'initial'; 48 } 49 // 次のスライドを現在のスライドの進行方向後ろに移動させる 50 slideItems[next].style.left = -pos + 'px'; 51 setTimeout(function () { 52 slideItems[next].style.transition = 'all 0.5s'; 53 slideItems[next].style.left = 0 + 'px'; 54 }, 30); 55 slideItems[slideCurrent].style.transition = 'all 0.5s'; 56 slideItems[slideCurrent].style.left = pos + 'px'; 57 58 slideCurrent = next; 59} 60
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー