タブを表示したときに、指定したタブを最初から選択状態にする方法を紹介します。通常の先頭タブではなく、2番目や3番目など、任意のタブを初期状態で表示できるのが特徴です。
今回のサンプルでは、「HTML」「CSS」「JavaScript」の3つのタブを用意し、ページを開いた時点で中央の「CSS」タブが選択されています。CSSの説明が最初から表示され、ほかのタブの内容は非表示になっています。
初期表示後は、各タブをクリックすると対応する内容へ切り替わります。選択したタブの背景色も変化するため、現在どのタブが表示されているかを確認できます。
デモ
ページを開いた時点で「CSS」タブが選択されています。
ページを開くと「CSS」タブが選択された状態で表示されます。各タブをクリックすると対応する説明へ切り替わります。
コードをコピーして使おう!
<!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="initial-selected-tab-switch_wrap">
<!-- タイトル -->
<div class="initial-selected-tab-switch_title">
指定したタブを最初から表示
</div>
<!-- 説明文 -->
<p class="initial-selected-tab-switch_text">
ページを開いた時点で「CSS」タブが選択されています。
</p>
<!-- タブ一覧 -->
<div
class="initial-selected-tab-switch_tabs"
role="tablist"
aria-label="使用技術">
<!-- HTMLタブ -->
<button
class="initial-selected-tab-switch_tab"
id="tab-html"
type="button"
role="tab"
aria-controls="panel-html"
aria-selected="false"
data-tab="html">
HTML
</button>
<!--
CSSタブを初期選択する
is-activeクラスとaria-selected="true"を付ける
-->
<button
class="initial-selected-tab-switch_tab is-active"
id="tab-css"
type="button"
role="tab"
aria-controls="panel-css"
aria-selected="true"
data-tab="css">
CSS
</button>
<!-- JavaScriptタブ -->
<button
class="initial-selected-tab-switch_tab"
id="tab-js"
type="button"
role="tab"
aria-controls="panel-js"
aria-selected="false"
data-tab="js">
JavaScript
</button>
</div>
<!-- HTMLパネル -->
<div
class="initial-selected-tab-switch_panel"
id="panel-html"
role="tabpanel"
aria-labelledby="tab-html"
data-panel="html">
HTMLはWebページの構造を作るためのマークアップ言語です。
</div>
<!--
CSSパネルを初期表示する
is-activeクラスを付ける
-->
<div
class="initial-selected-tab-switch_panel is-active"
id="panel-css"
role="tabpanel"
aria-labelledby="tab-css"
data-panel="css">
CSSは文字色やレイアウトなど、見た目をデザインするために使います。
</div>
<!-- JavaScriptパネル -->
<div
class="initial-selected-tab-switch_panel"
id="panel-js"
role="tabpanel"
aria-labelledby="tab-js"
data-panel="js">
JavaScriptはクリック時の切り替えなど、動きを付けるために使います。
</div>
</div>
<!-- JavaScriptファイルを読み込み -->
<script src="script.js"></script>
</body>
</html>
コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。 サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
今回のサンプルは、HTML・CSS・JavaScriptの3つのファイルで構成されています。 HTMLでは3つのタブとそれぞれの表示内容を用意し、最初に選択するタブを指定しています。 CSSではタブボタンとコンテンツの表示状態やデザインを設定し、JavaScriptではクリックしたタブに応じて表示内容を切り替えています。 画像などの外部素材は使用していません。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlには、「HTML」「CSS」「JavaScript」の3つのタブボタンと、それぞれに対応するコンテンツを記述しています。
最初に表示するタブにはis-activeクラスを付け、選択状態を示すaria-selected属性も設定しています。
style.cssでは、タブの横並び、選択中の背景色、コンテンツの表示・非表示、画面幅に応じた余白や文字サイズを設定しています。
script.jsでは、クリックされたタブのdata-tab属性を取得し、対応するコンテンツを表示する処理を行っています。
設置方法・使い方
「サンプル一式をダウンロード」をクリックしてZIPファイルを保存し、展開してください。
sampleフォルダ内のindex.html・style.css・script.jsを同じ階層に配置します。
index.htmlをブラウザで開くと、「CSS」タブが選択された状態で表示され、その説明文が最初から表示されます。
「HTML」や「JavaScript」をクリックすると、選択中のタブの背景色が変わり、対応する説明へ切り替わります。
最初に表示するタブを指定する方法
初期状態で選択するタブは、index.htmlのHTMLで指定しています。
今回は「CSS」タブを最初に表示するため、CSSタブのbutton要素にis-activeクラスを付け、aria-selected="true"を設定しています。
<!--
CSSタブを初期選択する
is-activeクラスとaria-selected="true"を付ける
-->
<button
class="initial-selected-tab-switch_tab is-active"
id="tab-css"
type="button"
role="tab"
aria-controls="panel-css"
aria-selected="true"
data-tab="css">
CSS
</button>
is-activeクラスは、選択中のタブに適用するデザインを指定するために使用しています。
aria-selected="true"は、そのタブが選択されていることを示す属性です。
初期選択されていない「HTML」と「JavaScript」のタブにはis-activeを付けず、aria-selected="false"を設定しています。
最初に表示するコンテンツを指定する方法
タブボタンだけでなく、対応するコンテンツにもis-activeクラスを付ける必要があります。
今回はCSSの説明を最初に表示するため、CSSパネルにis-activeを指定しています。
<!--
CSSパネルを初期表示する
is-activeクラスを付ける
-->
<div
class="initial-selected-tab-switch_panel is-active"
id="panel-css"
role="tabpanel"
aria-labelledby="tab-css"
data-panel="css">
CSSは文字色やレイアウトなど、見た目をデザインするために使います。
</div>
style.cssでは、通常のコンテンツをdisplay:none;で非表示にし、is-activeクラスが付いたコンテンツだけをdisplay:block;で表示しています。
/* コンテンツ */
.initial-selected-tab-switch_panel{
display:none; /* 初期状態では非表示 */
padding:24px; /* 内側余白 */
border:1px solid #d1d5db; /* 枠線 */
border-top:none; /* 上線を非表示 */
background:#ffffff; /* 背景色 */
color:#4b5563; /* 文字色 */
font-size:16px; /* 文字サイズ */
line-height:1.8; /* 行間 */
}
/* 表示中のコンテンツ */
.initial-selected-tab-switch_panel.is-active{
display:block; /* 表示する */
}
例えば、最初に「JavaScript」タブを表示したい場合は、CSSタブとCSSパネルからis-activeクラスを外し、JavaScriptタブとJavaScriptパネルへ付け替えます。
あわせて、JavaScriptタブのaria-selectedをtrue、CSSタブのaria-selectedをfalseに変更してください。
タブボタンとコンテンツの両方を変更することで、選択状態と表示内容を一致させられます。
この変更にJavaScriptの修正は必要ありません。
クリックしたタブに対応するコンテンツを表示する仕組み
script.jsでは、クリックされたタブのdata-tab属性を取得し、その値と一致するdata-panel属性を持つコンテンツを表示しています。
// クリックされたタブの識別名を取得
const target=tab.dataset.tab;
// すべてのタブを非選択状態にする
initialSelectedTabSwitchTabs.forEach(function(item){
item.classList.remove("is-active");
item.setAttribute("aria-selected","false");
});
// すべてのコンテンツを非表示にする
initialSelectedTabSwitchPanels.forEach(function(panel){
panel.classList.remove("is-active");
});
// クリックしたタブを選択状態にする
tab.classList.add("is-active");
tab.setAttribute("aria-selected","true");
// 対応するコンテンツだけ表示する
document
.querySelector('[data-panel="' + target + '"]')
.classList.add("is-active");
例えば「HTML」タブをクリックすると、data-tab="html"からhtmlという値を取得します。
その後、すべてのタブとコンテンツからis-activeクラスを外し、クリックしたタブとdata-panel="html"を持つコンテンツに付け直します。
この処理によって、初期表示ではCSSが選択されていても、クリック後は選択したタブの内容に切り替わります。
タブの名称や説明文を変更する場合はHTMLの表示文字を編集できますが、対応関係を維持するため、data-tabとdata-panelの値は一致させてください。
選択中のタブの色を変更する方法
選択中のタブは、style.cssの.initial-selected-tab-switch_tab.is-activeでデザインを指定しています。
/* 選択中のタブ */
.initial-selected-tab-switch_tab.is-active{
background:#0b6bff; /* 背景色 */
color:#ffffff; /* 文字色 */
}
backgroundを変更すると選択中のタブの背景色が変わり、colorを変更すると文字色が変わります。
初期表示で選択されているタブと、クリック後に選択したタブの両方に同じデザインが適用されます。
タブ全体の最大横幅は.initial-selected-tab-switch_wrapのmax-width:700px;で調整できます。
また、padding:32px;を変更すると外枠と内容の間隔を調整でき、border-radius:18px;を変更すると外枠の角丸を調整できます。
レスポンシブ対応
画面幅640px以下では、タブ全体の余白、タブボタンの高さ、文字サイズ、コンテンツの余白を小さくしています。
これにより、スマートフォンでも3つのタブを横並びで操作できるようにしています。
/* スマートフォン表示 */
@media (max-width:640px){
/* 全体 */
.initial-selected-tab-switch_wrap{
padding:24px 18px; /* 余白を小さくする */
}
/* タブ */
.initial-selected-tab-switch_tab{
min-height:48px; /* 高さを小さくする */
padding:12px 8px; /* 内側余白 */
font-size:14px; /* 文字サイズ */
}
/* タブ同士の間隔 */
.initial-selected-tab-switch_tab + .initial-selected-tab-switch_tab{
margin-left:4px; /* 間隔を狭くする */
}
/* コンテンツ */
.initial-selected-tab-switch_panel{
padding:20px 16px; /* 内側余白 */
}
}
font-size:14px;を変更するとスマートフォンでのタブ文字の大きさを調整でき、padding:12px 8px;を変更するとボタン内の上下左右の余白を調整できます。
画面幅によって見た目は変化しますが、最初にCSSタブを表示する設定や、クリックによる切り替え処理は共通です。
コメント