テンプレート

その他

タブで表示切替

更新日:2024-05-12

◆URLをそのままで、ページ内のタブ切り替え機能

タブをクリックすると、タブに対応するコンテンツの表示が切り替えられる機能です。

仕組み的には、タブとコンテンツを番号で紐づけておき、タブをクリックした際に紐づけされたコンテンツの表示をcssのdisplayで切り替えるだけです。

なお、選択されていないタブのコンテンツは「display:none」になっており、SEO的にはあまり好ましくないので、気にする場合は「URLパラメータ(GETメソッド)」を使ってデータを用意した方が良いと思います。

コード例 - Sample

HTML

▶タブ部分とコンテンツ部分で同じ番号を割り当てておく
「data-tab-num="1"」=「id="tab1"」のような感じ
▶初期値には「active」のclass名を付けておく ▶タブのブロック、コンテンツのブロックにはそれぞれ同じclass名を付けておく(clickイベントをまとめて設定するため)

<div class="example">
 <!--タブ部分-->
 <ul class="tab">
  <li class="tab-click active" data-tab-num="1">タブ1</li> <!--初期選択部にはclass「active」をつけておく-->
  <li class="tab-click" data-tab-num="2">タブ2</li>
  <li class="tab-click" data-tab-num="3">タブ3</li>
  <li class="tab-click" data-tab-num="4">タブ4</li>
  <li class="tab-click" data-tab-num="5">タブ5</li>
 </ul>
 <!--コンテンツ部分-->
 <div class="content">
  <div class="wrap">
   <div class="block tab-content active" id="tab1"> <!--初期選択部にはclass「active」をつけておく-->
    <p>タブ1の内容を表示</p>
   </div>
   <div class="block tab-content" id="tab2">
    <p>タブ2の内容を表示<br>テキストテキストテキストテキストテキストテキスト</p>
   </div>
   <div class="block tab-content" id="tab3">
    <p>タブ3の内容を表示</p>
   </div>
   <div class="block tab-content" id="tab4">
    <p>タブ4の内容を表示</p>
   </div>
   <div class="block tab-content" id="tab5">
    <p>タブ5の内容を表示</p>
   </div>
  </div>
 </div>
</div>

CSS

.example>.tab{
 display: flex;
 flex-direction: row;
 flex-wrap: nowrap;
}
.example>.tab>li{
 background-color: #079add;
 color: #fff;
 margin: 0 5px;
 padding: 0 15px;
 border-radius: 5px 5px 0 0;
 cursor: pointer;
}
.example>.tab>li.active{ /*「active」の時だけ適用*/
 opacity:0.5;
 cursor: default;
}
.example>.tab>li:hover{
 opacity:0.5;
}
.example>.content>.wrap{
 border: 1px solid #079add;
 padding: 10px;
 min-height: 10rem;
}
.example>.content>.wrap>.block{
 display: none;
 opacity: 0;
}
.example>.content>.wrap>.active{ /*「active」の時だけ適用*/
 display: block;
 opacity: 1;
}

JavaScript

<script>
//タブの切り替え
let e1 = document.getElementsByClassName('tab-click');
for(let i = 0; i < e1.length; i++){
 e1[i].addEventListener('click', function(){
  tabChange(this.dataset.tabNum); //タブの「data-tab-num」に設定された番号を関数の引数に渡す
 });
}

function tabChange(n){
 //タブのactive表示切り替え
 let e1 = document.getElementsByClassName('tab-click'); //タブを同じclass名でまとめて取得
 for(let i = 0; i < e1.length; i++){
  //クリックしたタブとそれ以外を判定
  if(e1[i].dataset.tabNum == n){
   e1[i].classList.add('active'); //クリックしたタブの場合は「active」classを追加
  }else{
   e1[i].classList.remove('active'); //クリックしたタブ以外の場合は「active」classを削除
  }
 }

 //コンテンツのactive表示切り替え
 let e2 = document.getElementsByClassName('tab-content'); //コンテンツを同じclass名でまとめて取得
 for(let i = 0; i < e2.length; i++){
  //コンテンツに付与されたidとクリックしたタブの番号「tab(n)」を比較して判定
  if(e2[i].id == ('tab'+ n)){
   e2[i].classList.add('active'); //合致した場合は「active」classを追加
  }else{
   e2[i].classList.remove('active'); //合致しなかった場合は「active」classを削除
  }
 }
}
</script>

動作例 - Sample

  • タブ1
  • タブ2
  • タブ3
  • タブ4
  • タブ5

タブ1の内容を表示

タブ2の内容を表示
テキストテキストテキストテキストテキストテキスト

タブ3の内容を表示

タブ4の内容を表示

タブ5の内容を表示