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

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

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

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

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2707閲覧

eachでサムネイルの連番を、各スライドで0から連番をつけたい。

navbisuu

総合スコア2

HTML5

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

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/10/17 13:45

編集2020/10/19 02:24

前提・実現したいこと

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] ではうまくいきませんでした。。

長文で申し訳ありません。
どうかお力をお借りできれば嬉しいです。
よろしくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

想定する最終形が見えないのでなんとも言えませんがこんな感じですか?

javascript

1$(function(){ 2 $('.product-slide li').attr("data-index",function(){ 3 return $(this).closest('ul').find('li').index(this); 4 }); 5});

投稿2020/10/17 14:12

yambejp

総合スコア114839

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

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

navbisuu

2020/10/18 09:39 編集

yambejp様 ご教示ありがとうございます! その方法で思うようにdata-indexの連番を付けることができました! しかし、スライドとサムネイルのクラス名が同じだと、 複数増やした状態で、サムネイルをクリックしたら、同時にスライドが動いてしまうことに気付きました。。。 なので、スライドとサムネイルのクラス名を変更する方法で実装を考え直しています。 【追記】 コードを書いたら長くなってしまいましたので、 本文に、「コメントいただいてから試してみたこと」に ご教示後の試行錯誤内容を追記しました。 そちらをご確認いただき、コメントいただけると大変有難いです! お手数おかけしますが、よろしくお願い申し上げます。
navbisuu

2020/10/19 02:19

yambejs様 すみません、このスライドの問題は、別の方法で解決したのですが、 表題の質問にはこのご回答内容で解決しましたので、ベストアンサーにしました。 jQueryの新たな知識を増やすことができました。 本当にありがとうございました! スライド問題の解決方法は、こちらの質問ページで解決しました。 https://teratail.com/questions/298792
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問