はじめに
Slickでスライダーを作成した際に、URLパラメータの操作を行いました。スライダー以外のURLパラメータに配慮しながら作成したため、多少ハマりました。Slickの使用方法についてはこちらをご参考に。
サンプルコード
sample.html
<div class="slider-container">
<div class="slider">
<div class="slick-slide">
<img class="slide-img" src="https://hogehoge.jp/images/20190101/xxxxxx.jpg" alt="hogehoge">
</div>
<div class="slick-slide">
<img class="slide-img" src="https://hogehoge.jp/images/20190102/xxxxxx.jpg" alt="hogehoge">
</div>
<div class="slick-slide">
<img class="slide-img" src="https://hogehoge.jp/images/20190103/xxxxxx.jpg" alt="hogehoge">
</div>
︙
</div>
</div>
sample.js
var $slider_container = $('.slider-container'),
$slider = $('.slider');
$(function() {
$slider.on('init', function(event, slick) {
// slider-counterクラスの中にカウンターを用意
$('img.slide-img').append('<div class="slider-counter">【<span class="current"></span> / <span class="total"></span>】</div>');
$('.current').text(slick.currentSlide + 1);
$('.total').text(slick.slideCount);
})
.slick({
infinite: true,
speed: 300,
slidesToShow: 1,
dots: true,
︙
// その他オプションはお好みで設定
})
.on('beforeChange', function(event, slick, currentSlide, nextSlide) {
$('.current').text(nextSlide + 1);
})
// スライド変更後に以下のメソッドが発火
.on('afterChange', function(event, slick, currentSlide, nextSlide) {
var slideNum = currentSlide + 1;
var url = location.href;
var params = location.search;
if (params) {
// パラメータがある場合
if (params.match(/(\?|&)image=/)) {
// 既にimage=パラメータがある場合、「image=数字」の箇所を現在のスライド番号に文字列置換
url = url.replace(/(\?|&)image=\d+/, '$1image=' + slideNum);
} else {
// image=パラメータを含まない場合、URLの末尾にパラメータ「image=数字」を追記
url += '&image=' + slideNum;
}
} else {
// パラメータがない場合、単にパラメータ「?image=数字」を追記
url += '?image=' + slideNum;
}
$('.current').text(currentSlide + 1);
});
});
サンプルコードの解説
-
slider-counter
クラスの中にカウンターを用意し、【1/5】のように画像下でスライドを数えれるようにしています。slide-img
クラスがついたimg
タグの直後にカウンターが表示されます。current
クラスが現在のスライド枚数で、total
クラスが合計のスライド枚数です。 - ここではオプションで、
dots: true
を指定していますが、代わりにarrows: true
として「<>」矢印を設定しても良さそうですね。 - 既存のJSメソッド
location.href
とlocation.search
で、それぞれURL全体とパラメータを取得し変数に代入します。 - 最初のif文は、URLパラメータの有無で分岐します。無ければ単に、スライドのパラメータ
?image=数字
を追加します。 - 入れ子になっている次のif文は、スライドのパラメータの有無で分岐します。ここで正規表現を利用し、
?image=数字
または&image=数字
にマッチした場合、現在のスライド番号に文字列置換します。$1
は正規表現の後方参照で、ここではマッチした?
または&
が代入されます。