前景:el-tabs标签过多会显示切换按钮,可视区里面只展示部分标签,其他的标签只有左右切换方可展示。
需求:初始页面时指定某个tabs展示在可视区内
1.scrollintoview,用于将元素滚动到视图中。用法:element.scrollIntoView({ behavior: 'smooth', // 平滑滚动 block: 'center', // 垂直居中对齐 inline: 'nearest' // 水平最近对齐 });
behavior
: 定义滚动动画的方式,可选值为'auto'
或'smooth'
。block
: 定义垂直方向的对齐方式,可选值为'start'
,'center'
,'end'
, 或'nearest'
。inline
: 定义水平方向的对齐方式,可选值为'start'
,'center'
,'end'
, 或'nearest'
。
<template>
<div>
<el-tabs v-model="activeTab">
<el-tab-pane
v-for="(tab, index) in tabs"
:key="index"
:label="tab.label"
:name="tab.name"
:ref="el => { if (el) tabRefs[index] = el }"
>
<div>{{ tab.label }}</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import { ref, onMounted } from 'vue';
export default {
setup() {
const activeTab = ref('tab1');
const tabs = [
{ label: 'Tab 1', name: 'tab1' },
{ label: 'Tab 2', name: 'tab2' },
{ label: 'Tab 3', name: 'tab3' },
{ label: 'Tab 4', name: 'tab4' },
{ label: 'Tab 5', name: 'tab5' },
];
const tabRefs = ref([]);
onMounted(() => {
// 如果需要在初始加载时滚动到某个标签页
tabRefs.value[4].$el.scrollIntoView({ behavior: 'smooth', block: 'start' });
});
return {
activeTab,
tabs,
tabRefs,
};
},
};
</script>
<style scoped>
/* 添加一些样式以确保内容足够高 */
.el-tab-pane {
min-height: 1000px;
}
</style>
这样可以实现需求,指定的标签页也在可视区内了,但是新的问题出现了,点击左侧按钮不生效,经查看左侧按钮禁用了,这是element-plus组件的锅,继续研究,总待实现需求
2.给navOffset赋值可以,先找到当前标签页的offsetLeft,然后给navOffset赋值就行了
<template>
<div>
<el-tabs v-model="activeTab" ref="tabsRef">
<el-tab-pane
v-for="(tab, index) in tabs"
:key="index"
:label="tab.label"
:name="tab.name"
>
<div>
{{ tab.label }}
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import { ref, onMounted,nextTick } from 'vue';
export default {
setup() {
const activeTab = ref('tab1');
const tabs = [
{ label: 'Tab 1', name: 'tab1' },
{ label: 'Tab 2', name: 'tab2' },
{ label: 'Tab 3', name: 'tab3' },
{ label: 'Tab 4', name: 'tab4' },
{ label: 'Tab 5', name: 'tab5' },
];
const tabsRef = ref(null);
onMounted(() => {
// 如果需要在初始加载时滚动到某个标签页
scrollToTab('tab5')
});
//定位tabs
const scrollToTab = (targetName) => {
nextTick(() => {
console.log("targetName---------", targetName);
const element = document.getElementById(`tab-${targetName}`);
const offsetLeft = element.offsetLeft;
tabsRef.value.nav$.navOffset=offsetLeft
});
};
return {
activeTab,
tabs,
tabsRef
};
},
};
</script>
<style scoped>
/* 添加一些样式以确保内容足够高 */
.el-tab-pane {
min-height: 1000px;
}
</style>