無限ループする画像スライダーを作る方法
画像を途切れることなく繰り返し切り替えられる、無限ループ式の画像スライダーを作る方法を紹介します。このサンプルでは、1枚の画像を表示し、左右の操作ボタンをクリックすると前後の画像へ横方向にスライドします。最後の画像から次へ進んだ場合も1枚目へ自然につながり、1枚目から前へ戻った場合も最後の画像へ同じ方向の動きを保ったまま移動できます。
通常のスライダーのように端で操作を止める必要がなく、左右どちらの方向にも繰り返し画像を切り替えられるのが特徴です。画像の下には現在表示している位置を示すドットを配置し、ドットをクリックすると対応する画像へ直接切り替えられます。写真ギャラリーや商品画像、作品紹介など、複数の画像を連続して閲覧できるようにしたい場面に利用できます。
HTMLでは先頭と末尾に画像を複製して配置し、CSSでは画像の大きさや角丸、横方向のスライドアニメーション、左右ボタンやドットのデザインを設定します。JavaScriptでは現在位置を管理し、複製した画像まで移動したあとにアニメーションなしで対応する本来の画像位置へ移動することで、連続してスライドしているように見せます。画面幅640px以下では画像や操作ボタンのサイズを調整し、スマートフォン・タブレット・PCで利用できます。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
左右のボタンをクリックすると、画像が1枚ずつスライドしながら切り替わります。最後の画像から次へ進んだ場合も、1枚目の画像から前へ戻った場合も、逆方向へ戻ることなく同じ方向へスライドし続けます。下のドットから対応する画像を直接表示することもできます。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>無限ループする画像スライダー</title>
<!-- CSSファイル -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- 無限ループする画像スライダー -->
<div class="infinite-slider_slider">
<!-- 画像と左右ボタンを並べるエリア -->
<div class="infinite-slider_area">
<!-- 前の画像へ移動するボタン -->
<button class="infinite-slider_button infinite-slider_prev" type="button" aria-label="前の画像">
<!-- 左向きSVGアイコン -->
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M15 18l-6-6 6-6"></path>
</svg>
</button>
<!-- 画像の表示領域 -->
<div class="infinite-slider_view">
<!-- 横方向へ移動する画像一覧 -->
<div class="infinite-slider_track">
<!-- 無限ループ用に複製した3枚目の画像 -->
<div class="infinite-slider_slide">
<img src="images/image3.png" alt="3枚目の画像">
</div>
<!-- 1枚目の画像 -->
<div class="infinite-slider_slide">
<img src="images/image1.png" alt="1枚目の画像">
</div>
<!-- 2枚目の画像 -->
<div class="infinite-slider_slide">
<img src="images/image2.png" alt="2枚目の画像">
</div>
<!-- 3枚目の画像 -->
<div class="infinite-slider_slide">
<img src="images/image3.png" alt="3枚目の画像">
</div>
<!-- 無限ループ用に複製した1枚目の画像 -->
<div class="infinite-slider_slide">
<img src="images/image1.png" alt="1枚目の画像">
</div>
</div>
</div>
<!-- 次の画像へ移動するボタン -->
<button class="infinite-slider_button infinite-slider_next" type="button" aria-label="次の画像">
<!-- 右向きSVGアイコン -->
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M9 6l6 6-6 6"></path>
</svg>
</button>
</div>
<!-- 現在位置を表すドット -->
<div class="infinite-slider_dots">
<button class="infinite-slider_dot is-active" type="button" aria-label="1枚目の画像を表示">
</button>
<button class="infinite-slider_dot" type="button" aria-label="2枚目の画像を表示">
</button>
<button class="infinite-slider_dot" type="button" aria-label="3枚目の画像を表示">
</button>
</div>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLでは画像、左右の操作ボタン、SVGアイコン、現在位置を表すドットを配置し、CSSではスライダーの横幅、画像サイズ、角丸、操作ボタン、ドット、スライドアニメーションを設定します。JavaScriptでは現在の画像位置を管理し、先頭と末尾に配置した複製画像を利用して、左右どちらの方向にも途切れず繰り返し移動できる無限ループを実装します。表示する3枚の画像とimagesフォルダはZIPには含まれていないため、利用者自身で用意して配置してください。
sample/
├── index.html
├── style.css
├── script.js
└── images/
├── image1.png
├── image2.png
└── image3.png
各ファイルの役割
index.htmlは無限ループする画像スライダーのHTMLを構成するファイルです。3枚の画像、左右の操作ボタン、ボタン内のSVGアイコン、現在位置を表す3つのドットを配置しています。無限ループを実現するため、3枚目の画像を先頭へ、1枚目の画像を末尾へ複製して配置しています。
style.cssはスライダーのデザインを設定するファイルです。スライダー全体の最大横幅、画像の高さ、角丸、画像と左右ボタンの間隔、ボタンの大きさや色、SVGアイコンの大きさ、ドットの大きさや間隔、横方向へ移動するアニメーションなどを設定しています。
script.jsはスライダーの動作を制御するファイルです。現在の画像位置を管理し、左右のボタンによる前後移動、ドットによる画像の直接選択、スライド終了後の位置補正を行います。末尾に複製した1枚目または先頭に複製した3枚目まで移動すると、アニメーションを一時的に無効化して対応する本来の画像位置へ瞬時に移動することで、無限ループとして表示します。
imagesフォルダはスライダーで表示する画像を配置するフォルダです。image1.png、image2.png、image3.pngの3枚を使用します。imagesフォルダと画像ファイルはZIPには含まれていないため、利用者自身で用意してください。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。次にsampleフォルダ内へimagesフォルダを作成し、利用者自身で用意した3枚のPNG画像をimage1.png、image2.png、image3.pngというファイル名で配置してください。index.htmlからstyle.cssとscript.jsを読み込み、画像はimages/image1.pngからimages/image3.pngを参照する構成です。配置後にsample/index.htmlをブラウザで開くとスライダーを確認できます。左右のボタンでは前後の画像へ繰り返し移動でき、下のドットをクリックすると対応する画像へ直接切り替えられます。
カスタマイズできる内容
index.htmlでは表示する画像とalt属性を変更できます。別のファイル名や画像形式を使用する場合は、srcのimages/image1.pngなどを実際の画像ファイル名に合わせて変更してください。無限ループでは先頭と末尾に複製画像を配置しているため、画像を変更する場合は通常の3枚だけでなく、先頭の3枚目と末尾の1枚目の複製画像も同じ内容になるように変更します。左右ボタンのSVGはpathの内容を変更すると別の矢印形状へ変更できます。style.cssではスライダーの最大横幅、画像の高さ、角丸、ボタンのサイズや色、SVGアイコンのサイズ、ドットのサイズや色、各要素の間隔、スライド速度を変更できます。
数値調整
style.css
padding:40px 20px;
ページ全体の余白です。上下の40pxを大きくすると上下の余白が広がり、左右の20pxを大きくすると画面端との間隔が広がります。
max-width:760px;
スライダー全体の最大横幅です。値を大きくするとPCで横に広く表示され、小さくするとコンパクトになります。
gap:18px;
画像と左右の操作ボタンの間隔です。値を大きくするとボタンが画像から離れ、小さくすると近くなります。
width:52px;・height:52px;
左右の操作ボタンの大きさです。値を大きくするとボタンが大きくなり、小さくするとコンパクトになります。
transition:background-color .3s ease;
左右ボタンの背景色が切り替わる時間です。.3sを大きくするとゆっくり変化し、小さくすると速く変化します。
width:24px;・height:24px;
左右ボタン内のSVGアイコンの大きさです。値を大きくすると矢印が大きくなります。
stroke-width:2;
SVG矢印の線の太さです。値を大きくすると矢印が太くなり、小さくすると細くなります。
border-radius:18px;
画像表示領域と画像の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
transform:translateX(-100%);
初期表示位置です。先頭に配置した複製画像を飛ばし、本来の1枚目を表示するために1枚分移動しています。無限ループの位置管理に使用する値のため、画像構成を変更せずにこの100%だけを変更すると表示位置がずれるため注意してください。
transition:transform .3s ease;
画像が横方向へスライドする時間です。.3sを大きくするとゆっくり移動し、小さくすると速く移動します。
flex:0 0 100%;
1枚の画像が使用する横幅です。100%で画像表示領域と同じ横幅になり、常に1枚ずつ表示します。
height:360px;
PCで表示する画像の高さです。値を大きくすると画像が縦に高くなり、小さくすると低くなります。
gap:10px;
ドット同士の間隔です。値を大きくするとドット同士が離れ、小さくすると近くなります。
margin-top:24px;
スライダーとドットの間隔です。値を大きくすると上下の間隔が広がり、小さくすると狭くなります。
width:12px;・height:12px;
ドットの大きさです。値を大きくするとドットが大きくなり、小さくすると小さくなります。
transition:background-color .3s ease;
ドットの色が切り替わる時間です。.3sを大きくするとゆっくり変化し、小さくすると速く変化します。
@media(max-width:640px)
スマートフォン向けの表示へ切り替える画面幅です。640px以下になると、ページ余白、画像とボタンの間隔、ボタン、SVGアイコン、画像の高さを小さくします。
padding:24px 12px;
640px以下でのページ余白です。上下24px・左右12pxへ変更して、狭い画面でも表示領域を確保します。
gap:8px;
640px以下での画像と左右ボタンの間隔です。PCより間隔を狭くして横幅を確保します。
width:42px;・height:42px;
640px以下での左右ボタンの大きさです。PCより小さく表示します。
width:22px;・height:22px;
640px以下でのSVGアイコンの大きさです。ボタンサイズに合わせて小さく表示します。
height:220px;
640px以下での画像の高さです。値を大きくすると画像が縦に高くなり、小さくすると低くなります。
script.js
let infiniteSliderIndex=1;
初期表示位置です。先頭に無限ループ用の複製画像があるため、1を指定して本来の1枚目から開始します。
infiniteSliderIndex++;・infiniteSliderIndex--;
左右ボタンをクリックしたときに現在位置を1つずつ変更します。次へ進む場合は1増やし、前へ戻る場合は1減らします。
infiniteSliderIndex*100
1枚を100%として、現在の画像番号に応じた横方向の移動量を計算します。スライド1枚の横幅を100%としているため、この値と組み合わせて1枚ずつ移動します。
infiniteSliderSlides.length-1
末尾に配置した複製画像の位置を判定するために使用します。末尾の複製画像へ到達すると、本来の1枚目へアニメーションなしで戻します。
infiniteSliderSlides.length-2
先頭の複製画像まで戻ったとき、本来の最後の画像位置を求めるために使用します。
index+1
ドットの番号と、先頭に複製画像を1枚追加したスライド側の番号を合わせるための値です。クリックしたドットに1を加えて対応する本来の画像位置へ移動します。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-width:760pxによって、PCでは最大横幅を制限しながら、狭い画面では利用できる横幅に合わせてスライダーが縮小します。画像表示領域はflexレイアウトの残り幅を使用し、各画像はwidth:100%で表示されます。画面幅640px以下では、ページ余白を24px 12px、画像と左右ボタンの間隔を8px、操作ボタンを42px、SVGアイコンを22px、画像の高さを220pxへ変更しているため、スマートフォン・タブレット・PCで利用できます。
コメント