メモもかねてタブで切り替えるコンテンツをjQueryで作る方法を紹介します。
これを書こうと思いながら改めてブログを振り返ってると以前にも書いてたんですが、id使ってたりちょっとまどろっこしいなと思ったので、もう少しシンプル目なやつにしました。
実装方法
html
<div id="tab">
<ul class="tabMenu">
<li class="tabItem tabItem-current">tab01</li>
<li class="tabItem">tab02</li>
<li class="tabItem">tab03</li>
</ul>
<div class="tabContent">
<div class="tabBlock tabBlock-show">
<div class="tabBlock__inner">
<h3 class="tabBlock__title">コンテンツ01</h3>
<p class="tabBlock__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div>
</div>
<div class="tabBlock">
<div class="tabBlock__inner">
<h3 class="tabBlock__title">コンテンツ02</h3>
<p class="tabBlock__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div>
</div>
<div class="tabBlock">
<div class="tabBlock__inner">
<h3 class="tabBlock__title">コンテンツ03</h3>
<p class="tabBlock__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div>
</div>
</div>
</div>
CSS
*{
box-sizing: border-box;
}
ul,li{
margin: 0;
padding: 0;
list-style: none;
}
#tab{
max-width: 640px;
margin: 0 auto;
}
.tabMenu{
display: flex;
justify-content: space-around;
align-items: flex-end;
list-style: none;
border-bottom: 1px solid #ffa594;
}
.tabItem{
display: flex;
justify-content: center;
align-items: center;
height: 60px;
flex-basis: 32%;
flex-shrink: 0;
border-left: 1px solid #ffa594;
border-right: 1px solid #ffa594;
border-top: 1px solid #ffa594;
border-radius: 10px 10px 0 0;
color: #ffa594;
font-weight: bold;
text-align: center;
}
.tabItem.tabItem-current{
background-color: #ffa594;
color: #fff;
}
.tabContent{
position: relative;
border: 1px solid #ffa594;
}
.tabBlock{
position: absolute;
left: 0;
top: 0;
width: 100%;
padding: 60px;
opacity: 0;
transition: .5s;
}
.tabBlock.tabBlock-show{
position: static;
opacity: 1;
}
jQuery
const tabLen = $('.tabItem').length;
for (i = 0; i < tabLen; i++) {
tabChange(i);
}
function tabChange(index) {
$('.tabItem:nth-child(' + (index + 1) + ')').on('click', function (e) {
e.preventDefault();
$('.tabItem.tabItem-current').removeClass('tabItem-current');
$(this).addClass('tabItem-current');
$('.tabBlock.tabBlock-show').removeClass('tabBlock-show');
$('.tabBlock:nth-child(' + (index + 1) + ')').addClass('tabBlock-show');
});
}
簡単な説明
クリックしたタブが何番目かを取得して、それに対応するコンテンツエリアを表示するようにしています。
htmlとしては共通のクラスをつけるだけなので、更新がとてもシンプルになるかなと思います。
複数設置する場合はeach構文などを使えばできるかと思います。
まとめ
よく使うので、まとめておきました。
コードまとめておいておくと使うときコピペして、必要なところだけいじれば使えるので、とても便利です。
また、自分用にメモしてるやつをいくつかブログに出していくようにしたいと思います。
同じものVue.jsでもつくりました。