vue实现同时展示多个tab标签不固定tab标签的数量+左右箭头实现来回滚动
时间: 2023-09-10 16:11:39 浏览: 154
基于vue多tab页实现
好的,我会尽力回答你的问题。首先,你需要在html中创建tab标签和箭头按钮的结构,然后使用Vue编写相应的逻辑。
以下是一个简单的实现示例:
HTML结构:
```
<div id="app">
<div class="tab-container">
<div class="tab-scroll">
<ul class="tab-list" :style="{ width: tabWidth + 'px' }">
<li v-for="(tab, index) in tabs" :key="index" :class="{ active: index === currentTab }" @click="selectTab(index)">{{ tab }}</li>
</ul>
<div class="arrow prev" @click="scrollTabs('prev')" v-if="showPrev"></div>
<div class="arrow next" @click="scrollTabs('next')" v-if="showNext"></div>
</div>
</div>
</div>
```
CSS样式:
```
.tab-container {
position: relative;
overflow: hidden;
}
.tab-scroll {
position: relative;
white-space: nowrap;
}
.tab-list {
display: inline-block;
padding: 0;
margin: 0;
list-style: none;
}
.tab-list li {
display: inline-block;
padding: 10px;
cursor: pointer;
}
.tab-list li.active {
background: #f2f2f2;
color: #333;
}
.arrow {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 30px;
height: 30px;
background: #ccc;
cursor: pointer;
}
.arrow.prev {
left: 0;
}
.arrow.next {
right: 0;
}
```
Vue逻辑:
```
new Vue({
el: '#app',
data: {
tabs: ['Tab 1', 'Tab 2', 'Tab 3', 'Tab 4', 'Tab 5', 'Tab 6', 'Tab 7', 'Tab 8', 'Tab 9', 'Tab 10'],
tabWidth: 0,
currentTab: 0,
showPrev: false,
showNext: false
},
mounted() {
this.calculateTabWidth();
this.checkArrows();
},
methods: {
calculateTabWidth() {
let tabList = this.$el.querySelector('.tab-list');
let tabs = this.$el.querySelectorAll('.tab-list li');
let tabWidth = 0;
tabs.forEach(tab => {
tabWidth += tab.offsetWidth;
});
this.tabWidth = tabWidth;
},
checkArrows() {
let tabContainer = this.$el.querySelector('.tab-container');
let tabList = this.$el.querySelector('.tab-list');
if (tabList.offsetWidth > tabContainer.offsetWidth) {
this.showNext = true;
} else {
this.showNext = false;
}
if (tabList.offsetWidth - tabList.scrollLeft > tabContainer.offsetWidth) {
this.showPrev = true;
} else {
this.showPrev = false;
}
},
scrollTabs(dir) {
let tabContainer = this.$el.querySelector('.tab-container');
let tabList = this.$el.querySelector('.tab-list');
let containerWidth = tabContainer.offsetWidth;
let scrollLeft = tabList.scrollLeft;
if (dir === 'prev') {
this.currentTab--;
} else {
this.currentTab++;
}
if (this.currentTab < 0) {
this.currentTab = 0;
} else if (this.currentTab >= this.tabs.length) {
this.currentTab = this.tabs.length - 1;
}
let tabPos = this.$el.querySelectorAll('.tab-list li')[this.currentTab].offsetLeft;
if (tabPos < 0 || tabPos + this.$el.querySelectorAll('.tab-list li')[this.currentTab].offsetWidth > containerWidth) {
if (dir === 'prev') {
tabList.scrollTo({
left: scrollLeft - this.$el.querySelectorAll('.tab-list li')[this.currentTab].offsetWidth,
behavior: 'smooth'
});
} else {
tabList.scrollTo({
left: scrollLeft + this.$el.querySelectorAll('.tab-list li')[this.currentTab].offsetWidth,
behavior: 'smooth'
});
}
}
this.checkArrows();
},
selectTab(index) {
this.currentTab = index;
this.checkArrows();
}
}
});
```
在这个示例中,我们使用了一个包含所有tab标签的ul元素和两个箭头按钮的div元素。我们使用CSS使这些元素在父容器中水平居中,并将tab标签的列表项设置为inline-block以便它们可以在同一行上排列。
我们使用Vue的数据绑定将tab标签数组、tab列表的宽度、当前选中的标签和箭头按钮的显示状态添加到Vue实例中。我们使用mounted钩子函数计算tab列表的宽度,并检查箭头按钮的显示状态。
我们添加了三个方法:calculateTabWidth用于计算tab列表的宽度,checkArrows用于检查箭头按钮的显示状态,scrollTabs用于滚动到下一个或前一个tab标签。在scrollTabs函数中,我们首先根据箭头按钮的方向滚动到下一个或前一个标签,并将currentTab变量更新为相应的标签。然后,我们计算新的tab标签位置,并检查它是否在容器中可见。如果不是,则使用scrollTo方法滚动到新标签。最后,我们调用checkArrows方法来检查箭头按钮的显示状态。
我们还添加了selectTab方法,用于在单击tab标签时更新currentTab变量,并调用checkArrows方法。
阅读全文