CSS+HTMLのみでタブ切替実装(:target方式・URL連動)
ページ内リンク(<a href="#panelId">
)と :target
セレクタだけで、JavaScript不要のタブUIを実装します。
ハッシュ(例:#tgt02-tab2
)に連動するため、特定タブを開いた状態のURLをそのまま共有できます。
デモと、コピーして使えるCSS/HTMLを用意しました。どこにも干渉しないよう、デモ用は専用ID/クラスに厳密スコープしています。
コードについて
本記事のコードは AI(ChatGPT)による生成をベースに作成・調整しています。ご利用の環境でテストの上ご使用ください。
免責 本コードの利用に伴う不具合・損害について、当サイトは責任を負いません。自己責任にてご利用ください。
免責 本コードの利用に伴う不具合・損害について、当サイトは責任を負いません。自己責任にてご利用ください。
デモ
概要
URLハッシュと :target
で切替。直リンク・戻る/進むにも自然対応します。
仕様
- JS不要・軽量
- 共有リンクで任意タブから開始可能(例:
#tgt02-tab2
) - 初期表示は「ハッシュ無し時のみ」1枚目を表示
使い方
- 各パネルに固有の
id
を付与 - タブは
<a href="#そのid">
- CSSで
.panel:target{display:block}
を指定
コードをコピーして使おう!
/* =========================================================
:target タブ — CSS(コピペ用/衝突しないスコープ)
・#my-target-tabs をラッパーにしてテーマ干渉を低減
・構造は「パネル群 → タブ見出し」(後述のHTML参照)
・ハッシュ無し:1枚目表示、ハッシュ有り:対象のみ表示
・:has() 擬似クラスで「どのパネルが :target か」を上位から検知してタブ強調
・アンカー遷移でページスクロールが発生する場合は、ページ側のCSS/JSで調整してください
========================================================= */
#my-target-tabs{ --ink:#0f172a; --muted:#64748b; --border:#e5e7eb; --accent:#0b6bff; --bg:#fff } /* カラートークン(記事全体での再利用を想定) */
#my-target-tabs .mt-panels{ } /* パネルコンテナ(必要であればレイアウト用の余白等を追加可) */
#my-target-tabs .mt-panel{
display:none; padding:14px 16px; color:var(--ink); /* 既定は非表示。読みやすい余白と文字色 */
border:1px solid var(--border); border-radius:0 10px 10px 10px; background:#fff /* タブ見出しと繋がる形状 */
}
/* :target になったパネルのみ表示(URLの #id に一致する要素が対象) */
#my-target-tabs .mt-panel:target{ display:block }
/* タブ見出し(リンク群) */
#my-target-tabs .mt-tablist{
display:flex; gap:8px; align-items:flex-end; /* タブを横並びにし、下端を揃える */
border-bottom:1px solid var(--border); padding-bottom:6px; margin:10px 0 /* タブ下線・間隔の整え */
}
#my-target-tabs .mt-tab{
-webkit-appearance:none; appearance:none; /* ブラウザ既定の装飾をオフ */
display:inline-block; padding:8px 12px; font-size:14px; /* クリックしやすいサイズ */
background:#fff; color:var(--ink); text-decoration:none; cursor:pointer; /* ボタン風の見た目 */
border:1px solid var(--border); border-bottom:none; /* 下側はパネル枠と連結させるため外す */
border-top-left-radius:10px; border-top-right-radius:10px; /* タブ風の角丸を上側に付与 */
}
#my-target-tabs .mt-tab:hover{ background:#f8fafc } /* ホバーで軽く反応 */
/* 対応タブの強調(:has で :target 状態を検知して、該当する href を持つタブにスタイルを当てる) */
#my-target-tabs:has(#mt-panel-1:target) .mt-tablist .mt-tab[href="#mt-panel-1"],
#my-target-tabs:has(#mt-panel-2:target) .mt-tablist .mt-tab[href="#mt-panel-2"],
#my-target-tabs:has(#mt-panel-3:target) .mt-tablist .mt-tab[href="#mt-panel-3"]{
background:var(--accent); color:#fff; border-color:var(--accent) /* アクティブタブの配色 */
}
/* 初期表示(ハッシュ無し):1枚目のパネルを表示し、1番タブを強調
- location.hash が空のときにのみ適用
- ハッシュが存在する場合は :target 側が優先される */
#my-target-tabs:not(:has(.mt-panel:target)) #mt-panel-1{ display:block }
#my-target-tabs:not(:has(.mt-panel:target)) .mt-tablist .mt-tab[href="#mt-panel-1"]{
background:var(--accent); color:#fff; border-color:var(--accent) /* 初期アクティブの見た目 */
}
/* アクセシビリティ:キーボード操作時にタブへ可視フォーカスを表示 */
#my-target-tabs .mt-tab:focus-visible{ outline:2px solid #93c5fd; outline-offset:2px }
コメント