お問い合わせはコチラから

Slick スライダーをサムネイルと連動させて切り替える方法

サイト運営

この記事は、slick.jsでslickGoToを使用したら反応が悪い?と思ったときにチェックしたいslick.jsのオプション(waitForAnimate)について記載しています。この記事を読むことでslick.jsのslickGoToの動きや制約を理解することができるので、期待と違う動きに悩まされることが無くなります。

Slick.jsとは

Slick.jsとは、一言で言えば、jQueryで作られた、スライダー実現するjsプラグインです。

Webでスライダーを見かけたらSlickかSwiperだと思って間違いないでしょう。それぐらい、slick.jsを使うのがもはや定番化しています。

ところで、プラグインと聞いてWordpressのプラグインを思い浮かべる人はjavascriptのプラグインと聞くと腰が引けるのではないかと思います。

しかし、心配はいりません。jQueryのプラグインはとても良くできていてあまり深く考えずに使えるのが最大の魅力です。実際使ってみると意外と簡単じゃない?ということになると思います。そうすると、他のプラグインも使えるようになると思いますので、まずは毛嫌いせずに使ってみることをおススメします。

Slick.jsでサムネイルとスライダーの連動を実装したい

ことの始まりは、次のような要望から始まりました。

  • TCDのテーマを使用
  • アイキャッチ画像を複数使用したい
  • そのアイキャッチ画像はサムネイル一覧をクリックすると切り替わるようにしたい

TCDのテーマだとアイキャッチ画像は複数指定できてスライダー表示できます。もちろんスライダーはslick.jsを使用して実現されています。

だったら、スライダーに使用している画像をサムネイル一覧にしてクリックしたら表示が切り替わるようにしたらええよね?とおもって検索するとそのものずばりのサイトがありました。

これはよさそう!

HTMLコード例

<div id="wrap">
<ul id="slider">
<li class="slide-item"><img data-lazy="画像1.jpg" alt="画像"></li>
<li class="slide-item"><img data-lazy="画像2.jpg" alt="画像"></li>
<li class="slide-item"><img data-lazy="画像3.jpg" alt="画像"></li>
<li class="slide-item"><img data-lazy="画像4.jpg" alt="画像"></li>
<li class="slide-item"><img data-lazy="画像5.jpg" alt="画像"></li>
<li class="slide-item"><img data-lazy="画像6.jpg" alt="画像"></li>
</ul>
<ul id="thumbnail-list">
<li class="thumbnail-item"><img src="画像_1.jpg" alt="画像"></li>
<li class="thumbnail-item"><img src="画像_2.jpg" alt="画像"></li>
<li class="thumbnail-item"><img src="画像_3.jpg" alt="画像"></li>
<li class="thumbnail-item"><img src="画像_4.jpg" alt="画像"></li>
<li class="thumbnail-item"><img src="画像_5.jpg" alt="画像"></li>
<li class="thumbnail-item"><img src="画像_6.jpg" alt="画像"></li>
</ul>
</div>

javascriptコード例

$(function(){
var slider = "#slider"; // スライダー
var thumbnailItem = "#thumbnail-list .thumbnail-item"; // サムネイル画像アイテム

// サムネイル画像アイテムに data-index でindex番号を付与
$(thumbnailItem).each(function(){
var index = $(thumbnailItem).index(this);
$(this).attr("data-index",index);
});

// スライダー初期化後、カレントのサムネイル画像にクラス「thumbnail-current」を付ける
// 「slickスライダー作成」の前にこの記述は書いてください。
$(slider).on('init',function(slick){
var index = $(".slide-item.slick-slide.slick-current").attr("data-slick-index");
$(thumbnailItem+'[data-index="'+index+'"]').addClass("thumbnail-current");
});

//slickスライダー初期化
$(slider).slick({
autoplay: true,
arrows: false,
fade: true,
infinite: false //これはつけましょう。
});
//サムネイル画像アイテムをクリックしたときにスライダー切り替え
$(thumbnailItem).on('click',function(){
var index = $(this).attr("data-index");
$(slider).slick("slickGoTo",index,false);
});

//サムネイル画像のカレントを切り替え
$(slider).on('beforeChange',function(event,slick, currentSlide,nextSlide){
$(thumbnailItem).each(function(){
$(this).removeClass("thumbnail-current");
});
$(thumbnailItem+'[data-index="'+nextSlide+'"]').addClass("thumbnail-current");
});
});

CSSコード例

#wrap {
background-color: #333;
display: flex;
flex-direction: column;
justify-content: center;
height: 100vh;
}

#slider {
width: 300px;
margin: 0 auto 30px;
}

.slide-item img {
width: 100%;
}

#thumbnail-list {
width: 300px;
margin: 0 auto;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}

.thumbnail-item {
flex: 0 1 30%;
margin-bottom: 10px;
box-sizing: border-box;
position: relative;
}
.thumbnail-item:after {
content: '';
background-color: rgba(0, 0, 0, 0.5);
position: absolute;
display: block;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 1;
transition: .3s opacity linear;
}
.thumbnail-item.thumbnail-current:after {
opacity: 0;
}
.thumbnail-item img {
width: 100%;
margin: 0 auto;
}

しかし、クリックしても連動しない時がある

実際にカスタマイズをTCDテーマに組み込んでみると確かに表示はされました。

しかし、何回か違う画像をクリックした時にスライダーが切り替わる時と切り替わらない時がありました。

最初はクリックできる範囲が狭くて、クリックしにくいだけ?と思ってあまり気にしなかったのですが、実はそうではありませんでした。

それがはっきりしたのは、on.clickイベントではなく、on.hoverイベントに切り替えた時でした。

サムネイルの上にマウスポインタを載せて別のサムネイルに次々にマウスポインタを動かしていくと反応しなくなるからです。

イベントは必要な数だけ発生していたので、イベントごとの処理を受け付けない時があるというのがあきらかでした。

実は、slickGoToはスライダーがアニメーション中は無視される

サムネイルのクリックによりスライダー表示を切り替える仕組みは、サムネイルのクリックイベントが発生した時にslickGoToメソッドを使用して実現しています。

slickGoTo
引数:int : slide number, boolean: dont animate

機能:Navigates to a slide by index

結論から言いますと、slickGoToはスライダーがアニメーション中は無視されます。スライダーを切り替えるアニメーション期間中に複数回のslickGoToが発生するとスライダー側で無視する仕様です。

アニメーション期間中にslickGoToを有効にするには?

slickにはwaitForAnimateオプションがあります。

waitForAnimate

Ignores requests to advance the slide while animating

slickのwaitForAnimateオプションをFalseにすることで解決します。

waitForAnimateオプションは初期状態でTrueですので、オプション指定しないとスライダー切り替わり時のアニメーション期間中はslickGoToが無視されてしまうのです。

Javascriptとか嫌な人はSnow monkey blockを使いましょう

Slickのスライダーを気軽に使いたい人は、以下のプラグインを導入すればGutenbergのブロックとして利用可能です。

Slickは面倒だという人にはfotoramaプラグインがおススメ

まとめ

waitForAnimateオプションをFalseにすることで、スライダーとサムネイルの連動は完璧にワークするようになりました。

この記事を書いた人
ブーン

はるばる日本よりオランダ王国へやってまいりました。
自分の経験が少しでも参考になれば嬉しいです。
お問い合わせは、『こちら』からお願い致します。

\ブーンをフォロー/
スポンサーリンク
サイト運営
\シェアお願いします!/
\ブーンをフォロー/
こんな記事も読まれています

失敗しないレンタルサーバーランキング

mixhost

不正アクセスに強くて使いやすいおススメサーバー
\本サイトで利用中/
メリット①:自動ウィルス駆除対応
メリット②:サイトの表示速度が速い!
メリット③:転送量の上限が多い!
メリット④:自由にプラン変更ができ、アクセス増にも対応できる!
メリット⑤:バックアップデータが無料で復元できる!
メリット⑥:Wordpressが簡単にインストールできる!
メリット⑦:どのプランでも初期費用が無料!
メリット⑧:10日間の無料お試し期間と30日の返金保証!

Conoha Wing

国内Wordpress最速の最強サーバー
メリット①:圧倒的な表示速度
メリット②:レンタルサーバーと独自ドメインがセットでお得◎
メリット③:プラン変更はすべてのプランで自由自在
メリット④:一か月の利用転送量の制限が緩い(9TB~)
メリット⑤:WordPresサイトの移行が簡単

エックスサーバー

国内シェアNo1の安定性と実績が魅力。ALL SSDで死角なしの万能サーバー。
メリット①:サイトの表示速度が安定して速い!
メリット②:アクセス負荷に強くて安定性が高い!
メリット③:24時間365日の充実サポートで安心!電話サポートもあり!
メリット④:転送量が多い!
メリット⑤:自動バックアップ機能付き!
メリット⑥:WordPressが簡単にインストールできる!
メリット⑦:10日の無料お試し期間がある!

タイトルとURLをコピーしました