はじめに
今回は過去の案件で作成した、無限スライダーについて紹介します。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%;
}
}
}
無限スライダーの仕様
右から左に無限に流れ続ける
最後の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;
}
}
}
= スライド(.infinite__img)の幅 × スライドの枚数 + スライド(.infinite__img)間のmarginの値 × スライドの枚数
上記公式に当てはめて計算します。
30% × 9 + 3% × 9 = 270% + 27% = 297%
画面幅が767px以下の時
45% × 9 + 3% × 9 = 405% + 27% = 432%
計算式で数値を求めることができたら、上記cssのように値を指定してください。
animationプロパティの使い方がいまいち分からない方や、うろ覚えの方は下記記事もご覧ください。
毎回忘れてしまう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を使用すれば、スライダー領域の高さを確保し、かつ、レスポンシブ対応をすることが可能です。
30 × (1 ÷ 1) = 30%
スライド画像の縦横比が3:4の時
30 × (3 ÷ 4) = 22.5%
スライド画像の縦横比が9:16の時
30 × (9 ÷ 16) = 16.875%
スライド幅は30%とする
まとめ
今回の解説を読んでいただければ、HTML、CSSのみで無限スライダーが作成することができます。たとえ当記事で紹介したスライドの枚数でなくても、スライド画像の縦横比が変わったとしても無限スライダーを作成することが可能です。ぜひ参考にしてください。
他のHTML・CSS ・JavaScriptソースコード紹介記事まとめ
実務経験で作成したレイアウトのHTML・CSS ・JavaScriptソースコードを紹介した記事まとめています。