タブ内の件数をバッジ表示するタブ切り替えを作る方法
タブ内の件数をバッジ表示するタブ切り替えを作る方法を紹介します。このサンプルでは、「お知らせ」「メッセージ」「タスク」の3つのタブを用意し、それぞれのタブに対応する項目数をJavaScriptで自動取得して、タブ内のバッジへ表示します。タブをクリックすると対応する内容だけへ切り替わるため、項目数を確認しながら必要な情報へ移動できます。
管理画面のお知らせ一覧、会員サイトのメッセージ一覧、タスク管理画面、通知一覧など、カテゴリーごとの件数をタブ上で分かりやすく表示したい場面に利用できます。HTMLではタブと各項目を作成し、CSSではタブ、件数バッジ、表示パネルのデザインを設定します。JavaScriptでは各パネル内の項目数を数えてバッジへ反映し、クリックされたタブに対応するパネルだけを表示します。
タブ名、各項目の文章、項目数はHTMLから変更でき、項目を追加または削除するとバッジの数字もページ読み込み時に自動で更新されます。CSSではタブの背景色、枠線、角丸、バッジの色やサイズ、パネルの余白などを用途に合わせて調整できます。タブは横幅に収まらない場合に折り返して表示されるため、スマートフォン・タブレット・PCでも利用しやすい構成です。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
各タブ内の項目数を自動で数えて、タブのバッジに表示します。
各タブには対応する項目数が表示されます。タブをクリックすると、対応する一覧へ切り替わります。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>タブ内の件数をバッジ表示するタブ切り替え</title>
<!-- CSSファイル -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- タブ切り替え全体 -->
<div class="tab-badge-count-switch_wrap">
<!-- タイトル -->
<div class="tab-badge-count-switch_title">
タブ内の件数をバッジ表示
</div>
<!-- 説明文 -->
<p class="tab-badge-count-switch_text">
各タブ内の項目数を自動で数えて、タブのバッジに表示します。
</p>
<!-- タブ一覧 -->
<div
class="tab-badge-count-switch_tabs"
role="tablist"
aria-label="一覧の種類">
<!-- お知らせタブ -->
<button
class="tab-badge-count-switch_tab is-active"
id="tab-badge-count-switch-news"
type="button"
role="tab"
aria-controls="tab-badge-count-switch-panel-news"
aria-selected="true"
data-tab="news">
お知らせ
<span
class="tab-badge-count-switch_badge"
data-badge="news">0</span>
</button>
<!-- メッセージタブ -->
<button
class="tab-badge-count-switch_tab"
id="tab-badge-count-switch-message"
type="button"
role="tab"
aria-controls="tab-badge-count-switch-panel-message"
aria-selected="false"
data-tab="message">
メッセージ
<span
class="tab-badge-count-switch_badge"
data-badge="message">0</span>
</button>
<!-- タスクタブ -->
<button
class="tab-badge-count-switch_tab"
id="tab-badge-count-switch-task"
type="button"
role="tab"
aria-controls="tab-badge-count-switch-panel-task"
aria-selected="false"
data-tab="task">
タスク
<span
class="tab-badge-count-switch_badge"
data-badge="task">0</span>
</button>
</div>
<!-- お知らせパネル -->
<div
class="tab-badge-count-switch_panel is-active"
id="tab-badge-count-switch-panel-news"
role="tabpanel"
aria-labelledby="tab-badge-count-switch-news"
data-panel="news">
<!-- お知らせ項目 -->
<div class="tab-badge-count-switch_item">
新機能をリリースしました。
</div>
<div class="tab-badge-count-switch_item">
メンテナンスのお知らせです。
</div>
<div class="tab-badge-count-switch_item">
アップデート情報を公開しました。
</div>
</div>
<!-- メッセージパネル -->
<div
class="tab-badge-count-switch_panel"
id="tab-badge-count-switch-panel-message"
role="tabpanel"
aria-labelledby="tab-badge-count-switch-message"
data-panel="message">
<!-- メッセージ項目 -->
<div class="tab-badge-count-switch_item">
資料確認のメッセージがあります。
</div>
<div class="tab-badge-count-switch_item">
会議日程の連絡があります。
</div>
<div class="tab-badge-count-switch_item">
見積共有のメッセージがあります。
</div>
<div class="tab-badge-count-switch_item">
請求書確認の連絡があります。
</div>
<div class="tab-badge-count-switch_item">
デザイン案の共有があります。
</div>
</div>
<!-- タスクパネル -->
<div
class="tab-badge-count-switch_panel"
id="tab-badge-count-switch-panel-task"
role="tabpanel"
aria-labelledby="tab-badge-count-switch-task"
data-panel="task">
<!-- タスク項目 -->
<div class="tab-badge-count-switch_item">
請求書を送付する。
</div>
<div class="tab-badge-count-switch_item">
来週の打ち合わせを調整する。
</div>
</div>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLでは「お知らせ」「メッセージ」「タスク」の3つのタブと、それぞれに対応するコンテンツを作成します。各タブには件数を表示するバッジを配置し、パネル内にはJavaScriptで数える対象となる項目を配置しています。
CSSではタブ切り替え全体の横幅や余白、タブの選択状態、赤色の件数バッジ、コンテンツパネル、項目の区切り線などを設定します。JavaScriptでは各パネル内にある項目数を自動で数えて対応するバッジへ表示し、タブをクリックしたときに選択状態と表示するパネルを切り替えます。
外部サービスや外部ライブラリは使用していないため、APIキーやURLなどを別途用意する必要はありません。HTML・CSS・JavaScriptの3ファイルを同じsampleフォルダへ配置するだけで動作を確認できます。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはタブ切り替え全体を構成するファイルです。「お知らせ」「メッセージ」「タスク」のタブ名、各パネルに表示する文章、項目数などを変更できます。各タブのdata-tabとバッジのdata-badge、対応するパネルのdata-panelを同じ値にすることで、それぞれのタブ・バッジ・パネルを関連付けています。
style.cssはタブ切り替えのデザインを設定するファイルです。全体の最大横幅や余白、タブの高さ、背景色、文字色、タブ同士の間隔、件数バッジのサイズや色、パネルの余白、項目を区切る線などを変更できます。選択中のタブにはis-activeクラスが付き、青い背景と白い文字で表示されます。
script.jsは件数の取得とタブ切り替えを行うファイルです。ページを読み込むと、各パネル内にあるtab-badge-count-switch_itemの数を取得し、対応するバッジへ件数を表示します。また、タブをクリックするとすべてのタブとパネルからis-activeを外し、クリックしたタブと対応するパネルだけを選択状態にします。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。index.htmlからstyle.cssとscript.jsを読み込む構成になっているため、追加のライブラリを導入する必要はありません。
ページを開くとJavaScriptが各パネルの項目数を自動で取得します。サンプルでは「お知らせ」が3件、「メッセージ」が5件、「タスク」が2件あるため、それぞれのタブに3・5・2の件数が表示されます。タブをクリックすると、選択したタブに対応するパネルへ表示が切り替わります。
カスタマイズできる内容
index.htmlではタブ名、パネル内の文章、項目数を変更できます。項目を追加する場合は、対応するパネル内へtab-badge-count-switch_itemクラスを付けた要素を追加します。反対に項目を削除すると件数も減り、ページを読み込んだときにJavaScriptが実際の項目数を数えてバッジへ反映します。
タブとパネルの組み合わせを変更する場合は、タブのdata-tab、バッジのdata-badge、パネルのdata-panelへ同じ値を設定します。タブのaria-controlsには対応するパネルのID、パネルのaria-labelledbyには対応するタブのIDを指定します。
style.cssでは全体の最大横幅、内側余白、枠線、角丸、背景色、タブのサイズや色、件数バッジのサイズや背景色、パネルの余白などを変更できます。選択中のタブは.tab-badge-count-switch_tab.is-active、件数バッジは.tab-badge-count-switch_badgeからデザインを調整できます。
数値調整
style.css
max-width:700px;
タブ切り替え全体の最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。
margin:40px auto;
タブ切り替え全体の上下余白です。40pxを大きくすると上下の間隔が広がり、小さくすると狭くなります。
padding:32px;
全体の内側余白です。値を大きくすると内容と外側の枠線との間隔が広がります。
border-radius:18px;
全体の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
font-size:22px;
タイトルの文字サイズです。値を大きくするとタイトルが大きくなり、小さくすると控えめになります。
margin:0 0 24px;
説明文の下側余白です。24pxを大きくすると説明文とタブの間隔が広がります。
gap:8px;
各タブ内にあるタブ名と件数バッジの間隔です。値を大きくすると両者の間隔が広がります。
min-height:52px;
タブの最小高さです。値を大きくするとタブが高くなり、小さくすると低くなります。
padding:14px;
タブの内側余白です。値を大きくするとタブ内の余白が広がります。
border-radius:12px 12px 0 0;
タブ上部の角丸です。12pxを大きくすると上側の丸みが強くなり、0にすると四角になります。
margin-left:6px;
2個目以降のタブに設定する左側の間隔です。値を大きくするとタブ同士の間隔が広がります。
transition:0.3s;
タブの背景色と文字色が切り替わる時間です。0.3秒で変化し、値を大きくするとゆっくり、小さくすると速く切り替わります。
min-width:24px;
件数バッジの最小横幅です。値を大きくするとバッジの横幅が広がります。
height:24px;
件数バッジの高さです。値を大きくするとバッジが大きく表示されます。
padding:0 7px;
件数バッジの左右の内側余白です。7pxを大きくすると、数字とバッジ端の間隔が広がります。
font-size:12px;
件数バッジ内の数字の文字サイズです。値を大きくすると数字が大きく表示されます。
padding:24px;
コンテンツパネルの内側余白です。値を大きくすると文章とパネルの枠線との間隔が広がります。
padding:10px 0;
パネル内の各項目に設定する上下余白です。10pxを大きくすると項目同士の間隔が広がります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-width:700pxによって、画面幅に合わせてタブ切り替え全体が縮小されます。
画面幅640px以下ではメディアクエリが適用され、全体の余白をpadding:24px 18px;、タブの高さをmin-height:48px;、タブの文字サイズを14pxへ変更します。さらに件数バッジを22pxの高さ、パネルの余白を20px 16pxへ調整しているため、スマートフォン・タブレット・PCの画面幅に合わせて利用できます。
コメント