個人的に、まだまだ使用する機会が多いjQueryのプラグインslick。その小技をまとめてみた。
基本のslick
<div class="c-slick js-slick">
<div class="c-slick__item">
<img src="image1.jpg" width="400" height="300" decoding="async" fetchpriority="high" alt="">
</div>
...
</div>
上記のhtmlのclass="js-slick"
にslickを適用する。
$(function() {
$('.js-slick').slick({
// slickのオプション設定
autoplay: true,
arrows: false,
dots: true,
}):
});
必要に応じてslickのオプションを設定する。上の例の場合は、自動再生あり、前後の矢印ボタンなし、ページネーションのドット表示となっている。
スライドの端を少し見せる
両端を少し見せる
$(function() {
$('.js-slick').slick({
centerMode: true,
centerPadding: '35px',
slidesToShow: 2,
...
});
});
centerMode: true
で中央揃えモードが有効になる。
centerPadding
で中央揃えモードのスライド両端のパディング(=どの程度左右に見せるか)を指定する。指定できる単位はpx
または%
、サイズが大きいほど見える領域も大きくなる。
centerPadding
の値は、slick-list
のpaddingとして適用される。
<div class="c-slick js-slick slick-initialized slick-slider">
<div class="slick-list draggable" style="padding: 0px 35px;">
<div class="slick-track" style="opacity: 1; width: 3165px; transform: translate3d(-1688px, 0px, 0px); transition: transform 500ms;">
...
</div>
</div>
</div>
slidesToShow
で設定されるスライドは数には、両端のスライドは含まれない。
片側を少し見せる
片側の場合は、centerMode
centerPadding
の指定はせず、slick-list
に対してcssでpadding設定を行う。
.slick-list {
// 左側を見せる場合
padding-left: 35px;
// 右側を見せる場合
padding-right: 35px;
}
スライドの端を少し見せる例
中央の画像を大きくする
中央に来たスライダーを大きく見せて強調したい場合に使える。
$(function() {
$('.js-slick').slick({
centerMode: true,
...
});
});
centerMode: true
でスライドを中央配置にする。
<div class="c-slick js-slick slick-initialized slick-slider slick-dotted">
<div class="slick-list draggable" style="...">
...
<div class="c-slick__item slick-slide slick-current slick-center" data-slick-index="1" aria-hidden="false" tabindex="0" role="tabpanel" id="slick-slide00" aria-describedby="slick-slide-control00"> //
<img src="image.jpg" width="200" height="400" decoding="async" alt="" class="c-slick__img">
</div>
...
</div>
</div>
中央のスライダー要素にslick-center
が付与されるので、このclassに対してcssを設定する。
/* 通常のスライド画像 */
.c-slick__img {
transform: scale(0.8);
transition: transform .3s linear;
}
/* 中央のスライド画像 */
.slick-center .c-slick__img {
transform: scale(1);
}
通常のスライド画像のサイズを縮小(0.8)し、slick-center
が付与されたときに画像が元のサイズ(1)に戻るようにする。transition
プロパティを設定することで、拡大・縮小がスムーズになる。
画面のスクロールでslickが発動するようにする
スクロールしてスライダーが画面に入ったタイミングでslickを発動する。
$(function() {
const slider = $(".js-slick");
slider.slick({
autoplay: false,
arrows: false,
dots: true,
infinite: true,
variableWidth: true,
centerMode: true,
slidesToShow: 5,
pauseOnFocus: false,
pauseOnHover: false,
});
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
slider.slick("slickPlay");
} else {
slider.slick("slickPause");
}
});
},
{
root: null,
rootMargin: "-50% 0px",
threshold: 0,
}
);
observer.observe(slider[0]);
});
デフォルトではautoplay: false
にしておく。
Intersection Observerを使ってターゲット要素とビューポートとの交差を検知する。画面に入ったらslickを発動(slickPlay
)、画面から外れたらslickを止める(slickPause
)。
jQueryオブジェクトslider
からslider[0]
で実際のDOM要素を取得して、Intersection Observerで使用できるようにしている。
中央の画像を大きくする+画面スクロールでslick発動の例
自動再生でランキング形式のスライダーを見せている場合、画面に入った時だけslickが発動すると最初(または中断した所)から見られて親切だと思う。
読み込み時のチラつき、スライダーが縦に並ぶのを防ぐ
ページの読み込みが遅い時などに、スライダー画像が一瞬拡大されたり縦並びになったりすることがある。
その対応策として、slickが読み込まれたタイミングで表示させるという方法がある。
<div class="c-slick js-slick slick-initialized slick-slider slick-dotted">
<div class="slick-list draggable" style="padding: 0px 50px;">
<div class="c-slick__item slick-slide slick-current slick-center" data-slick-index="1" aria-hidden="false" tabindex="0" role="tabpanel" id="slick-slide00" aria-describedby="slick-slide-control00">
<img src="image.jpg" width="200" height="400" decoding="async" alt="" class="c-slick__img">
</div>
...
</div>
</div>
スライダーが初期化(読み込み完了)されるとslick-initialized
というclassがスライダーに付与される。このclassに対してcssでスタイルを付ける。
その1:display
プロパティを変える
.c-slick {
display: none;
}
.c-slick.slick-initialized {
display: block;
}
スライダーが読み込まれるまでは非表示、読み込まれてslick-initialized
が付与されたら表示する。
その2:opacity
プロパティを変える
.c-slick {
opacity: 0;
transition: opacity 0.3s;
}
.c-slick.slick-initialized {
opacity: 1;
}
display
ではなくopacity
プロパティを変える方法。display
の方は切り替えがはっきりしているのに対して、opacity
の方はtransition
プロパティと組み合わせることで滑らかな遷移になる。
スライダーエリアが一瞬空白にはなるが、見た目的には上手く誤魔化せ解消されていると思う。