2022.4.14|コーディング

CSSのみ(JavaScript無し)でタブ切り替えメニューを実装する2つの方法

CSSのみ(JavaScript無し)でタブ切り替えメニューを実装する2つの方法

タブ切り替えメニューを実装するにはさまざまな方法がありますが、従来は、「jQuery」や「JavaScript」を利用して実装するのが一般的でしたが、「HTML」や「CSS」の技術が進化し「CSS」のみでタブ切り替えメニューを実装することができるようになりました。

今回は、CSSのみ(JavaScript無し)でタブ切り替えメニューを実装する2つの方法を解説します。

CSSのみ(JavaScript無し)でタブ切り替えを行う基本的な考え方

CSSのみ(JavaScript無し)でタブ切り替えメニューを実装する方法は沢山ありますが、基本的な考え方は同じですが、「CSS」の記述方法が異なります。

【基本的な考え方】
・ラジオボタンを非表示にする
・「ラジオボタン」のid属性と「タブ項目)」のfor属性を紐づける

ラジオボタンを非表示にしてデザイン設計

各タブメニューを「ラジオボタン」で配置し、デザイン性を持たせるために「ラジオボタン」の機能を非表示にする必要があります。CSSで「input[type=radio]」に「display:none;」要素を記述して、ラジオボタンを非表示にしてからデザインを設計します。

「input(ラジオボタン)」のid属性と「label(タブ項目)」のfor属性を紐づける

ラジオボタンを機能させるために「ラジオボタン」と「タブ項目」を紐づけする必要がります。
「input(ラジオボタン)」のid属性と「label(タブ項目)」のfor属性を紐づけます。id属性とfor属性が一致していないとタブメニューは機能しません。

タブメニューhtmlコード

※ひとつのタブメニューのみ表示しています。

<input id="menu01" type="radio" name="tab_menu" checked><label class="tab_menu" for="menu01">メニュー項目 1</label>

CSSのみ(JavaScript無し)でタブ切り替えメニューを実装する2つの方法

基本的な考え方を元に、CSSのみ(JavaScript無し)でタブ切り替えメニューを実装するには、「タグ項目」タグと「コンテンツ」を一致させてコンテンツを開く方法と「タグ項目」を選択時に直下のコンテンツを開く方法と2つの方法があります。

2つの方法の違いは、
①「input(ラジオボタン)」のid属性を選択した時に、Class要素に記述されている「id(コンテンツ内容)」を一致させて「コンテンツ内容」を開く方法。
②「input(ラジオボタン)」のid属性を選択した時に、直下にあるClass要素に記述されている「id(コンテンツ内容)」を開く方法。

2つの違いは、「input(ラジオボタン)」のid属性とClass要素に記述されている「id(コンテンツ内容)」を一致させてコンテンツ内容を開くか直下にあるClass要素に記述されている「id(コンテンツ内容)」を開くかの違いです。

1.「ラジオボタン」「コンテンツ内容」を一致させて開く方法

「input(ラジオボタン)」のid属性に「menu01」を記述したらClass要素「id(コンテンツ内容)」にも「menu01」を記述することで、タブを選択した際にidが一致しているコンテンツ内容を開くことができます。

HTMLの記述
<div class="tab01">
<input id="menu01" type="radio" name="tab_menu" checked><label class="tab_menu" for="menu01">メニュー項目 1</label>
<input id="menu02" type="radio" name="tab_menu"><label class="tab_menu" for="menu02">メニュー項目 2</label>
<input id="menu03" type="radio" name="tab_menu"><label class="tab_menu" for="menu03">メニュー項目 3</label>
<div class="tab_contents" id="menu01">
コンテンツ内容 1
</div>
<div class="tab_contents" id="menu02">
コンテンツ内容 2
</div>
<div class="tab_contents" id="menu03">
コンテンツ内容 3
</div>
</div>
CSSの記述
.tab01 {
  width: 100%;
  margin: 0 auto 50px;
}
/*タブのスタイル*/
.tab_menu {
  width: calc(100%/3);
  height: 60px;
  line-height: 60px;
  font-size: 16px;
  text-align: center;
  color: #000;
  border-bottom: 3px solid #1f71b5;
  background-color: #d9d9d9;
  display: block;
  float: left;
  text-align: center;
  font-weight: bold;
  transition: all 0.2s ease;
}
.tab_menu:hover {
  opacity: 0.75;
}
/*ラジオボタンを全て消す*/
input[name="tab_menu"] {
  display: none;
}
/*タブ切り替えの中身のスタイル*/
.tab_contents {
  display: none;
  padding: 40px;
  clear: both;
  overflow: hidden;
  transition: .5s opacity;
  box-shadow: 0 0 3px rgba(0,0,0,.2);
}
/*選択されているタブを表示*/
#menu01:checked ~ #menu01,
#menu02:checked ~ #menu02,
#menu03:checked ~ #menu03 {
  display: block;
}
/*選択されているタブのスタイル*/
.tab01 input:checked + .tab_menu {
  background-color: #1f71b5;
  color: #fff;
}

2.「ラジオボタン」直下にある「コンテンツ内容」を開く方法

「input(ラジオボタン)」のタブを選択した際に、直下にあるClass要素に記述されている「id(コンテンツ内容)」を開くことができます。

コンテンツ内容 1
コンテンツ内容 2
コンテンツ内容 3
HTMLの記述
<div class="tab02">
<input id="table01_01" type="radio" name="table01" class="tab_active" checked="checked" /><label class="tab_label" for="table01_01">メニュー項目 1</label>
<div class="tab_content">
コンテンツ内容 1
</div>
<input id="table01_02" type="radio" name="table01" class="tab_active" /><label class="tab_label" for="table01_02">メニュー項目 2</label>
<div class="tab_content">
コンテンツ内容 2
</div>
<input id="table01_03" type="radio" name="table01" class="tab_active" /><label class="tab_label" for="table01_03">メニュー項目 3</label>
<div class="tab_content">
コンテンツ内容 3
</div>
</div>
CSSの記述
.tab02 {
  display: flex;
  flex-wrap: wrap;
  margin: 0 auto 50px;
}
.tab02:after {
  content: '';
  width: 100%;
  height: 3px;
  background:#1f71b5;
  display: block;
  order: -1;
}
.tab_label {
  height: 60px;
  line-height: 60px;
  color:#000;
  background:#d9d9d9;
  font-weight: bold;
  white-space: nowrap;
  text-align: center;
  order: -1;
  position: relative;
  z-index: 1;
  cursor: pointer;
  border-radius: 5px 5px 0 0;
  flex: 1;
}
.tab_label:not(:last-of-type) {
  margin-right: 5px;
}
.tab_content {
  width: 100%;
  height: 0;
  overflow: hidden;
  opacity: 0;
}
/* アクティブタブ */
.tab_active:checked+.tab_label {
  color:#fff;
  background:#1f71b5;
}
.tab_active:checked+.tab_label+.tab_content {
  height: auto;
  overflow: auto;
  padding: 40px;
  opacity: 1;
  transition: .5s opacity;
  box-shadow: 0 0 3px rgba(0,0,0,.2);
}
/* ラジオボタン非表示 */
.tab_active {
  display: none;
}

まとめ

「jQuery」や「JavaScript」を利用してタブメニューを実装するとどうしてもWebサイトのパフォーマンスが悪くなり表示速度が遅くなってしまいます。CSSのみで完結できるのは表示速度の遅延防止に繋がります。
CSSのみでタブメニューの実装方法を覚えておくと「jQuery」や「JavaScript」が苦手な方でもWebサイトに動きを取り入れることができますね。