コピペで完結!アコーディオン#03【複数同時オープン対応】

html/css/js

【複数同時オープン対応】いくつでも開けるタイプ

こちらは複数のアコーディオン項目を同時に開けるタイプです。
「FAQ」や「Q&A」など、関連情報を並べて確認したい時に最適です。
JavaScriptで高さを制御し、スムーズなスライド表示と矢印アイコンの回転アニメーションを実現しています。

コードについて 本記事のコードは AI(ChatGPT)による生成をベースに作成・調整しています。ご利用の環境でテストの上ご使用ください。
免責 本コードの利用に伴う不具合・損害について、当サイトは責任を負いません。自己責任にてご利用ください。

デモ

開閉時に矢印アイコンが回転し、スライドアニメーションで本文を表示します。FAQやQ&Aページに最適です。
このデモはJSで開閉を制御しています。矢印回転やスライド量を安定的に管理でき、複雑なレイアウトでも破綻しにくいのが利点です。
はい。同時開きに対応しています。単一開きにしたい場合は、スクリプト内のコメントを参照して切り替えてください。

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

/* =========================================
   1. 外枠全体のスタイル設定
   -----------------------------------------
   アコーディオン全体を包むボックス(ID: #accordion-section)に
   枠線・角丸・背景などを設定します。
   ========================================= */
#accordion-section{
  border:1px solid #e5e7eb;   /* 外枠の薄いグレー線 */
  border-radius:10px;         /* 角をやや丸めて柔らかい印象に */
  overflow:hidden;            /* 内部のはみ出しを隠す(スライド中に効果) */
  background:#fff;            /* 背景色は白 */
}


/* =========================================
   2. 各項目(.item)の区切り線
   -----------------------------------------
   各質問・回答ペアを区切る下線を追加。
   ========================================= */
#accordion-section .item{
  border-bottom:1px solid #e5e7eb; /* 下境界線を追加 */
}


/* =========================================
   3. 見出しラッパー(.accordion-title)
   ========================================= */
#accordion-section .accordion-title{
  margin:0; /* デフォルトの余白を削除(整列を安定) */
}


/* =========================================
   4. トグルボタン(.toggle)
   -----------------------------------------
   開閉を操作するボタン部分。
   flexで左右に「質問テキスト」と「▼アイコン」を配置。
   ホバー・フォーカス時の視認性も考慮。
   ========================================= */
#accordion-section .toggle{
  display:flex;               /* 横並び配置 */
  align-items:center;         /* 縦中央揃え */
  justify-content:space-between; /* 左右両端配置 */
  width:100%;                 /* 幅いっぱいに拡張 */
  background:#f8fafc;         /* ごく淡いグレー背景 */
  border:none;                /* ボーダーを除去 */
  padding:14px 16px;          /* クリックしやすい余白 */
  cursor:pointer;             /* ホバー時にポインタ表示 */
  font-weight:600;            /* 見出しとして太字 */
  text-align:left;            /* 文字を左寄せ */
  transition:background .25s ease; /* 背景色変更を滑らかに */
}
/* ホバー時の視覚反応(少し青みがかった背景) */
#accordion-section .toggle:hover{
  background:#eef2ff;
}
/* キーボード操作でフォーカスされた時に強調表示 */
#accordion-section .toggle:focus-visible{
  outline:2px solid #0b6bff;  /* 青いアウトライン */
  outline-offset:2px;         /* 少し外側に配置 */
}


/* =========================================
   5. 矢印アイコン(.icon)
   -----------------------------------------
   ボタン右端の▼マークを回転させることで、
   開閉状態を直感的に伝える。
   ========================================= */
#accordion-section .icon{
  transition:transform .3s ease; /* 回転を滑らかに */
}
/* aria-expanded="true" のとき矢印を180度回転(▼→▲) */
#accordion-section .toggle[aria-expanded="true"] .icon{
  transform:rotate(180deg);
}


/* =========================================
   6. 回答パネル(.panel)
   -----------------------------------------
   高さをJSで操作してスライドアニメーションを実現。
   初期状態は非表示(height:0)。
   ========================================= */
#accordion-section .panel{
  overflow:hidden;            /* アニメ中に内容がはみ出さないように */
  height:0;                   /* 初期状態では閉じる */
  transition:height .28s ease; /* 開閉のスピード・滑らかさを指定 */
  will-change:height;         /* GPUに高さアニメーションを最適化させる */
}


/* =========================================
   7. 内部コンテンツ(.panel-inner)
   -----------------------------------------
   実際のテキストを包む要素。
   表示時はフェードイン+軽く下から上がる動きを付与。
   ========================================= */
#accordion-section .panel-inner{
  padding:16px;               /* 文字の内側余白 */
  line-height:1.8;            /* 行間をゆったり */
  background:#fff;            /* 背景は白のまま */
  opacity:0;                  /* 初期は透明(非表示) */
  transform:translateY(-2px); /* わずかに上へずらしてから登場 */
  transition:opacity .24s ease, transform .24s ease; /* フェード+移動 */
}
/* 開いた状態のパネル(data-open="true")に適用 */
#accordion-section .panel[data-open="true"] .panel-inner{
  opacity:1;                  /* フェードイン */
  transform:translateY(0);    /* 元の位置に戻る */
}


/* =========================================
   8. 動きを控える設定への対応
   -----------------------------------------
   OSの設定で「動きを減らす」が有効な場合、
   すべてのアニメーションをオフに。
   ========================================= */
@media (prefers-reduced-motion: reduce){
  #accordion-section .panel,
  #accordion-section .panel-inner,
  #accordion-section .icon{
    transition:none; /* トランジションを無効化 */
  }
}

コメント