アコーディオン(シンプル&軽量)
シンプル・軽量・アクセシビリティ配慮済みのアコーディオンUIを、HTML/CSS/JSのみで実装します。
キーボード操作(Enter/Space/↑↓)や aria-expanded
の更新、hidden
切替、単一展開(1つだけ開く)にも対応。
このページ下部のコピー用コードタブから、そのままコピペで導入できます。
コードについて
本記事のコードは AI(ChatGPT)による生成をベースに作成・調整しています。ご利用の環境でテストの上ご使用ください。
免責 本コードの利用に伴う不具合・損害について、当サイトは責任を負いません。自己責任にてご利用ください。
免責 本コードの利用に伴う不具合・損害について、当サイトは責任を負いません。自己責任にてご利用ください。
デモ
基本プランは月額1,000円です。年払いで2ヶ月分お得になります。
マイページからいつでも解約できます。日割りはありません。
メール・チャットの2チャネルで平日10:00〜18:00に対応しております。
コードをコピーして使おう!
/* ルート:カスタムプロパティ(色や角丸を一括管理) */
#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秒) */
}
コメント