コピペで完結!アコーディオン#01【シンプル・軽量】

html/css/js

アコーディオン(シンプル&軽量)

シンプル・軽量・アクセシビリティ配慮済みのアコーディオンUIを、HTML/CSS/JSのみで実装します。
キーボード操作(Enter/Space/↑↓)や aria-expanded の更新、hidden 切替、単一展開(1つだけ開く)にも対応。
このページ下部のコピー用コードタブから、そのままコピペで導入できます。

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

デモ

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

/* ルート:カスタムプロパティ(色や角丸を一括管理) */
#my-accordion{
  --radius:12px;         /* 角丸半径(ボックスやボタンに共通) */
  --border:#e5e7eb;      /* 枠線色(淡いグレー) */
  --ink:#0f172a;         /* 文字色(濃いインク色) */
  --muted:#64748b;       /* 補助テキスト色(やや淡い) */
  --accent:#0b6bff;      /* アクセント色(必要なら利用) */
  --bg:#fff;             /* 背景色(白) */
}

/* 各アイテム枠:外側の箱(見出し+本文を内包) */
#my-accordion .acc-item{
  border:1px solid var(--border);   /* 薄い枠線で区切り */
  border-radius:var(--radius);      /* カード風に角丸 */
  background:var(--bg);             /* 背景は白 */
  margin:12px 0;                    /* 項目間の余白 */
  overflow:hidden;                   /* 角丸に本文の角も揃える(はみ出し抑止) */
}

/* 見出しボタン:クリック/Enter/Spaceで開閉(button要素推奨) */
#my-accordion .acc-btn{
  -webkit-appearance:none;          /* ブラウザ既定のボタン外観を無効化(iOS含む) */
  appearance:none;
  width:100%;                       /* 横いっぱいでクリックしやすく */
  text-align:left;                  /* 見出しテキストは左寄せ */
  display:flex;                     /* タイトルとアイコンを左右配置するためflex */
  align-items:center;               /* 縦位置中央 */
  justify-content:space-between;    /* 左=タイトル、右=アイコン */
  gap:12px;                         /* タイトルとアイコンの間隔 */
  padding:14px 16px;                /* タップしやすい余白 */
  background:#fff;                  /* 背景は白 */
  border:none;                      /* 枠線は不要 */
  cursor:pointer;                   /* ホバー時にポインタ */
  color:var(--ink);                 /* 文字色 */
  font:inherit;                     /* 親のフォント/サイズを継承(テーマと整合) */
  line-height:1.4;                  /* 読みやすい行間 */
}

/* 見出し内のタイトル文字:やや強調 */
#my-accordion .acc-title{ 
  font-weight:600;                  /* セミボールドで視認性UP */
}

/* 見出し内のアイコン:+/-など(JSで切替する想定) */
#my-accordion .acc-icon{ 
  font-weight:700;                  /* しっかり目の太さ */
}

/* ホバー時の軽い反応(背景をほんのり) */
#my-accordion .acc-btn:hover{ 
  background:#f8fafc;               /* ごく薄いグレーで反応を見せる */
}

/* キーボード操作時の可視フォーカス(アクセシビリティ) */
#my-accordion .acc-btn:focus-visible{ 
  outline:2px solid #93c5fd;        /* 青系のアウトライン */
  outline-offset:2px;               /* 枠を少し外側にずらす */
}

/* 本文パネル:開いたときに表示される内容の容器 */
#my-accordion .acc-panel{
  padding:12px 16px;                /* テキストの左右余白 */
  border-top:1px solid var(--border);/* 見出しとの境界線 */
  color:var(--ink);                 /* 本文色 */
}

/* アニメ用の一時クラス:
   JS側で height を0⇄scrollHeightに変化させる時だけ付与
   → CSS側は transition を付けるだけにし、スムーズな開閉を実現 */
#my-accordion .acc-panel.is-animating{
  overflow:hidden;                  /* アニメ中のはみ出し防止 */
  transition:height .24s ease;      /* 高さの補間(0.24秒) */
}

コメント