縦スクロールカルーセルを作る方法
HTML・CSS・JavaScriptを使って、複数の画像を縦方向へ切り替えて表示するカルーセルを作る方法を紹介します。このサンプルでは画像を上下方向に並べ、上ボタンと下ボタンをクリックすると表示位置が1つずつ移動する構成にしています。一般的な横方向のカルーセルとは異なり、縦長のスペースを利用して画像を順番に見せたい場合に使いやすいカルーセルです。
パソコンでは3枚の画像を同時に表示し、上下の操作ボタンから続きの画像へ移動できます。最初の位置では上ボタン、最後の位置では下ボタンが自動的に無効になるため、表示できる範囲を超えて移動することはありません。現在位置を示すドットも縦方向に配置し、ドットをクリックして対応する位置へ直接移動できます。
画面幅640px以下では表示枚数を1枚へ切り替え、スマートフォンでも画像を見やすい大きさで表示します。画像の縦横比、画像同士の間隔、ボタンやドットの大きさ、移動時間などはCSSから変更できます。商品画像、作品一覧、写真ギャラリーなど、複数の画像を縦方向へ切り替えて見せたいWebページで利用できるサンプルです。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
上下のボタンまたはドットから画像を切り替えられます。
上下のボタンをクリックすると画像が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="vertical-carousel_area">
<!-- 前の画像を表示するボタン -->
<button class="vertical-carousel_button vertical-carousel_prev" type="button" aria-label="前の画像を表示">
<!-- 上矢印 -->
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="m6 15 6-6 6 6"></path>
</svg>
</button>
<!-- 画像とドットを配置する部分 -->
<div class="vertical-carousel_content">
<!-- 画像の表示範囲 -->
<div class="vertical-carousel_view">
<!-- 縦方向へ移動する画像一覧 -->
<div class="vertical-carousel_track">
<!--
カルーセルで使用する画像は利用者自身で用意してください。
PNG画像をsample/images/へ配置し、
image1.png〜image5.pngを実際のファイル名へ変更できます。
-->
<!-- 1枚目の画像 -->
<div class="vertical-carousel_item">
<img class="vertical-carousel_image" src="images/image1.png" alt="1枚目の画像">
</div>
<!-- 2枚目の画像 -->
<div class="vertical-carousel_item">
<img class="vertical-carousel_image" src="images/image2.png" alt="2枚目の画像">
</div>
<!-- 3枚目の画像 -->
<div class="vertical-carousel_item">
<img class="vertical-carousel_image" src="images/image3.png" alt="3枚目の画像">
</div>
<!-- 4枚目の画像 -->
<div class="vertical-carousel_item">
<img class="vertical-carousel_image" src="images/image4.png" alt="4枚目の画像">
</div>
<!-- 5枚目の画像 -->
<div class="vertical-carousel_item">
<img class="vertical-carousel_image" src="images/image5.png" alt="5枚目の画像">
</div>
</div>
</div>
<!-- 現在位置を示すドット -->
<div class="vertical-carousel_dots">
<button class="vertical-carousel_dot is-active" type="button" aria-label="1番目の位置を表示"></button>
<button class="vertical-carousel_dot" type="button" aria-label="2番目の位置を表示"></button>
<button class="vertical-carousel_dot" type="button" aria-label="3番目の位置を表示"></button>
<button class="vertical-carousel_dot" type="button" aria-label="4番目の位置を表示"></button>
<button class="vertical-carousel_dot" type="button" aria-label="5番目の位置を表示"></button>
</div>
</div>
<!-- 次の画像を表示するボタン -->
<button class="vertical-carousel_button vertical-carousel_next" type="button" aria-label="次の画像を表示">
<!-- 下矢印 -->
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="m6 9 6 6 6-6"></path>
</svg>
</button>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。 サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptと5枚のPNG画像で構成されています。HTMLでは上下の操作ボタン、縦方向へ並べる5枚の画像、現在位置を選択できるドットを配置します。CSSでは画像を縦方向へ並べるレイアウト、表示領域の高さ、画像同士の間隔、上下ボタン、ドット、切り替えアニメーションなどを設定します。JavaScriptでは上下のボタンやドットを操作したときの移動処理を行い、画面幅に応じて同時に表示する画像数と移動できる位置を切り替えます。画像は利用者自身で用意し、sampleフォルダ内のimagesフォルダへ配置します。
sample/
├── index.html
├── style.css
├── script.js
└── images/
├── image1.png
├── image2.png
├── image3.png
├── image4.png
└── image5.png
各ファイルの役割
index.htmlは縦型カルーセルを構成するファイルです。前の位置へ戻る上ボタン、次の位置へ進む下ボタン、画像を配置する5つの項目、表示位置を直接選択するドットを記述しています。画像はimages/image1.pngからimages/image5.pngまでを参照します。画像のファイル名や代替テキストを変更する場合もindex.htmlを編集します。
style.cssは縦型カルーセルのレイアウトとデザインを設定するファイルです。画像を縦方向へ並べ、640pxより大きい画面では高さ660pxの表示領域へ3枚、640px以下では高さ280pxの表示領域へ1枚を表示します。上下の操作ボタン、画像同士の間隔、画像の角丸、ドット、画像が縦方向へ移動する時間などもこのファイルで設定します。
script.jsはカルーセルの移動を制御するファイルです。上下のボタンをクリックすると画像を1枚分ずつ縦方向へ移動し、ドットをクリックすると対応する位置へ直接移動します。最初と最後の位置では、それ以上移動できない方向のボタンを無効にします。また、画面幅に応じて同時表示数と移動可能な位置を計算し、画面幅が変更された場合にも表示位置を更新します。
imagesフォルダにはカルーセルで使用する画像を配置します。このサンプルではimage1.png、image2.png、image3.png、image4.png、image5.pngの5枚のPNG画像を使用します。画像ファイルは利用者自身で用意してください。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置し、同じsampleフォルダ内へimagesフォルダを作成します。利用者自身で用意した5枚のPNG画像をimage1.png、image2.png、image3.png、image4.png、image5.pngというファイル名でimagesフォルダへ配置してください。別のファイル名を使用する場合は、index.htmlの各img要素にあるsrcを実際の画像パスへ変更します。
すべてのファイルと画像を配置したあと、sample/index.htmlをブラウザで開きます。index.htmlから同じ階層のstyle.cssとscript.jsを読み込み、imagesフォルダ内の画像を表示します。上ボタンをクリックすると前の位置、下ボタンをクリックすると次の位置へ画像が1枚分ずつ縦方向に移動します。ドットをクリックすると、対応する表示位置へ直接切り替えられます。
カスタマイズできる内容
index.htmlではカルーセルに表示する画像を変更できます。各img要素のsrcを使用する画像のパスへ変更し、altも画像の内容に合わせて変更してください。画像を追加または削除する場合は、vertical-carousel_itemを必要な数に変更し、移動できる位置に合わせてvertical-carousel_dotも調整します。
style.cssでは上下の操作ボタンの大きさや色、画像表示領域の高さ、画像同士の間隔、画像の角丸、ドットの大きさ・色・間隔、画像が縦方向へ移動する時間などを変更できます。画像にはobject-fit:cover;を指定しているため、各画像項目の表示領域を埋めるように表示されます。元画像の縦横比によっては、上下または左右の一部が切り取られます。
640pxより大きい画面では3枚、640px以下では1枚を同時表示する構成です。表示枚数を変更する場合は、style.cssの表示領域の高さと各画像項目の高さだけでなく、script.jsで使用している同時表示数の計算も合わせて変更する必要があります。
数値調整
style.css
width:100%;
カルーセル本体の横幅です。100%では設置した親要素の横幅いっぱいに表示されます。
gap:18px;
上下の操作ボタンと画像表示部分の間隔です。値を大きくすると間隔が広がり、小さくすると狭くなります。
width:48px;・height:48px;
上下の操作ボタンの横幅と高さです。値を大きくするとボタンが大きくなり、小さくすると小さくなります。
padding:0;
上下の操作ボタンに追加する内側余白です。0ではブラウザ標準の内側余白を付けません。値を大きくするとボタン内部の余白が増えます。
border-radius:50%;
上下の操作ボタンの角丸です。横幅と高さが同じ状態で50%を指定することで円形になります。値を小さくすると丸みが弱くなります。
width:24px;・height:24px;
上下の操作ボタン内に表示するSVG矢印の横幅と高さです。値を大きくすると矢印が大きくなり、小さくすると小さくなります。
stroke-width:2;
SVG矢印の線の太さです。値を大きくすると線が太くなり、小さくすると細くなります。
gap:16px;
640pxより大きい画面で使用する画像同士の間隔です。値を大きくすると画像間の余白が広がり、小さくすると狭くなります。
height:660px;
640pxより大きい画面で使用する画像表示領域の高さです。値を大きくすると表示領域が縦方向へ高くなり、小さくすると低くなります。
transition:transform .3s ease;
画像が次の位置へ移動する時間です。0.3秒で縦方向へ移動します。値を大きくするとゆっくり移動し、小さくすると速く移動します。
flex:0 0 calc((660px - 32px) / 3);
640pxより大きい画面で3枚の画像を同時表示するための1枚分の高さです。660pxの表示領域から16pxの画像間隔2か所分となる32pxを除き、3等分しています。表示領域の高さ、画像同士の間隔、表示枚数を変更する場合は、この計算式も合わせて調整します。
border-radius:16px;
各画像の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
gap:10px;
ドット同士の間隔です。値を大きくするとドット同士が離れ、小さくすると近くなります。
width:12px;・height:12px;
各ドットの横幅と高さです。値を大きくするとドットが大きくなり、小さくすると小さくなります。
padding:0;
ドットに追加する内側余白です。0ではブラウザ標準の内側余白を付けません。値を大きくするとドット内部の余白が増えます。
border-radius:50%;
ドットの角丸です。横幅と高さが同じ状態で50%を指定することで円形になります。値を小さくすると丸みが弱くなります。
@media (max-width:640px)
1枚表示へ切り替える基準となる画面幅です。640px以下になると、上下の操作ボタンと画像表示部分の間隔、ボタンサイズ、SVG矢印のサイズ、画像とドットの間隔、画像表示領域の高さ、各画像の高さを変更します。
gap:12px;
640px以下で使用する上下の操作ボタンと画像表示部分の間隔、および画像とドットの間隔です。値を大きくすると間隔が広がり、小さくすると狭くなります。
42px
640px以下で使用する上下の操作ボタンの横幅と高さです。PC表示の48pxより小さくします。
22px
640px以下で使用するSVG矢印の横幅と高さです。PC表示の24pxより小さくします。
height:280px;
640px以下で使用する画像表示領域の高さです。値を大きくすると表示領域が高くなり、小さくすると低くなります。
flex:0 0 280px;
640px以下で使用する画像1枚分の高さです。画像表示領域と同じ280pxにすることで、1枚の画像を表示します。
script.js
window.innerWidth<=640
同時表示する画像数を切り替える基準です。画面幅が640px以下の場合は1枚、それより大きい場合は3枚を同時表示する前提で移動位置を計算します。style.cssの@media (max-width:640px)と同じ基準値を使用しています。
1・3
画面幅に応じた同時表示数です。640px以下では1枚、それより大きい画面では3枚を使用します。表示枚数を変更する場合は、style.cssの画像表示領域と各画像項目の高さも合わせて変更します。
レスポンシブ対応
このサンプルはレスポンシブ対応です。640pxより大きい画面では画像表示領域をheight:660px;とし、各画像項目をflex:0 0 calc((660px - 32px) / 3);にすることで3枚を同時表示します。画像同士には16pxの間隔を設け、上下の操作ボタンまたはドットから表示位置を縦方向へ切り替えられます。
画面幅640px以下では@media (max-width:640px)を使用し、画像表示領域を280px、各画像の高さも280pxへ変更して1枚表示に切り替えます。上下の操作ボタンと画像表示部分の間隔は12px、ボタンは42px、SVG矢印は22pxへ縮小します。script.jsでもwindow.innerWidth<=640を使用して同じ画面幅を基準に表示枚数を1枚または3枚へ切り替え、画面幅が変更された場合には移動できる位置と現在位置を再計算します。これにより、スマートフォン・タブレット・PCの画面幅に合わせて利用できます。
コメント