【jQuery】slick でつまずきやすいところと、よく使う設定まとめ



jQuery のスライダープラグイン「slick」は、手軽に使えて設定も多いので、今でもよく使われています。
いろいろな形の見本は【jQuery】スライダープラグイン「slick」実装サンプル集にまとめました。
今回はその続きです。
「入れたのに動かない」「なぜか崩れる」というときに見てほしい、つまずきやすいところと直し方、よく使う設定をまとめました。
読み込む順番と、書き方
slick は jQuery のプラグインなので、jQuery を先に読み込みます。順番が逆だと、slick is not a function というエラーになって動きません。
<!-- head の中 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.css">
<!-- </body> の前 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
<script src="(自分の JavaScript)"></script>
もうひとつ、古い記事でよく見かける $(document).on('ready', function () { … }) は、jQuery 3 では動きません。$(function () { … }) と書きます。
$(function () {
$(".slider").slick({
dots: true
});
});
読み込みの一瞬、画像が縦に並ぶ
ページを開いた瞬間、スライダーの画像が全部縦に並んで見えて、少しあとでスライダーになる、ということがあります。
slick が動き出すまでは、ただの画像の並びだからです。
slick は動き出すと .slick-initialized というクラスを付けます。それが付くまでは、2枚目から先を隠しておきます。
/* slick が動き出すまでは、1枚目だけ見せる */
.slider:not(.slick-initialized) > div:not(:first-child) {
display: none;
}
矢印とドットが見えない
slick-theme.css の矢印とドットは、白い色で作られています。白い背景のページだと、そこにあるのに見えません。
また、矢印は slick 専用のアイコンフォントで描かれていて、CDN から読み込むとフォントが届かず、四角や文字化けになることもあります。
いちばん確かなのは、矢印とドットの見た目を自分の CSS で付けることです。下の見本は、125naroom の色で描き直したものです。
.slick-prev, .slick-next {
z-index: 1;
width: 40px; height: 40px;
border-radius: 50%;
background: #fff;
box-shadow: 0 0 0 1px #e8e3d8;
transition: background .3s;
}
.slick-prev { left: 12px; }
.slick-next { right: 12px; }
.slick-prev:hover, .slick-prev:focus, .slick-next:hover, .slick-next:focus { background: #e8dc6a; }
.slick-prev:focus-visible, .slick-next:focus-visible { outline: 2px solid #2b2a27; outline-offset: 2px; }
.slick-prev::before, .slick-next::before {
content: "";
display: block;
width: 9px; height: 9px;
margin: auto;
border-top: 2px solid #2b2a27;
border-right: 2px solid #2b2a27;
opacity: 1;
}
.slick-prev::before { transform: translateX(2px) rotate(-135deg); }
.slick-next::before { transform: translateX(-2px) rotate(45deg); }
.slick-prev.slick-disabled::before, .slick-next.slick-disabled::before { opacity: .25; }
.slick-dotted.slick-slider { margin-bottom: 40px; }
.slick-dots { bottom: -34px; }
.slick-dots li { margin: 0 2px; }
.slick-dots li button::before {
content: "";
top: 6px; left: 6px;
width: 8px; height: 8px;
border-radius: 50%;
background: #2b2a27;
opacity: .2;
}
.slick-dots li.slick-active button::before {
opacity: 1;
background: #e8dc6a;
box-shadow: 0 0 0 1.5px #2b2a27;
}
.slick-dots li button:hover::before { opacity: .6; }
content: ""; にしてフォントを使わないので、アイコンフォントが読み込めなくても大丈夫です。
flex や grid の中で、横にはみ出す
サイドの欄と並べるために、親を display: flex; にしたら、スライダーが画面の外までどこまでも広がってしまった、というつまずきです。
flex の子は、何もしないと「中身より小さくならない」決まりになっています(min-width: auto)。slick の中身はとても横に長いので、その長さに合わせて親まで広がってしまいます。
直し方は、スライダーを入れている flex の子に min-width: 0; を付ける、この1行です。grid のときも同じです。
.layout {
display: flex;
gap: 16px;
}
.main {
min-width: 0; /* これがないと、スライダーの長さに合わせて広がる */
}
タブやモーダルの中で崩れる
タブで切り替える中身や、ボタンを押すと開くモーダルの中にスライダーを置くと、開いたときに画像が小さくつぶれていたり、1枚目が見えなかったりします。
slick は動き出すときに、スライダーの幅を測ってスライドの大きさを決めます。display: none; で隠れているあいだは幅が 0 なので、そのまま固まってしまうのです。
見えるようにしたあとで slick('setPosition') を呼んで、幅を測り直します。
$(".tabs button").on("click", function () {
// (タブを切り替える処理)
// 見えるようになったら、幅を測り直す
$(".slider").slick("setPosition");
});
画面の幅で、表示する枚数を変える
PC では3枚、スマホでは1枚、のように変えたいときは responsive を使います。
ここでつまずきやすいのが breakpoint の向きです。breakpoint の数字は「この幅以下のとき」の設定になります(CSS の max-width と同じ向き)。
$(".slider").slick({
slidesToShow: 3, // 広い画面では3枚
slidesToScroll: 3,
responsive: [
{
breakpoint: 768, // 768px 以下のとき
settings: {
slidesToShow: 1,
slidesToScroll: 1
}
}
]
});
mobileFirst: true を付けると向きが逆になり、「この幅より広いとき」の設定になります。スマホの設定を先に書きたいときに使います。どちらか一方の書き方にそろえると、迷いません。
よく使う設定まとめ
slick の設定はたくさんありますが、よく使うのはこのあたりです。
| 設定 | 初期値 | 何が変わるか |
|---|---|---|
autoplay | false | 自動で次のスライドへ進む |
autoplaySpeed | 3000 | 自動再生で、次へ進むまでの時間(ミリ秒) |
speed | 300 | スライドが動く速さ(ミリ秒)。大きいほどゆっくり |
fade | false | 横に動かず、ふわっと切り替わる(1枚ずつのとき) |
infinite | true | 最後まで行ったら最初に戻って、ずっと回る |
slidesToShow | 1 | 一度に見せる枚数 |
slidesToScroll | 1 | 1回で進む枚数 |
arrows | true | 前後の矢印を出す |
dots | false | 下のドットを出す |
centerMode | false | まん中のスライドを中心に、左右を少しのぞかせる |
pauseOnHover | true | マウスが乗っているあいだ、自動再生を止める |
vertical | false | 縦方向に動かす |
responsive | なし | 画面の幅ごとに、設定を変える |
ふわっと切り替わるスライダーなら、たとえばこんな組み合わせです。
$(".slider").slick({
autoplay: true,
autoplaySpeed: 4000,
speed: 1000,
fade: true,
arrows: false,
dots: true
});
動きを減らしたい人のために
スマホやパソコンには、「視差効果を減らす」「動きを減らす」という設定があります。画面の動きで気分が悪くなる人が使う設定です。
この設定にしている人には、自動再生を止めておくとやさしいです。
// 「動きを減らす」にしている人には、自動再生しない
const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
$(".slider").slick({
autoplay: !reduce,
speed: reduce ? 0 : 500,
dots: true
});
さいごに
slick で困ったときは、まず「読み込む順番」「見えていない場所で動かしていないか」「flex の中に入っていないか」の3つを見てみてください。たいていのつまずきは、このどれかです。
いろいろな形のスライダーは、実装サンプル集にまとめています。





