アコーディオン内にアコーディオンを表示する方法【HTML/CSS/JavaScript・サンプルコード付き】

アコーディオン

アコーディオン内にアコーディオンを表示する方法

アコーディオン内にアコーディオンを表示する方法を紹介します。このサンプルでは、外側のアコーディオンを開くと、その中にさらに別のアコーディオンが表示される入れ子構造を作成します。外側と内側をそれぞれ個別に開閉できるため、情報を段階的に整理しながら表示できます。

FAQ、サービス案内、料金説明、会員サイトのヘルプ、管理画面の設定項目など、1つの大きな項目の中にさらに細かな情報をまとめたい場面に利用できます。たとえば「サービスについて」を開いたあと、その中にある「サービス内容」や「利用方法」をさらに開いて確認できます。必要な情報だけを順番に表示できるため、内容が多いページでも整理しやすくなります。

HTMLでは外側と内側の見出しや本文を変更でき、CSSでは全体の横幅、余白、背景色、枠線、角丸、内側アコーディオンの余白などを調整できます。JavaScriptではすべてのアコーディオンボタンへクリック処理を設定し、対象となる項目ごとに開閉状態を切り替えます。スマートフォン・タブレット・PCでも利用できるよう、画面幅に応じて余白を調整しています。

コードについて 本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。

デモ

アコーディオン内にアコーディオンを表示

外側のアコーディオンを開くと、その中にあるアコーディオンをさらに開閉できます。

サービスに関する情報を確認できます。

提供しているサービスの詳しい内容を表示します。

サービスを利用するための方法を表示します。

料金に関する情報を確認できます。

基本となる料金についての詳細を表示します。

追加で発生する料金についての詳細を表示します。

外側の見出しをクリックして開いたあと、内側に表示された見出しをクリックすると、さらに詳細を開閉できます。

コードをコピーして使おう!

<!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="nested-accordion_wrap">

    <!-- タイトル -->
    <div class="nested-accordion_title">
      アコーディオン内にアコーディオンを表示
    </div>

    <!-- 説明文 -->
    <p class="nested-accordion_text">
      外側のアコーディオンを開くと、その中にあるアコーディオンをさらに開閉できます。
    </p>

    <!-- 外側のアコーディオン項目 -->
    <div class="nested-accordion_item">

      <!-- 外側の開閉ボタン -->
      <button class="nested-accordion_button" type="button">
        サービスについて
      </button>

      <!-- 外側の内容 -->
      <div class="nested-accordion_content">

        <p>
          サービスに関する情報を確認できます。
        </p>

        <!-- 内側のアコーディオン -->
        <div class="nested-accordion_inner">

          <!-- 内側のアコーディオン項目 -->
          <div class="nested-accordion_item">

            <!-- 内側の開閉ボタン -->
            <button class="nested-accordion_button" type="button">
              サービス内容
            </button>

            <!-- 内側の内容 -->
            <div class="nested-accordion_content">
              <p>
                提供しているサービスの詳しい内容を表示します。
              </p>
            </div>

          </div>

          <!-- 内側のアコーディオン項目 -->
          <div class="nested-accordion_item">

            <!-- 内側の開閉ボタン -->
            <button class="nested-accordion_button" type="button">
              利用方法
            </button>

            <!-- 内側の内容 -->
            <div class="nested-accordion_content">
              <p>
                サービスを利用するための方法を表示します。
              </p>
            </div>

          </div>

        </div>

      </div>

    </div>

    <!-- 外側のアコーディオン項目 -->
    <div class="nested-accordion_item">

      <!-- 外側の開閉ボタン -->
      <button class="nested-accordion_button" type="button">
        料金について
      </button>

      <!-- 外側の内容 -->
      <div class="nested-accordion_content">

        <p>
          料金に関する情報を確認できます。
        </p>

        <!-- 内側のアコーディオン -->
        <div class="nested-accordion_inner">

          <!-- 内側のアコーディオン項目 -->
          <div class="nested-accordion_item">

            <!-- 内側の開閉ボタン -->
            <button class="nested-accordion_button" type="button">
              基本料金
            </button>

            <!-- 内側の内容 -->
            <div class="nested-accordion_content">
              <p>
                基本となる料金についての詳細を表示します。
              </p>
            </div>

          </div>

          <!-- 内側のアコーディオン項目 -->
          <div class="nested-accordion_item">

            <!-- 内側の開閉ボタン -->
            <button class="nested-accordion_button" type="button">
              追加料金
            </button>

            <!-- 内側の内容 -->
            <div class="nested-accordion_content">
              <p>
                追加で発生する料金についての詳細を表示します。
              </p>
            </div>

          </div>

        </div>

      </div>

    </div>

  </div>

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

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

ファイル構成と設置方法

このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLでは外側のアコーディオンと、その内容の中へ配置する内側のアコーディオンを作成します。CSSでは外側と内側それぞれの余白、枠線、角丸、背景色、開閉ボタンの見た目などを設定し、JavaScriptではクリックした項目ごとに開閉状態を切り替えます。

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

各ファイルの役割
index.htmlは入れ子になったアコーディオン全体を構成するファイルです。外側の「サービスについて」「料金について」といった見出しや本文、その中へ配置する「サービス内容」「利用方法」「基本料金」「追加料金」などの内側アコーディオンを変更できます。内側の項目を追加・削除する場合も、このファイルを編集します。

style.cssは外側と内側のアコーディオンのデザインを設定するファイルです。全体の最大横幅、余白、背景色、枠線、角丸、開閉ボタンの余白、内側アコーディオンの背景色や間隔などを変更できます。.nested-accordion_innerによって、外側の内容の中にあるアコーディオンを見分けやすいように表示しています。

script.jsは外側と内側のアコーディオンを開閉するファイルです。すべての.nested-accordion_buttonへクリック処理を設定し、クリックしたボタンを含む項目へis-openクラスを付け外しします。外側と内側の項目はそれぞれ独立して開閉できます。

設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを同じ階層で配置します。3つのファイルを保存したあと、sample/index.htmlをブラウザで開いてください。まず「サービスについて」または「料金について」をクリックすると外側の内容が表示され、その中に内側のアコーディオンが表示されます。

内側に表示された「サービス内容」「利用方法」「基本料金」「追加料金」などをクリックすると、さらにその項目の詳細を開閉できます。外側の見出しをもう一度クリックすると、その項目全体を閉じられます。

カスタマイズできる内容
index.htmlでは全体タイトル、説明文、外側のアコーディオン見出しと本文、内側のアコーディオン見出しと本文を変更できます。サービス案内、FAQ、料金説明、設定項目など、1つの大きな分類の中へさらに細かな項目を配置したい場合に内容を置き換えて利用できます。

style.cssではアコーディオン全体の最大横幅、余白、背景色、枠線、角丸、外側と内側の項目間隔、ボタンの内側余白、文字色などを変更できます。内側のアコーディオンは.nested-accordion_innerの余白や背景色を変更することで、外側との見た目の違いを調整できます。

数値調整
style.css
max-width:700px;
アコーディオン全体の最大横幅です。値を大きくすると全体が横に広がり、小さくするとコンパクトになります。

margin:40px auto;
アコーディオン全体の上下余白です。40pxを大きくすると上下の間隔が広がり、小さくすると狭くなります。

padding:32px;
アコーディオン全体の内側余白です。値を大きくすると内容と外枠の間隔が広がります。

border-radius:18px;
アコーディオン全体の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。

font-size:22px;
全体タイトルの文字サイズです。値を大きくするとタイトルが大きくなります。

margin:0 0 24px;
説明文の下側余白です。24pxを大きくすると最初のアコーディオンとの間隔が広がります。

margin-bottom:12px;
外側のアコーディオン項目同士の間隔です。値を大きくすると項目同士が離れます。

border-radius:12px;
各アコーディオン項目の角丸です。値を大きくすると丸みが強くなります。

padding:16px 18px;
外側の開閉ボタンの内側余白です。上下16px・左右18pxを変更するとボタンの大きさや文字との間隔が変わります。

margin-left:16px;
見出し文字と「+」「-」記号の間隔です。値を大きくすると記号との距離が広がります。

padding:0 18px 18px;
外側のアコーディオン内容の余白です。左右と下側の値を変更すると、本文と枠線との間隔が変わります。

margin-top:16px;
外側の本文と内側アコーディオンとの間隔です。値を大きくすると上下の距離が広がります。

padding:16px;
内側アコーディオン全体の内側余白です。値を大きくすると内側項目と背景の端との間隔が広がります。

border-radius:10px;
内側アコーディオンエリアの角丸です。値を大きくすると丸みが強くなります。

margin-bottom:10px;
内側のアコーディオン項目同士の間隔です。値を大きくすると項目同士が離れます。

padding:14px 16px;
内側の開閉ボタンの余白です。上下14px・左右16pxを変更すると、内側ボタンの大きさが変わります。

レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%max-width:700pxによって、アコーディオン全体が画面幅に合わせて縮小されます。また、画面幅640px以下では全体の余白をpadding:24px 18px;、内側アコーディオンの余白をpadding:12px;へ変更しています。スマートフォン・タブレット・PCで利用できます。


こちらもおすすめ


コメント