基本のカルーセルを作る方法【HTML/CSS/JavaScript・サンプルコード付き】

カルーセル

基本のカルーセルを作る方法

Webサイトで商品や記事、画像などの複数コンテンツを横並びにして見せたい場合は、カルーセルを使うと限られたスペースを有効に活用できます。この記事では、HTML・CSS・JavaScriptを使って、複数のカードを同時に表示しながら左右へ1枚ずつ送れる基本のカルーセルを作ります。左右の操作ボタンにはSVGアイコンを使用し、現在の表示位置が分かるドットも配置します。

パソコンでは5枚のカードのうち3枚を同時に表示し、左右のボタンをクリックすると横に並んだカードを1枚分ずつ移動できます。ドットをクリックして表示位置を直接変更することもでき、最初と最後ではそれ以上移動しないようにボタンを無効化します。商品一覧や関連記事、サービス紹介など、複数のコンテンツを横方向にまとめて見せたい場面に利用できます。

HTMLではカルーセルと各カード、操作ボタン、ドットを配置し、CSSでは複数カードの横並びや表示領域、ボタンなどのデザインを設定します。JavaScriptでは表示する位置を管理し、カードの幅と間隔に合わせてカルーセルを移動させます。画面幅640px以下ではカードを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="basic-carousel_wrap">

    <!-- タイトル -->
    <div class="basic-carousel_title">
      基本のカルーセル
    </div>

    <!-- 説明文 -->
    <p class="basic-carousel_text">
      複数のカードを横に並べ、左右のボタンまたはドットで1枚ずつ送れます。
    </p>

    <!-- カルーセルの操作エリア -->
    <div class="basic-carousel_area">

      <!-- 前のカードを表示するボタン -->
      <button
        class="basic-carousel_button basic-carousel_prev"
        type="button"
        aria-label="前のカードを表示">

        <!-- 左矢印 -->
        <svg viewBox="0 0 24 24" aria-hidden="true">
          <path d="M15 18 9 12l6-6"></path>
        </svg>

      </button>

      <!-- カードの表示領域 -->
      <div class="basic-carousel_view">

        <!-- 横方向へ移動するカード一覧 -->
        <div class="basic-carousel_track">

          <!-- 1枚目のカード -->
          <div class="basic-carousel_card">

            <div class="basic-carousel_card-title">
              HTML
            </div>

            <p class="basic-carousel_card-text">
              HTMLでカルーセル全体と表示するカードを配置します。
            </p>

          </div>

          <!-- 2枚目のカード -->
          <div class="basic-carousel_card">

            <div class="basic-carousel_card-title">
              CSS
            </div>

            <p class="basic-carousel_card-text">
              CSSでカードを横並びにしてデザインを設定します。
            </p>

          </div>

          <!-- 3枚目のカード -->
          <div class="basic-carousel_card">

            <div class="basic-carousel_card-title">
              JavaScript
            </div>

            <p class="basic-carousel_card-text">
              JavaScriptでカードを1枚ずつ横方向へ移動します。
            </p>

          </div>

          <!-- 4枚目のカード -->
          <div class="basic-carousel_card">

            <div class="basic-carousel_card-title">
              PHP
            </div>

            <p class="basic-carousel_card-text">
              カードとして表示するコンテンツを自由に変更できます。
            </p>

          </div>

          <!-- 5枚目のカード -->
          <div class="basic-carousel_card">

            <div class="basic-carousel_card-title">
              WordPress
            </div>

            <p class="basic-carousel_card-text">
              記事や商品などを並べるカルーセルにも利用できます。
            </p>

          </div>

        </div>

      </div>

      <!-- 次のカードを表示するボタン -->
      <button
        class="basic-carousel_button basic-carousel_next"
        type="button"
        aria-label="次のカードを表示">

        <!-- 右矢印 -->
        <svg viewBox="0 0 24 24" aria-hidden="true">
          <path d="m9 18 6-6-6-6"></path>
        </svg>

      </button>

    </div>

    <!-- 表示位置を切り替えるドット -->
    <div class="basic-carousel_dots">

      <button
        class="basic-carousel_dot is-active"
        type="button"
        aria-label="1番目の位置を表示">
      </button>

      <button
        class="basic-carousel_dot"
        type="button"
        aria-label="2番目の位置を表示">
      </button>

      <button
        class="basic-carousel_dot"
        type="button"
        aria-label="3番目の位置を表示">
      </button>

    </div>

  </div>

  <!-- JavaScriptファイル -->
  <script src="script.js"></script>

</body>
</html>
コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
A

Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。

InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。

ファイル構成と設置方法

このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLでは5枚のカード、左右の操作ボタン、表示位置を切り替える3つのドットを配置します。CSSでは複数のカードを横並びにし、PCでは3枚を同時表示、画面幅640px以下では1枚表示へ切り替えます。JavaScriptでは左右のボタンやドットの操作に合わせてカード一覧を横方向へ移動し、現在位置に応じて操作ボタンとドットの状態を更新します。

sample/
├── index.html
├── style.css
└── script.js

各ファイルの役割
index.htmlはカルーセル全体を構成するファイルです。タイトル、説明文、5枚のカード、左右の操作ボタン、3つのドットを配置しています。カードのタイトルや本文を変更すると、カルーセルに表示する内容を用途に合わせて編集できます。左右の操作ボタンにはSVGの矢印を使用しています。

style.cssはカルーセルのレイアウトとデザインを設定するファイルです。カルーセル全体の横幅や余白、カードの表示枚数、カード間隔、背景色、枠線、角丸、操作ボタン、SVG、ドット、カードが移動する時間などを変更できます。

script.jsはカルーセルを操作するファイルです。左右のボタンをクリックしたときにカードを1枚分ずつ移動し、ドットをクリックしたときは対応する位置へ移動します。また、最初と最後の位置では移動できない方向のボタンを無効にし、画面幅が変わったときは表示枚数と現在位置を再計算します。

設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。index.htmlからstyle.cssとscript.jsを読み込むため、追加のライブラリや外部サービスを用意する必要はありません。

PCでは5枚のカードのうち3枚が同時に表示されます。右側のボタンをクリックするとカードが1枚分ずつ横へ移動し、左側のボタンをクリックすると前の位置へ戻ります。下部のドットをクリックすると対応する位置へ直接移動できます。最初の位置では左ボタン、最後の位置では右ボタンが無効になります。

カスタマイズできる内容
index.htmlでは「基本のカルーセル」のタイトル、説明文、各カードのタイトルと本文を変更できます。商品、関連記事、サービス紹介など、複数の項目を横並びで見せる内容へ置き換えて利用できます。左右の操作ボタンに使用しているSVGは、各pathのd属性を変更すると別の矢印形状へ変更できます。

style.cssではカルーセル全体の最大横幅、余白、背景色、枠線、角丸、カードの大きさと間隔、操作ボタンの大きさと色、SVGの大きさと線の太さ、ドットの大きさと間隔、カードの移動時間を変更できます。PCの表示枚数を変更する場合は、.basic-carousel_cardの横幅計算とscript.jsの表示枚数を同じ枚数になるように変更してください。

数値調整
style.css
padding:40px 20px;
ページ全体の内側余白です。上下の40pxを大きくすると上下の余白が広がり、左右の20pxを大きくすると画面端との間隔が広がります。

max-width:900px;
カルーセル全体の最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。

margin:40px auto;
カルーセル全体の上下余白です。40pxを大きくすると上下の間隔が広がり、小さくすると狭くなります。

padding:32px;
カルーセル全体の内側余白です。値を大きくすると内容と外枠の間隔が広がり、小さくすると狭くなります。

border:1px solid #dbe4f3;
カルーセル全体の枠線です。1pxを大きくすると枠線が太くなります。

border-radius:20px;
カルーセル全体の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。

margin:0 0 12px;
カルーセルのタイトル下側の余白です。12pxを大きくすると説明文との間隔が広がり、小さくすると狭くなります。

font-size:22px;
カルーセルのタイトル文字サイズです。値を大きくすると文字が大きくなり、小さくすると小さくなります。

font-weight:700;
カルーセルのタイトルの太さです。値を大きくすると太くなり、小さくすると細くなります。

line-height:1.5;
カルーセルのタイトルの行の高さです。値を大きくすると行間が広がり、小さくすると狭くなります。

margin:0 0 28px;
説明文の下側余白です。28pxを大きくするとカルーセルとの間隔が広がり、小さくすると狭くなります。

font-size:16px;
説明文の文字サイズです。値を大きくすると文字が大きくなり、小さくすると小さくなります。

line-height:1.8;
説明文の行間です。値を大きくすると行間が広がり、小さくすると詰まった表示になります。

gap:18px;
左右の操作ボタンとカード表示領域の間隔です。値を大きくすると間隔が広がり、小さくすると近くなります。

width:48px;・height:48px;
左右の操作ボタンの大きさです。値を大きくするとボタンが大きくなり、小さくすると小さくなります。

border-radius:50%;
操作ボタンを円形にする値です。50%で円形になり、値を小さくすると角の丸みが弱くなります。

width:24px;・height:24px;
操作ボタン内に表示するSVGの大きさです。値を大きくすると矢印が大きくなり、小さくすると小さくなります。

stroke-width:2;
SVG矢印の線の太さです。値を大きくすると線が太くなり、小さくすると細くなります。

gap:16px;
PC表示でのカード同士の間隔です。値を大きくするとカード間が広がり、小さくすると狭くなります。

transition:transform .3s ease;
カードが横へ移動するときの時間です。0.3秒で移動します。値を大きくするとゆっくり、小さくすると速く移動します。

flex:0 0 calc((100% - 32px) / 3);
PCで3枚のカードを同時表示するための横幅です。32pxは16pxのカード間隔2か所分で、3は表示するカード枚数です。表示枚数を変更する場合は、カード間隔の合計とscript.js側の表示枚数も合わせて変更してください。

padding:28px 22px;
カードの内側余白です。上下の28pxを大きくするとカードが縦方向に広がり、左右の22pxを大きくすると文章と枠線の間隔が広がります。

border:1px solid #dbe4f3;
カードの枠線です。1pxを大きくすると枠線が太くなります。

border-radius:16px;
カードの角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。

margin:0 0 12px;
カードタイトルの下側余白です。12pxを大きくすると本文との間隔が広がり、小さくすると狭くなります。

font-size:22px;
カードタイトルの文字サイズです。値を大きくすると文字が大きくなり、小さくすると小さくなります。

font-weight:700;
カードタイトルの文字の太さです。値を大きくすると太くなり、小さくすると細くなります。

line-height:1.5;
カードタイトルの行の高さです。値を大きくすると行間が広がります。

font-size:15px;
カード本文の文字サイズです。値を大きくすると文字が大きくなり、小さくすると小さくなります。

line-height:1.8;
カード本文の行間です。値を大きくすると行間が広がり、小さくすると狭くなります。

gap:10px;
ドット同士の間隔です。値を大きくするとドット間が広がり、小さくすると狭くなります。

margin-top:24px;
ドットとカルーセルの間の余白です。値を大きくすると間隔が広がり、小さくすると狭くなります。

width:12px;・height:12px;
ドットの大きさです。値を大きくするとドットが大きくなり、小さくすると小さくなります。

border-radius:50%;
ドットを円形にする値です。50%で円形になり、値を小さくすると角の丸みが弱くなります。

script.js
let basicCarouselIndex=0;
カルーセルを最初の位置から表示するための値です。0が最初の位置を表し、1増えるごとにカードを1枚分送ります。

window.innerWidth<=640
1枚表示へ切り替える画面幅です。640を大きくすると、より広い画面でも1枚表示へ切り替わります。

return 1;
画面幅640px以下で同時表示するカード枚数です。現在は1枚に設定しています。

return 3;
画面幅641px以上で同時表示するカード枚数です。現在は3枚に設定しています。変更する場合はstyle.cssのカード横幅計算も同じ表示枚数へ変更してください。

parseFloat(trackStyle.columnGap) || 0
CSSからカード間隔を取得できなかった場合に使用する値です。0は間隔なしとして計算することを表します。

レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-width:900pxにより、カルーセル全体が画面幅に合わせて縮小されます。画面幅640px以下では、ページ全体の余白をpadding:24px 12px;、カルーセル全体の余白をpadding:24px 18px;、操作ボタンと表示領域の間隔をgap:8px;へ変更します。

さらに640px以下では、操作ボタンを42px四方、SVGを22px四方、カード間隔を12px、カードの内側余白を26px 22pxへ変更します。カードはflex:0 0 100%;として1枚表示に切り替え、script.jsでも640px以下では表示枚数を1枚として計算します。画面幅が変更された場合はJavaScriptで表示位置を再計算するため、スマートフォン・タブレット・PCで利用できます。


こちらもおすすめ


コメント