【jQuery】slickを使ってみよう④

# 前回まで
前回は、シンプルなスライダーを実装しました。
今回は、公式ドキュメントのdemosに載っているCenter Modeを実装していきたいと思います。

# Center Modeってどんな？
[slick 公式ドキュメント](https://kenwheeler.github.io/slick/)　によると、currentなスライドの両端に、前後のスライドがちょっと見えてるようなデザインですね。
前後にちょぴっと見えるおかげで、これがスライダーなんだなとわかりやすいですね。

# 今回の目標
EDIT ON CODEPENボタンで拡大して見てください
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="MYWvqaR" data-pen-title="my-slick003" data-user="Kei-Aoyama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Kei-Aoyama/pen/MYWvqaR">
  my-slick003</a> by yoruokamix (<a href="https://codepen.io/Kei-Aoyama">@Kei-Aoyama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

記事に書いたところからちょっちspeedとかいじってあります。

# 学習環境

### ディレクトリ構造
```
.
├── index.html
├── css/
│   └── style.css
├── js/
│   └── script.js
├── slick/
│   ├── slick.js
│   ├── slick.css
│   ├── slick-theme.css
│   └── …
└── img/
    ├── sample01.jpg
    ├── sample02.jpg
    └── sample03.jpg
```

### 最低限のリセットCSS+α
``` .css
*,
::before,
::after {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}

ul,
ol {
  list-style: none;
}

/* 場合によっては上書きすることになるが一応入れておく */
img{
    width: 100%;
}
```

:::note warn
注意
リセットCSSは実際にslickを導入する環境に合わせる。
あとからリセットCSSを追加したり削除したりすると見た目が崩れることがあるので注意。
その場合、この記事の見た目と多少の違いが出ることがあります。
:::

# 実際に書いてみましょう
### slickの導入
記事①②を参考にslickを読み込んでください。

### HTML
```.html
<div class="my-slick">
    <div><img src="./img/sample01.jpg" alt="スライド01"></div>
    <div><img src="./img/sample02.jpg" alt="スライド02"></div>
    <div><img src="./img/sample03.jpg" alt="スライド03"></div>
</div>
```

画面幅によって表示する画像を変えたい方は、pictureタグを使ってください。
### css
記事②と同じ設定にしておきます。
```.css
body{
    background: #ccc;
}

.my-slick{
    width: calc(100% - 100px);
    margin: 0 auto;
}

.my-slick img{
    width: 100%;
    aspect-ratio: 3 / 2;
    object-fit: cover;
}
```

### js
```.js
$(function(){
    $('.my-slick').slick({
      //setting-name: setting-value
     
    });
});
```
新しく出てくるプロパティ
| setting-name | setting-value | 説明 |
|:-:|:-:|:-:|
| centerMode  |  true | centerModeを使う  |
| centerPadding | 任意の数値(px or %) | centerMode時の左右のpadding。<br>ダブルクオーテーションを付ける。 |

```.js
$(function(){
    $('.my-slick').slick({
      //setting-name: setting-value
      autoplay: true,
      centerMode: true,
      centerPadding:"40px"
    });
});
```

### 結果
![スクリーンショット 2025-03-10 17.00.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43453/50c367bc-c3d4-4903-933f-c040b55c4377.png)

うーん、書いた通りにはなってるんだけど、なんか惜しい！

## 惜しいのでとりあえず検証ツール
公式ドキュメントだと、スライドとスライドの間に余白があるんですね。

![スクリーンショット 2025-03-10 17.02.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43453/ac95aec5-7427-49f7-af0c-74469a485d48.png)

どうやらmarginとpaddingが付いているらしい。

### classとCSSを書き足す
```.html
<div class="my-slick">
    <div class="my-slick-item"><img src="./img/sample01.jpg" alt="スライド02"></div>
    <div class="my-slick-item"><img src="./img/sample02.jpg" alt="スライド02"></div>
    <div class="my-slick-item"><img src="./img/sample03.jpg" alt="スライド02"></div>
</div>
```

```.css
.my-slick-item{
  padding: 20px;
}
```
さらに、centerPaddingをもう少し大きめにすると見栄えが良くなります。

### 結果
だいぶいい感じになったのではないでしょうか？？

![スクリーンショット 2025-03-10 17.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43453/922bfed2-36c8-4c9c-abed-3c9112e17100.png)

## さらにdemoに近づける
demoでは一度に３枚のスライドを見せる設定になっているので、slidesToShowを設定します。

```.js
$(function(){
    $('.my-slick').slick({
      //setting-name: setting-value
      autoplay: true,
      centerMode: true,
      centerPadding: "80px",
      slidesToShow: 3
    });
});
```

スライドアイテムが３つしかないとイマイチわかりづらいので、とりあえずコピペでスライドアイテムを増やしてください。

### 結果
どんなもんだい。

![スクリーンショット 2025-03-10 17.18.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43453/8f00b868-3901-4892-9332-b6668c1e7fb5.png)

## responsiveプロパティを使ってみよう
responsiveプロパティを使うと、ブレークポイントごとに表示する枚数や矢印の有無などを設定することができます。

### 書き方
```.js
$(function(){
    $('.my-slick').slick({
        //setting-name: setting-value
        autoplay: true,
        centerMode: true,
        centerPadding: "80px",
        slidesToShow: 3,
        responsive: [
            {
                breakpoint: 768,
                settings: {
                    arrows: false,
                    centerMode: true,
                    centerPadding: '40px',
                    slidesToShow: 3
                }
            },
            {
                breakpoint: 480,
                settings: {
                    arrows: false,
                    centerMode: true,
                    centerPadding: '40px',
                    slidesToShow: 1
                }
            }
        ]
    });
});
```
#### responsive部分のみ抜粋
```js
responsive: [
    {
        //ブレークポイント
        breakpoint: 768,
        //ブレークポイント以下のときは以下のsettingsを適用する
        settings: {
            arrows: false,
            centerMode: true,
            centerPadding: '40px',
            slidesToShow: 3
        } //settingsの閉じ括弧
    } //ブレークポイントの閉じ括弧　bpを複数指定するときはここにカンマを入れて続ける
] //responsiveの閉じ括弧
```
arrows:falseにしたときに、左右の余白が残ったままになって見栄えが悪いのですが、そのあたりはCSSのメディアクエリで調整します。（割愛）

## おまけ
公式ドキュメントのdemoでは現在のスライド（中央に来ているもの）が大きくなっていると思います。
これもCSS側で対応します。
現在のスライドには.slick-currentというclassが付与されます。
それを踏まえてCSSを書くと……
```.css
.my-slick img{
  /*（省略）*/

  /* ぬるっと動かしたいときはこれも追加。slickのプロパティspeedと揃えると見栄えよい。 */
  transition-duration: 300ms;
}

.my-slick .slick-current img{
  transform:scale(1.1);
}
```
あんまり爆速でスライドを切り替えると、カクッと大きくなってしまうことがありますが、気になる人は自動再生のみにするとかで対応してください。

# まとめ
今回は、centerModeとresponsiveプロパティについて勉強をしました。
slickシリーズは次回で最後にしようと思います。
次回は、demosの中にある、Slider Syncingをやっていきたいと思います