slickのafterChangeイベント内でslickGoToを使う場合の対処方法

普通にやるとうまく動作しないので、その対処方法です。いわゆるバッドノウハウ。

6枚くらいスライドがあって、初回以外は最後の3つだけ繰り返したい、といったときに使えます。

結論

オプションに waitForAnimate: false を指定しておく。もしくはsetTimeoutでタイミングをずらす。

// 1.waitForAnimate: falseとする場合
$('#slides').slick({
    autoplay: true,
    speed: 2000,
    autoplaySpeed: 3000,
    pauseOnFocus: false,
    pauseOnHover: false,
    waitForAnimate: false
}).on('afterChange', function(event, slick, currentSlide){
    if (currentSlide === 5) {
        slick.slickGoTo(3);
    }
});

// 2.setTimeoutでタイミングをずらす場合
$('#slides').slick({
    autoplay: true,
    speed: 2000,
    autoplaySpeed: 3000,
    pauseOnFocus: false,
    pauseOnHover: false
}).on('afterChange', function(event, slick, currentSlide){
    if (currentSlide === 5) {
        setTimeout(function(){
            slick.slickGoTo(3);
        }, 3000);
    }
});

原因

waitForAnimationがtrueの状態(デフォルト)だとアニメーション中にはスライド移動できなくなります。
おそらくafterChangeが発生するタイミングは切り替わりのアニメーションがちょうど終わるときなのでしょう。微妙なタイミングではありますが、その時点ではまだアニメーション中だという判定になってしまっているようで、slickGoToが無視されてしまうようです。slickGoToだけでなく、slickPrevやslickNextも同様ですね。

2種類の対応方法を挙げましたが、前者だとアニメーションの切り替わり直後にslickGoToが実行されてしまうので、後者のようにsetTimeoutを使う方が良い場面が多い気がします。

この記事が気に入ったらサポートをしてみませんか?