スライドが流れ続ける無限スライダーをHTMLとCSSのみで作成する方法を徹底解説します!

はじめに

今回は過去の案件で作成した、無限スライダーについて紹介します。swiper.jsやslick.jsなどのスライダーのJavaScriptのライブラリを使用せずにhtmlとcssのみで作成する方法を徹底解説するのでご覧ください。

この記事でわかること
swiper.jsやslick.jsのスライダーのJavaScriptのライブラリを使用せずに無限スライダーを作成する方法

無限スライダーの表示

スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド

無限スライダーソースコード例

PR

<div class="infinite__list">
	<div class="infinite__item">
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
	</div>
	<div class="infinite__item">
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
		<div class="infinite__img">
			<img src="" alt="スライド" width="300" height="300">
		</div>
	</div>
</div>
.infinite__list {
    position: relative;
    overflow: hidden; /* はみ出ないように指定 */
}
.infinite__list::before { /* スライダー領域の高さを確保し、レスポンシブ対応をするために擬似要素を使用 */
    content: "";
    display: block;
}
.infinite__item {
    display: flex; /* 横一列に並べる */
    width: 100%;
    position: absolute; /* absoluteにしないと動かない */
    top: 0;
    left: 0;
}
.infinite__item:nth-of-type(1) {
    animation: infinity01 20s infinite linear;
}
.infinite__item:nth-of-type(2) {
    animation: infinity02 20s infinite linear;
}
.infinite__img {
    position: relative;
    margin-right: 3%;
    flex-shrink: 0; /* スライド幅が縮まないように指定 */
}
.infinite__img::before { /* 画像をレスポンシブ対応にするために擬似要素を使用 */
    content: "";
    display: block;
    padding-top: 100%; /* スライドの縦横比を1:1にする */
}
.infinite__img img {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}

@media screen and (min-width: 768px) {
    .infinite__list::before {
        padding-top: 30%;
    }
    .infinite__img {
        width: 30%;
    }
    @keyframes infinity01 {
        from {
            left: 0;
        }
        to {
            left: -297%;
        }
    }
    @keyframes infinity02 {
        from {
            left: 297%;
        }
        to {
            left: 0%;
        }
    }
}

@media screen and (max-width: 767px) {
    .infinite__list::before {
        padding-top: 45%;
    }
    .infinite__img {
        width: 45%;
    }
    @keyframes infinity01 {
        from {
            left: 0;
        }
        to {
            left: -432%;
        }
    }
    @keyframes infinity02 {
        from {
            left: 432%;
        }
        to {
            left: 0%;
        }
    }
}

無限スライダーの仕様

スライドが9枚
右から左に無限に流れ続ける
最後の1枚が流れると1枚目のスライドが流れてくる

ソースコード解説

9枚のスライド(.infinite__item)を2セット用意する必要がある

下記の表示のように9枚のスライドが1セットだけだと、最後のピンクのスライドが流れた時に、1枚目の赤色のスライドが流れてきません。

スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド
スライド

1セット目のスライドと2セット目のスライドに指定するanimationについて

20sは「animation-duration」

値が小さくなるほどスライドが流れるスピードが早くなります。適宜ご調整ください。

infinite

無限スライダーなのでinfiniteを指定します。animationプロパティにまとめずサブプロパティを仕様する場合は、「animation-iteration-count: infinite;」と指定します。

linear

linearは「animation-timing-function」の値です。スライドするスピードを一定にするために「linear」を指定する必要があります。

「animation-name」のinfinity01とinfinity02

下記は上記で紹介したCSSの一部を抜粋しています。

.infinite__img {
    position: relative;
    margin-right: 3%;
    flex-shrink: 0;
}
@media screen and (min-width: 768px) {
    .infinite__img {
        width: 30%;
    }
    @keyframes infinity01 {
        from {
            left: 0;
        }
        to {
            left: -297%; /* 297%という中途半端な数値についての解説は後述 */
        }
    }
    @keyframes infinity02 {
        from {
            left: 297%; /* 1セット目のスライドのtoのleftのマイナスを外した数値を指定 */
        }
        to {
            left: 0;
        }
    }
}

@media screen and (max-width: 767px) {
    .infinite__img {
        width: 45%;
    }
    @keyframes infinity01 {
        from {
            left: 0;
        }
        to {
            left: -432%; /* 432%という中途半端な数値についての解説は後述 */
        }
    }
    @keyframes infinity02 {
        from {
            left: 432%;
        }
        to {
            left: 0;
        }
    }
}
297%とか432%っていう中途半端な数値は何?
この中途半端な数値が大事です。
この数値が間違っていると、1枚目のスライドと9枚目のスライドの幅だけ広くなったり、2セット目のスライドの1枚目が、1セット目のスライドに重なったりして綺麗な無限スライダーではなくなります。
そうならないようにleftの数値を求める計算式を用意しました。
leftに入る数値
= スライド(.infinite__img)の幅 × スライドの枚数 + スライド(.infinite__img)間のmarginの値 × スライドの枚数 

上記公式に当てはめて計算します。

画面幅が768px以上の時
30% × 9 + 3% × 9 = 270% + 27% = 297%
画面幅が767px以下の時
45% × 9 + 3% × 9 = 405% + 27% = 432%

計算式で数値を求めることができたら、上記cssのように値を指定してください。

animationプロパティの使い方がいまいち分からない方や、うろ覚えの方は下記記事もご覧ください。

アニメーションcssについて

毎回忘れてしまうcssのanimationプロパティの指定の仕方・順番、サブプロパティについて動きを含めて紹介しています。

擬似要素のpadding-topでスライダー領域の高さを確保しレスポンシブ対応をする

.infinite__list {
    position: relative;
    overflow: hidden;
}
.infinite__list::before {
    content: "";
    display: block;
}
@media screen and (min-width: 768px) {
    .infinite__list::before {
        padding-top: 30%;
    }
    .infinite__img {
        width: 30%;
    }
}

@media screen and (max-width: 767px) {
    .infinite__list::before {
        padding-top: 45%;
    }
    .infinite__img {
        width: 45%;
    }
}

「.infinite__list」(スライダー領域)の子要素である「.infinite__item(9枚のスライドのセット)」には「position: absolute;」を指定しないとアニメーションが動きません。しかし、「position: absolute;」を指定すると、スライドの高さ分、下の要素が上にずれるため、下の要素と重なってしまいます。

なので、「.infinite__list」(スライダー領域)の高さを確保する必要があります。そこで、「.infinite__list」に「height」を指定すれば、下の要素と重なることはなくなりますが、画面幅によって下の要素との隙間が広くなったりします。

どの画面幅で見ても綺麗にスライダーが表示されるようにしたいですよね。

そこで擬似要素のpadding-topを使用すれば、スライダー領域の高さを確保し、かつ、レスポンシブ対応をすることが可能です。

なぜ「padding-top」の値が「30%」と「45%」なのか?
スライド幅と同じにしています。
なぜスライド幅と同じにしているかというとスライド画像の縦横比が「1:1」だからです。
以下の計算式で出すことが可能です。
擬似要素のpadding-topの値 = スライド幅 × (スライドの縦の長さの比 ÷ スライドの横の長さの比)
スライド画像の縦横比が1:1の時
30 × (1 ÷ 1) = 30%
スライド画像の縦横比が3:4の時
30 × (3 ÷ 4) = 22.5%
スライド画像の縦横比が9:16の時
30 × (9 ÷ 16) = 16.875%
スライド幅は30%とする

まとめ

今回の解説を読んでいただければ、HTML、CSSのみで無限スライダーが作成することができます。たとえ当記事で紹介したスライドの枚数でなくても、スライド画像の縦横比が変わったとしても無限スライダーを作成することが可能です。ぜひ参考にしてください。

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

ソースコードまとめ

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

>お問い合わせはこちら

お問い合わせはこちら