Bootstrap

element-plus el-tabs 让某个tabs项显示在可视区

前景: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>

;