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

デザオ
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 の設定はたくさんありますが、よく使うのはこのあたりです。

設定初期値何が変わるか
autoplayfalse自動で次のスライドへ進む
autoplaySpeed3000自動再生で、次へ進むまでの時間(ミリ秒)
speed300スライドが動く速さ(ミリ秒)。大きいほどゆっくり
fadefalse横に動かず、ふわっと切り替わる(1枚ずつのとき)
infinitetrue最後まで行ったら最初に戻って、ずっと回る
slidesToShow1一度に見せる枚数
slidesToScroll11回で進む枚数
arrowstrue前後の矢印を出す
dotsfalse下のドットを出す
centerModefalseまん中のスライドを中心に、左右を少しのぞかせる
pauseOnHovertrueマウスが乗っているあいだ、自動再生を止める
verticalfalse縦方向に動かす
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つを見てみてください。たいていのつまずきは、このどれかです。

いろいろな形のスライダーは、実装サンプル集にまとめています。

デザオ
flex の中ではみ出すの、何度もやったことあります…
デザコト
min-width: 0 の1行、覚えておくと便利ですよー

ふたりの小言

デザコトauthor

あ、いいな、と思うWebデザインを紹介しています。デザインの参考に。やさしいデザインが多いです。Webデザインギャラリー『デザインのこと - Web design gallery』を運営しています。