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

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

新規登録して質問してみよう
ただいま回答率
85.31%
jQueryプラグイン

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

JavaScript

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

jQuery

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

Q&A

解決済

2回答

4009閲覧

slickのindex番号を取得することで、slickの中にモーダルウィンドウのボタンにより、全画面でモーダルを開けるようにしたい

usaki

総合スコア1

jQueryプラグイン

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

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2022/10/10 21:42

前提

slickを使用して、PC時は3個、SP時は1個スライドが並ぶようなスライダーを作成しました。

実現したいこと

slickで作成したスライド画像の一部に、モーダルウインドウが開くボタンを設置しており、クリックすると開くようにしています。
slickスライダーのインデックス番号と同じ番号のモーダルウィンドウを表示するようにしたいのですが、slickのメソッドである「slickCurrentSlide」を使用してインデックス番号を取得すると、スライドが3つ並んでいる時は、最初に表示されている3つすべてがインデックス番号「0」になってしまいます。4つめ以降のスライドには、0、1、2、3、4、0、1、2、3…と順番になっているのですが…
最初に表示される3つのスライドにも、0、0、0ではなく、0、1、2とインデックス番号をつけたいのですが、調べても思うような答えが得られませんでした。

モーダルウィンドウは全画面で表示されるようにしたいので、インデックス番号を使わずに兄弟要素取得などで実装しようかとも思ったのですが、スライダーの大きさやpositionの関係で、インデックス番号を使ってやるのがいいかと思いました。

slickCurrentSlideをしようして実装しようとしていますが、他にも方法があるならこだわりません。

該当のソースコード

HTML

1<!--モーダルウィンドウ--> 2<div class="mordal__wrap"> 3 <div>1つめ</div> 4 <div>2つめ</div> 5 <div>3つめ</div> 6 <div>4つめ</div> 7 <div>5つめ</div> 8</div> 9 10<!--スライダー--> 11<div class="slider"> 12 <div class="slider__item"> 13 <img src="..."> 14 <div class="js-open">モーダルウインドウが開くボタン</div> 15 </div> 16 <div class="slider__item"> 17 <img src="..."> 18 <div class="js-open">モーダルウインドウが開くボタン</div> 19 </div> 20 <div class="slider__item"> 21 <img src="..."> 22 <div class="js-open">モーダルウインドウが開くボタン</div> 23 </div> 24 <div class="slider__item"> 25 <img src="..."> 26 <div class="js-open">モーダルウインドウが開くボタン</div> 27 </div> 28 <div class="slider__item"> 29 <img src="..."> 30 <div class="js-open">モーダルウインドウが開くボタン</div> 31 </div> 32</div> 33

JS

1$(function(){ 2 $('.slider').slick({ 3 arrows: false, 4 dots: true, 5 slidesToShow: 3, 6 responsive: [ 7 { 8 breakpoint: 1023, 9 settings: { 10 slidesToShow:1 11 } 12 } 13 ] 14 }); 15 $('.js-open').click(function(){ 16 var i = $('.member__slider').slick('slickCurrentSlide'); 17 $('.mordal__inner').eq(i).children('div').fadeIn(); 18 }); 19 $('.js-close').click(function () { 20 $('div').fadeOut(); 21 }); 22}); 23

試したこと

jqeuryで.index()を使ったり、
スライダーの中にモーダルウィンドウをいれたり、いろいろやってみましたが、できませんでした。

補足情報(FW/ツールのバージョンなど)

HTMLのソースコードは簡略化しています。

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

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

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

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

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

guest

回答2

1

slick('slickCurrentSlide')は現在表示されているスライドのインデックス番号を取得しますが、複数のスライドが標示されているときは、左端のスライドのインデックス番号を取得します。表示されている2番目や3番目のスライドをクリックしても一番左のスライドのインデックス番号になります。ですので、これは使えません。

jQueryの`index()‘で何番目の要素か取得できますが、slick は要素を複製して並べ替えたりしますので、これも使えません。

HTMLの方でボタンにデータ属性でインデックスを持たせて、それを参照するのが一番確実だと思います。

html

1<!--スライダー--> 2<div class="slider"> 3 <div class="slider__item"> 4 <img src="https://placehold.jp/150x150.png?text=1"> 5 <div class="js-open" data-id="1">モーダルウインドウが開くボタン</div> 6 </div> 7 <div class="slider__item"> 8 <img src="https://placehold.jp/150x150.png?text=2"> 9 <div class="js-open" data-id="2">モーダルウインドウが開くボタン</div> 10 </div> 11 <div class="slider__item"> 12 <img src="https://placehold.jp/150x150.png?text=3"> 13 <div class="js-open" data-id="3">モーダルウインドウが開くボタン</div> 14 </div> 15 <div class="slider__item"> 16 <img src="https://placehold.jp/150x150.png?text=4"> 17 <div class="js-open" data-id="4">モーダルウインドウが開くボタン</div> 18 </div> 19 <div class="slider__item"> 20 <img src="https://placehold.jp/150x150.png?text=5"> 21 <div class="js-open" data-id="5">モーダルウインドウが開くボタン</div> 22 </div> 23</div>

JavaScript/jQuery

1 $('.js-open').click(function(){ 2 var i = $(this).data("id"); 3 console.log(i); //確認用 4 $('.mordal__inner').eq(i).children('div').fadeIn(); 5 });

投稿2022/10/11 02:08

hatena19

総合スコア34367

usaki😍を押しています

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

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

usaki

2022/10/11 02:18

先に回答してくださった方の方法で、解決できましたが、JavaScriptがスッキリしていてわかりやすいので、参考にさせていただきます! データ属性でインデックス番号をつけたことがなかったので、勉強になりました。 本当にありがとうございます!
guest

1

ベストアンサー

開くボタンにデータ属性でインデックス番号をあらかじめ振っておき、
そのインデックス番号と一致するi番目のdivをモーダルで表示するという手法はいかがでしょうか?

html

1<!--モーダルウィンドウ--> 2<div class="mordal__wrap"> 3 <div class="modal-item">1つめ<button class="js-close">x</button></div> 4 <div class="modal-item">2つめ<button class="js-close">x</button></div> 5 <div class="modal-item">3つめ<button class="js-close">x</button></div> 6 <div class="modal-item">4つめ<button class="js-close">x</button></div> 7 <div class="modal-item">5つめ<button class="js-close">x</button></div> 8</div> 9 10<!--スライダー--> 11<div class="slider"> 12 <div class="slider__item"> 13 <img src="https://placehold.jp/150x150.png"> 14 <button class="js-open" data-slide-index="0">モーダルウインドウが開くボタン</button> 15 </div> 16 <div class="slider__item"> 17 <img src="https://placehold.jp/150x150.png"> 18 <button class="js-open" data-slide-index="1">モーダルウインドウが開くボタン</button> 19 </div> 20 <div class="slider__item"> 21 <img src="https://placehold.jp/150x150.png"> 22 <button class="js-open" data-slide-index="2">モーダルウインドウが開くボタン</button> 23 </div> 24 <div class="slider__item"> 25 <img src="https://placehold.jp/150x150.png"> 26 <button class="js-open" data-slide-index="3">モーダルウインドウが開くボタン</button> 27 </div> 28 <div class="slider__item"> 29 <img src="https://placehold.jp/150x150.png"> 30 <button class="js-open" data-slide-index="4">モーダルウインドウが開くボタン</button> 31 </div> 32</div>

javascript

1$(function() { 2 $('.slider').slick({ 3 arrows: false, 4 dots: true, 5 slidesToShow: 3, 6 responsive: [{ 7 breakpoint: 1023, 8 settings: { 9 slidesToShow: 1 10 } 11 }] 12 }); 13 14 // ページロード時、モーダル全て非表示にする 15 // (一瞬ちらついて見えるのがお嫌でしたら、CSSであらかじめdisplay:noneにしておく) 16 $('.modal-item').hide(); 17 18 // 開くボタンを押した時 19 $('.js-open').click(function() { 20 // 押したボタンのデータ属性data-slide-indexの値(数字)を取得 21 const index = $(this).data('slide-index'); 22 23 $('.modal-item').each(function(i) { 24 // 全ての.modal-itemを非表示にし 25 $(this).hide(); 26 27 // divのi番目とデータ属性の数字が一緒だったら 28 if (i == index) { 29 $(this).fadeIn(); // そのdivをフェードインする 30 } 31 }) 32 }); 33 34 $('.js-close').click(function() { 35 $('.modal-item').fadeOut(); 36 }); 37});

投稿2022/10/11 01:36

Cocode

総合スコア2316

usaki👏を押しています

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

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

usaki

2022/10/11 02:03

コードを参考にさせていただき、データ属性でインデックス番号をあらかじめ振ったら、できました! この方法を知らなかったので、とても助かり、勉強になりました。 本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問