3枚の画像が順番に切り替わっていくメインビジュアルをSlick.jsで作成!ソースコードも紹介!

はじめに

今回は実務経験で作成した、3枚の画像が順番に切り替わっていくメインビジュアルについてご紹介します。まずはどのような表示になっているかをご確認ください。

3枚の画像が順番に切り替わっていくメインビジュアルの表示

スライダー1
スライダー2
スライダー3
スライダー1
スライダー2
スライダー3
スライダー1
スライダー2
スライダー3

3枚の画像が順番に切り替わっていくメインビジュアルのソースコード例

PR

<div class="slider">
	<div class="slider-wrapper">
		<div id="js-slider1" class="slider__list">
			<div class="slider__img">
				<img src="#" alt="スライダー1">
			</div>
			<div class="slider__img">
				<img src="#" alt="スライダー2">
			</div>
			<div class="slider__img">
				<img src="#" alt="スライダー3">
			</div>
		</div>
		<div id="js-slider2" class="slider__list">
			<div class="slider__img">
				<img src="#" alt="スライダー1">
			</div>
			<div class="slider__img">
				<img src="#" alt="スライダー2">
			</div>
			<div class="slider__img">
				<img src="#" alt="スライダー3">
			</div>
		</div>
		<div id="js-slider3" class="slider__list">
			<div class="slider__img">
				<img src="#" alt="スライダー1">
			</div>
			<div class="slider__img">
				<img src="#" alt="スライダー2">
			</div>
			<div class="slider__img">
				<img src="#" alt="スライダー3">
			</div>
		</div>
	</div>
</div>
.slider {
    width: 100%;
    height: 60vw;
    max-height: 450px;
    position: relative;
    margin: 0 auto;
    text-align: center;
    overflow: hidden;
}
.slider-wrapper {
    position: absolute;
    left: 50%;
    top: 0;
    width: 4000px;
    margin-left: -2000px;
    font-size: 0;
    opacity: 1;
    transition: all 1s cubic-bezier(.25, .46, .45, .94);
}
.slider__list {
    display: inline-block;
    width: 75vw;
    margin-left: 5px;
    margin-right: 5px;
}
.slider__img {
    position: relative;
    float: left;
}
.slider__img::before {
    content: "";
    display: block;
    padding-top: 75%;
}
.slider__img img {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}
function threeFadeSlider(selector, slideDelay, initialSlide) {
    // 説明1
    jQuery(selector).on('init', function () {
        // 説明2
        const jQueryself = jQuery(this);
        setTimeout(function () {
            jQueryself.slick('slickSetOption', 'autoplay', true, true);
        }, slideDelay);
    });
    // 説明3
    jQuery(selector).slick({
        arrow: false,
        autoplay: true,
        autoplaySpeed: 3000,
        fade: true,
        prevArrow: false,
        nextArrow: false,
        pauseOnFocus: false,
        pauseOnHover: false,
        pauseOnDotsHover: false,
        speed: 1000,
        initialSlide: initialSlide,
    });
}
// 説明4
threeFadeSlider('#js-slider1', 2000, 2);
threeFadeSlider('#js-slider2', 1000, 0);
threeFadeSlider('#js-slider3', 0, 1);

3枚の画像が順番に切り替わっていくメインビジュアルのソースコードの解説

HTMLの説明

slickを適用させるスライダー(.slick__list)が3つあります。中身は全く同じものが3つです。ただそれぞれ違う動きにしたいので各.slick__listに対してid名をつけています。それぞれ「js-slider1」「js-slider2」「js-slider3」とid名をつけました。

CSSの説明

画像の比率は縦と横3:4で作成しました。.slider__img::beforeのpadding-top: 75%で縦横3:4(3÷4=0.75)になっています。

jQueryの説明

説明1

スライダーが初期化されてから、何秒後に自動再生したいかを記述しています。

説明2

「const jQueryself = jQuery(this);」をsetTimeout関数の外で宣言する必要があります。jQuery(this)は長い文字列ではないので、わざわざ変数宣言する必要はないと考えることもできます。しかし、setTimeout関数の外で宣言をせずに「jQuery(this).Slick( … )」とすると下記エラーが発生します。

Uncaught TypeError: Cannot read properties of undefined (reading ‘slickSetOption’)
setTimeout関数内ではthisが期待通りに機能しないため、一度変数宣言してから使用することでエラーを回避しています。

説明3

「fade:true」にしないと通常の横スライドになるのでtrueにします。

「initialSlide」では何枚目のスライドからにするのかを指定します。インデックス番号は0から始まるので、2枚目のスライドからにしたい場合は「initialSlide: 1」とします。

説明4

左の見切れスライダー(#js-slider1)の初期スライドは3枚目の緑のスライドで、2秒後に自動再生します。

真ん中のメインスライダー(#js-slider2)の初期スライドは1枚目の赤のスライドで、1秒後に自動再生します。

右の見切れスライダー(#js-slider3)の初期スライドは2枚目の青のスライドで、スライダーが初期化されてから遅れず自動再生します。

SlickのCDN

<script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>

当記事は2023年12月時点のものなので上記のcdnは古くなっている可能性があります。下記の公式もチェックしてください。また、今回のスライダーを作成するにあたって、slickのcssのcdnは使用していないため、必要な場合も下記からお願いします。

https://kenwheeler.github.io/slick/#go-get-it

他のHTMLCSS JavaScriptソースコード紹介記事まとめ

ソースコードまとめ

実務経験で作成したレイアウトのHTML・CSS ・JavaScriptソースコードを紹介した記事まとめています。

>お問い合わせはこちら

お問い合わせはこちら