フリーランス|WEB 制作経験丸7年、制作会社様からのご依頼に丁寧・高クオリティでお手伝いいたします。 IRODORI DESIGN

B L O G

【jQuery】slickスライダーのページャーをメーターにカスタマイズする方法

WEBサイトでスライドショーを作成する際、よく使用するスライダープラグインのslick。
デフォルトのオプション機能にページナビを作成する機能があります。
しかし、デフォルト機能の場合、画像の枚数分、ページナビが表示されるのみで、あと何秒で次の画像に切り替わるのか分かりません。

つい最近実装をした切り替わりメーター機能を追加したslickページナビの実装方法をご紹介します。

slickスライダーでページナビを表示する

まずは以下のようにhtmlとCSSを用意します。

<div class="slick">
 <div class="item"><img src="./images.jpg"></div>
 <div class="item"><img src="./images.jpg"></div>
 <div class="item"><img src="./images.jpg"></div>
</div>
.slick{
  width: 85%;
  margin: 0 auto;
}
.slick .item{
  width: 100%;
}
.slick .item img{
  width: 100%;
  height: auto;
}

続いてjQueryを以下のように記述します。
class="slick"をslickスライダーにします。

$(function(){
 $slide = $(".slick");
 $slide.slick({
  dots: true,
  autoplay: true,
  speed: 1000,
  autoplaySpeed: 4000,
 });
});

dots: true,
このように記述することでslickのオプション機能でページナビを有効にします。
その他いくつかのオプション機能を有効にします。

項目デフォルト仕様
autoplayfalsetrueの場合、自動再生する
speed300フェードのスピード
autoplaySpeed3000自動再生時のスライド切り替えのスピード

See the Pen Untitled by 寺井大樹 (@teraisan) on CodePen.

ページナビのスタイルを調整する

ページナビレイアウトカスタマイズ

slickの設置が完了したら、slickのデフォルトのページナビのレイアウトを調整します。
以下のCSSでレイアウトを調整します。

/*----- ページナビレイアウトカスタマイズ */
.slick-dots li {
  width: 35px;
  height: 2px;
  margin: 0 3px;
  background: #ccc;
}
.slick-dots li button {
  width: auto;
  height: auto;
  padding: 0;
}
.slick-dots li button::before {
  display: none;
}
.slick-dots li.slick-active {
  position: relative;
}

メーターを作る

メーター部分もCSSで作成します。
メーターの動きはCSSアニメーションで再現します。

.slick-dots li.slick-active::before {
  width: 0;
  height: 100%;
  left: 0;
  top: 0;
  background: #333;
  position: absolute;
  display: block;
  content: "";
  -webkit-animation: 5s linear 0s infinite alternate slide_meter;
          animation: 5s linear 0s infinite alternate slide_meter;
}

/*----- 最初の1回目処理用 */
.slick-dots li.slick-active.first::before {
  -webkit-animation: 4s linear 0s infinite alternate slide_meter;
          animation: 4s linear 0s infinite alternate slide_meter;
}

/*----- アニメーション */
@-webkit-keyframes slide_meter {
  from {
    width: 0;
  }
  to {
    width: 100%;
  }
}
@keyframes slide_meter {
  from {
    width: 0;
  }
  to {
    width: 100%;
  }
}

slickのページナビは現在表示中のliタグにclass="slick-active"が付与されます。
.slick-activeのliのafter要素にスライダーの切り替わる秒数に合わせて横幅を100%になるアニメーションを設定します。

ここでポイントとなるのが、

/*----- 最初の1回目処理用 */
.slick-dots li.slick-active.first::before {
  -webkit-animation: 4s linear 0s infinite alternate slide_meter;
          animation: 4s linear 0s infinite alternate slide_meter;
}

1回目の処理だけ別に指定するということ。

スライダーは
「止まっている時間」+「2枚の画像が切り替わる時間」
この合計時間が1セットの時間となります。

1番最初の画像の時は「 2枚の画像が切り替わる時間 」がありません。
なのでその他と同じ秒数でCSSアニメーションを設定するとメーターがちょうど貯まるタイミングで切り替わりが始まりません。

そのため1番最初の画像用に秒数を調整したアニメーションを別に用意します。

jsで処理を追加する

$(window).load(function(){
    $(".slick-dots li").eq(0).addClass("first");
});

ページの読み込みが完了したタイミングでページナビの1個目にclass="first"を付与します。

これで1回目の処理だけ専用の時間を指定することが可能です。
ただ、1回目の画像切り替わりが終わった後にclass="first"を消さないと、毎回1枚目の切り替わりの時だけ、若干タイミングの異なる速さになってしまいます。
最後の画像→最初の画像の時は
「止まっている時間」+「2枚の画像が切り替わる時間」
となるのでclass="first"が付与されたままだとおかしくなってしまいます。

$slide.on('afterChange', function (slick, currentSlide) {
    if($(".slick-dots li").eq(0).hasClass("first"))
        {
            $(".slick-dots li").eq(0).removeClass("first");
        }
    });
}

slickスライダーのcallback関数を使用し、スライダーが切り替わった後、 class="first" を取り除く処理を追加します。

これでslickスライダーでメーター付きページナビが完成します。

See the Pen Untitled by 寺井大樹 (@teraisan) on CodePen.

※codepen環境下の影響で1回目のタイミングがずれてしまっています。
実際にサイトに埋め込む際はうまくいくと思います。