CSS+HTMLのみでタブ切替実装(ラジオボタン方式)
JavaScript不要で使える、input[type="radio"]
+label
+擬似クラスだけで実装するタブUIです。
単一選択(常に1枚だけ表示)に向いており、テーマの影響を避けるためにデモ用CSSはコンポーネントIDへスコープしています。
コードについて
本記事のコードは AI(ChatGPT)による生成をベースに作成・調整しています。ご利用の環境でテストの上ご使用ください。
免責 本コードの利用に伴う不具合・損害について、当サイトは責任を負いません。自己責任にてご利用ください。
免責 本コードの利用に伴う不具合・損害について、当サイトは責任を負いません。自己責任にてご利用ください。
デモ
CSSオンリーのシンプルなタブ
ラジオの :checked
状態を利用して、対応するパネルだけを表示します。
- 単一選択(排他制御)はラジオの特性そのまま
- URL同期や履歴制御は不要な軽量UIに最適
- ARIAは簡易対応(CSSのみのため
aria-selected
切替は静的)
- ラジオ(hidden)をタブ数分用意
label[for]
をタブの見出しに.tab-toggle:checked
と兄弟セレクタで該当パネルを表示
コードをコピーして使おう!
/* =========================================================
タブ切替 #01 — CSS(ラジオ方式・JS不要)
・#tabs-radio-1 にスコープしてテーマ衝突を回避
・ラジオ:checked と兄弟セレクタでタブとパネルを同期
========================================================= */
#tabs-radio-1{ --border:#e5e7eb; --ink:#0f172a; --muted:#64748b; --accent:#0b6bff; --bg:#fff; --radius:12px } /* カスタムプロパティ定義(テーマ色・角丸など) */
/* タブ見出しの並び */
#tabs-radio-1 .tablist{
display:flex; gap:8px; align-items:flex-end; /* 横並び・下端揃えでタブ見出しを配置 */
border-bottom:1px solid var(--border); /* タブ見出し下に下線 */
padding-bottom:6px; margin-bottom:10px; /* 下線とパネル枠の間に余白 */
}
/* タブ(label要素をボタン風に) */
#tabs-radio-1 .tab{
-webkit-appearance:none; appearance:none; /* ブラウザ既定のボタン外観を無効化 */
background:#fff; color:var(--ink); /* 背景は白、文字は濃色 */
border:1px solid var(--border); border-bottom:none; /* 下側はパネル枠と繋げるためボーダー無し */
border-top-left-radius:10px; border-top-right-radius:10px; /* 上側だけ角丸でタブ形状に */
padding:8px 12px; font-size:14px; cursor:pointer; /* クリックしやすいサイズ感 */
}
#tabs-radio-1 .tab:hover{ background:#f8fafc } /* ホバー時の軽い反応 */
/* パネル枠 */
#tabs-radio-1 .panels{
border:1px solid var(--border); /* 外枠ボーダー(上はタブに接続) */
border-radius:0 10px 10px 10px; /* 右上/右下/左下を角丸に(左上はタブと接続) */
background:#fff; /* パネル背景を白に統一 */
}
#tabs-radio-1 .panel{ display:none; padding:14px 16px; color:var(--ink) } /* 既定は非表示。内側余白と文字色 */
#tabs-radio-1 .panel .muted{ color:var(--muted) } /* 説明文などの淡色 */
/* ラジオ:checked による選択状態の反映 */
/* 各ラジオが選択された時、対応するラベルタブを強調(背景=アクセント色、文字=白、ボーダー色も合わせる) */
#t1-1:checked ~ .tablist label[for="t1-1"]{ background:var(--accent); color:#fff; border-color:var(--accent) }
#t1-2:checked ~ .tablist label[for="t1-2"]{ background:var(--accent); color:#fff; border-color:var(--accent) }
#t1-3:checked ~ .tablist label[for="t1-3"]{ background:var(--accent); color:#fff; border-color:var(--accent) }
/* 選択されたラジオに対応するパネルだけ display:block で表示 */
#t1-1:checked ~ .panels #p1{ display:block }
#t1-2:checked ~ .panels #p2{ display:block }
#t1-3:checked ~ .panels #p3{ display:block }
/* 可視フォーカス(キーボード操作向け) */
#tabs-radio-1 .tab:focus-visible{ outline:2px solid #93c5fd; outline-offset:2px } /* キーボード操作時に見えるフォーカスリング */
コメント