前提・実現したいこと
eachでサムネイルの連番(index番号)を、各スライドで0から連番をつけたいです。
スライドが1つの場合はうまくいくのですが、
htmlを複製して2つ以上スライドを作成した場合、
各スライドで連番がリセットされず、
index番号(data-index)が5,6,7,8・・・と続きの番号がついてしまいます。
これを各スライドで、サムネイルに0,1,2,3・・・と0から付与したいです。
該当のソースコード
詳細な実装内容ですが、
slickでサムネイル付きのスライド実装をしたいと思っています。
htmlとjavascriptを以下の記述で作成しました。
htmlの記述変更はなしで、
このまま複製しても、javascriptが機能するようにしたいです。
html
1<!--1つのスライド--> 2<div class="product-slide"> 3 <!--メインスライド--> 4 <ul class="slide-main"> 5 <li>1</li> 6 <li>2</li> 7 <li>3</li> 8 <li>4</li> 9 <li>5</li> 10 </ul> 11 <!--/メインスライド--> 12 <!--サムネイルスライド--> 13 <ul class="slide-thumbnail"> 14 <li>1</li> 15 <li>2</li> 16 <li>3</li> 17 <li>4</li> 18 <li>5</li> 19 </ul> 20 <!--/サムネイルスライド--> 21</div> 22<!--/1つのスライド-->
javascript
1 $(function() { 2 // slide(サムネイルつき)--------------------- 3 // 参考サイト:https://takblog.site/web/?p=144 4 var sliderBox = ".product-slide"; 5 var slider = ".slide-main"; //スライダー 6 var thumbnailItem = ".slide-thumbnail li"; //サムネイル画像 7 //サムネイル画像アイテムに data-index でindex番号を付与 8 $(thumbnailItem).each(function() { 9 var index = $(thumbnailItem).index(this); 10 $(this).attr("data-index", index); 11 }); 12 //スライダー初期化後、カレントのサムネイル画像にクラス「thumbnail-current」を付ける 13 //「slickスライダー作成」の前にこの記述は書いてください。 14 $(slider).on("init", function(slick) { 15 var index = $(".slide-item.slick-slide.slick-current").attr( 16 "data-slick-index" 17 ); 18 $(thumbnailItem + '[data-index="' + index + '"]').addClass( 19 "thumbnail-current" 20 ); 21 }); 22 //slickスライダー初期化 23 $(".slide-main").slick({ 24 arrows: true, 25 dots: true, 26 fade: true, 27 infinite: false //これは必須 28 }); 29 //サムネイル画像アイテムをクリックした時にスライダー切り替え 30 $(thumbnailItem).on("click", function() { 31 var index = $(this).attr("data-index"); 32 $(slider).slick("slickGoTo", index, false); 33 }); 34 //サムネイル画像のカレントを切り替え 35 $(slider).on("beforeChange", function( 36 event, 37 slick, 38 currentSlide, 39 nextSlide 40 ) { 41 $(thumbnailItem).each(function() { 42 $(this).removeClass("thumbnail-current"); 43 }); 44 $(thumbnailItem + '[data-index="' + nextSlide + '"]').addClass( 45 "thumbnail-current" 46 ); 47 }); 48 });
試したこと
$(this)を使うと解決すると思っているのですが、
うまく使えず、解決できない状態です。
javascriptの記述でアドバイスいただきたいです。
「サムネイル画像アイテムに data-index でindex番号を付与する」ところで、
以下のように指定してみましたが、data-index自体が付与されなくなってしまいました。
javascript
1 //サムネイル画像アイテムに data-index でindex番号を付与 2 $(sliderBox).each(function() { 3 $(sliderBox) 4 .find(thumbnailItem) 5 .each(function() { 6 var index = $(sliderBox) 7 .find(thumbnailItem) 8 .index(this); 9 $(this) 10 .find(thumbnailItem) 11 .attr("data-index", index); 12 }); 13 });
以上となります。お手数おかけしますが、よろしくお願いします。
コメントいただいてから試してみたこと
yambejp様にご教示いただいた方法で
思うようにdata-indexの連番を付けることができました!
しかし、スライドとサムネイルのクラス名が同じだと、
複数増やした状態で、サムネイルをクリックしたら、同時にスライドが動いてしまうことに気付きました。。。
なので、スライドとサムネイルのクラス名を変更する方法で実装を考え直しています。
そこで、javascriptの記述をスライダーの数だけ複製し、
スライダーとサムネイル画像の部分を、
下記のように、変数と中に入れるクラス名を手動で変更したら、うまく起動しました。
javascript
1 var slider = ".main0"; //スライダー 2 var thumbnailItem = ".slide-thumbnail0 li"; //サムネイル画像
javascript
1 var slider1 = ".main1"; //スライダー 2 var thumbnailItem1 = ".slide-thumbnail1 li"; //サムネイル画像
これをfor文を使って動的に変数とクラスの番号を変更したいのですが、うまくいきません。。。
下記のように、クラスの番号を動的に変更するようにしたのですが、
スライドが複数ある場合、
どのサムネイルをクリックしても、一番下のスライドが反応してしまいます。
javascript
1 $(function() { 2 // slide(サムネイルつき)--------------------- 3 // 参考サイト:https://takblog.site/web/?p=144 4 5 //【追加】スライドの数を数え、その数だけ個別のクラスを付与する 6 var classLength = $(".product-slide").length; 7 var newClassMain, newClassThumbnail, slider, thumbnailItem; 8 //【追加】サムネイル画像アイテムに data-index でindex番号を付与 9 for (var i = 0; classLength > i; i++) { 10 newClassMain = "main" + i; 11 newClassThumbnail = "thumbnail" + i; 12 slider = "." + newClassMain; 13 thumbnailItem = "." + newClassThumbnail + " " + "li"; 14 $(".slide-main") 15 .eq(i) 16 .addClass(newClassMain); 17 $(".slide-thumbnail") 18 .eq(i) 19 .addClass(newClassThumbnail); 20 //サムネイル画像アイテムに data-index でindex番号を付与 21 $(thumbnailItem).each(function() { 22 var index = $(thumbnailItem).index(this); 23 $(this).attr("data-index", index); 24 }); 25 //スライダー初期化後、カレントのサムネイル画像にクラス「thumbnail-current」を付ける 26 //「slickスライダー作成」の前にこの記述は書いてください。 27 $(slider).on("init", function(slick) { 28 var index = $(".slide-item.slick-slide.slick-current").attr( 29 "data-slick-index" 30 ); 31 $(thumbnailItem + '[data-index="' + index + '"]').addClass( 32 "thumbnail-current" 33 ); 34 }); 35 //slickスライダー初期化 36 $(slider).slick({ 37 arrows: true, 38 dots: true, 39 fade: true, 40 infinite: false //これは必須 41 }); 42 //サムネイル画像アイテムをクリックした時にスライダー切り替え 43 $(thumbnailItem).on("click", function() { 44 var index = $(this).attr("data-index"); 45 $(slider).slick("slickGoTo", index, false); 46 }); 47 //サムネイル画像のカレントを切り替え 48 $(slider).on("beforeChange", function( 49 event, 50 slick, 51 currentSlide, 52 nextSlide 53 ) { 54 $(thumbnailItem).each(function() { 55 $(this).removeClass("thumbnail-current"); 56 }); 57 $(thumbnailItem + '[data-index="' + nextSlide + '"]').addClass( 58 "thumbnail-current" 59 ); 60 }); 61 } 62 }
そのため、変数名も変更する必要があると考えています。
しかし、slider[i],thumbnailItem[i] ではうまくいきませんでした。。
長文で申し訳ありません。
どうかお力をお借りできれば嬉しいです。
よろしくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/18 09:39 編集
2020/10/19 02:19