【JavaScript】タブを切り替えるイベントの作り方を解説

魔物が現れた

カテゴリーごとにタブを切り替えて表示がしたい!

けんと

説明しよう!

こんにちは、けんとです。
今回はJavaScriptを使ったタブの切替方法について解説します。

コピペしてすぐに使えるので是非活用してみてください。

コードは分解しつつ解説していきます。
なのでJavaScript初学者の方もなんとなく理解できるのではないかなと思います。

タブを切り替えるイベントの作り方

See the Pen Untitled by kento-n96 (@kento-n96) on CodePen.

まずは実装済みのものをご覧ください。
パーツとしてはタブのボタンの部分と、タブの内容の部分の2つで構成されています。
タブのボタンを押すことによって、内容の部分の表示 / 非表示が切り替わるようになっています。

コードの解説

HTML / CSSのコード

JavaScriptに関係する部分を抜粋して解説していきます。
見た目を整えるコードは省いております。

<ul class="tab__btn">
  <!-- タグボタン1 初期選択-->
  <li class="tab__name tab__name--one is-active">タブ1</li>
  <!-- タグボタン2 -->
 <li class="tab__name tab__name--two">タブ2</li>
 <!-- タグボタン3 -->
 <li class="tab__name tab__name--three">タブ3</li>
</ul>
/* ////////////////////////// */
/* タグボタン表示切り替え */
/* ////////////////////////// */
.tab__name.is-active {
  color: #FFF;
  opacity: 1;
  transition: 0.3s ease;
}

/* タグボタン1 */
.tab__name--one.is-active {
  background-color: red;
}

/* タグボタン2 */
.tab__name--two.is-active {
  background-color: blue;
}

/* タグボタン3 */
.tab__name--three.is-active {
  background-color: green;
}

上記はボタンの部分です。初期表示するものに「is-active」をつけておきます。
この「is-active」をJavaScriptによって付けたり外したりして表示を切り替えます。
ボタンにはそれぞれ別のクラス名も入力し色を分けています。
CSSのBEM設計でいう「Modifier」を使用しています。

<!-- タグ内容1 初期表示 -->
<div class="tab__content tab__content--one is-show">
  <div class="tab__content-inner">
    <p class="tab__description">タブ1のテキスト</p>
  </div></div>
<!-- タグ内容2 -->
<div class="tab__content tab__content--two">
  <div class="tab__content-inner">
    <p class="tab__description">タブ2のテキスト</p>
  </div>
</div>
<!-- タグ内容3-->
<div class="tab__content tab__content--three">
  <div class="tab__content-inner">
    <p class="tab__description">タブ3のテキスト</p>
  </div>
</div>
.tab__content {
  display: none;
}

/* ////////////////////////// */
/* タグ内容表示切り替え */
/* ////////////////////////// */

.tab__content.is-show {
  display: block;
}

上記はタブの内容の部分です。初期表示するものに「is-show」をつけておきます。
「is-show」がない状態では「display: none;」にして非表示にします。

JavaScriptのコード

// HTMLが読み込まれたら発動する
document.addEventListener('DOMContentLoaded', function () {

  // tab__nameをすべて取得しtagsに格納する
  const tabs = document.getElementsByClassName('tab__name');
  // 繰り返し構文、tags(配列を取得)が0以上の時1足す
  for (let i = 0; i < tabs.length; i++) {
    // クリックするたびに発動する
    tabs[i].addEventListener('click', tabSwitch, false);
  }

  // getElementsByClassName→指定したクラスを取得
  // for→繰り返し処理
  // length→配列を取得
  // addEventListener→イベント処理するメソッド(今回はクリック)

  // タブをクリックすると実行する関数
  function tabSwitch() {
    // 現在is-activeをもっているものから外す
    document.getElementsByClassName('is-active')[0].classList.remove('is-active');
    // クリックしところにis-activeをつける
    this.classList.add('is-active');
    //  現在is-showをもっているものから外す
    document.getElementsByClassName('is-show')[0].classList.remove('is-show');
    // tabsを配列としてarrayTabsに格納する
    const arrayTabs = Array.prototype.slice.call(tabs);
    // 配列からクリックした要素の順番を取得
    const index = arrayTabs.indexOf(this);
    // 取得した配列番号のものにis-showをつける
    document.getElementsByClassName('tab__content')[index].classList.add('is-show');

    // Array.prototype.slice.call→配列に変換する
    // indexOf→指定された要素の配列順番を取得

  };
}, false);

JavaScriptは記述が長くなっています。
一行ごとに解説のメモを入力させていただきました。

役割としては、「.tab__name」クリックした際の動作を定義しています。

「is-active」「is-show」があるかどうか判断して付けたり外したりしています。
そうすることによって反映されるCSSが変更され、表示 / 非表示の動作を実装しています。

まとめ

今回はJavaScriptによるタブの表示切り替えを解説致しました。
JavaScriptのコードを調べた上で解説をしましたがまだまだ完全には理解が追いついてはいません。

JavaScriptをコピペして使えるのではなく、理解して使えるようになるようもっと勉強したいと思います。
最後まで読んでいただきありがとうございました。ご参考になれば幸いです。