效果如下
View部分
<div id="app" class="tab-navbar"> <nav> <a v-for= "(v, i) in list" :key= "v" :class="{ active: index === i }" @click="select(i)"> 标题{{i + 1}} </a> </nav> <div class="items"> <div class="ul" :style="`--tab-count: ${list.length};--tab-index: ${index}`"> <div class="li" v-for="(v, i) in list" :key="v" :style="`--bg-color: ${v}`"> 内容{{i + 1}} </div> </div> </div></div>
JS部分
var app = new Vue({ el: '#app', data: function(){ return { index: 0, list: [ "#f66", "#09f", "#3c9"] }; }, methods: { select(i) { this.index = i; } }});
css 部分
.tab-navbar { display: flex; overflow: hidden; flex-direction: column-reverse; border-radius: 10px; width: 300px; height: 400px;}nav { width: 300px; display: flex; height: 40px; background-color: #f0f0f0; line-height: 40px; text-align: center;}a { flex: 1; cursor: pointer; transition: all 300ms;}.active { background-color: #66f; font-weight: bold; color: #fff;}.items { flex: 1;}.ul { --tab-index: 0; --tab-width: calc(var(--tab-count) * 100%); --tab-move: calc(var(--tab-index) / var(--tab-count) * -100%); display: flex; flex-wrap: nowrap; width: var(--tab-width); height: 100%; transform: translate3d(var(--tab-move), 0, 0); transition: all 300ms;}.li { display: flex; justify-content: center; align-items: center; flex: 1; background-color: var(--bg-color); font-weight: bold; font-size: 20px; color: #fff;}