先日、jQeuryでタブ切り替えを実装する方法を書いたのですが、今度はそれをVue.jsで実装してみることにしました。
作ったもの
こちらです。
実装方法
HTML
<div id="tab">
<ul class="tabMenu">
<li class="tabItem" v-for="(tab,index) in tabs" v-on:click="activetab=(index+1)" v-bind:class="[ activetab === (index+1) ? 'active' : '' ]">{{tab.tabitem}}</li>
</ul>
<div class="tabContent">
<div class="tabBlock" v-for="(item,index) in contents" v-bind:class="[ activetab === (index+1) ? 'show' : '' ]">
<div class="tabBlock__inner">
<h3 class="tabBlock__title">{{item.title}}</h3>
<p class="tabBlock__text">{{item.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.active{
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.show{
position: static;
opacity: 1;
}
Javascript(Vue.js)
var tab = new Vue({
el: '#tab',
data: {
activetab: 1,
tabs: [
{ tabitem: "tab01" },
{ tabitem: "tab02" },
{ tabitem: "tab03" },
],
contents: [
{
title: "コンテンツ01",
text: "テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト"
},
{
title: "コンテンツ02",
text: "テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト"
},
{
title: "コンテンツ03",
text: "テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト"
},
],
}
});
簡単な説明
v-forでタブメニューを生成し、その順番を利用して activetab
という変数の値を変化させて、今どれがアクティブな状態なのかを判定しています。
また、表示するコンテンツの方も、同じようにv-forで生成して、同じ順番のものをアクティブにするようにしています。
まとめ
jQueryのものと比べるとこちらの方がややコードがすっきりして見えるように思います。
実際、編集するときはJSの配列の値を変更するだけなので、触るところも明白かと。
HTMLが長くなるとどこ触っていいかわからなくなってくるので。。。
引き続き勉強がてらVue.jsでいろいろやってみたいと思います。