IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> kl - tab vue导航栏实现(底部线动画) -> 正文阅读

[JavaScript知识库]kl - tab vue导航栏实现(底部线动画)

示例

在这里插入图片描述

使用

<template>
  <div class="demo">
    <kl-tab :tabOptions="tabOptions" @change="changeCom" />
    <div class="main">
      <component :is="activeName"></component>
    </div>
  </div>
</template>

<script>
import headersFrom from './headers_from.vue';
import formSynthesis from './form_synthesis.vue';
import rowMerge from './row_merge.vue';
export default {
  name: 'demo',
  components: { headersFrom, formSynthesis, rowMerge },
  data() {
    return {
      activeName: 'headersFrom',
      tabOptions: [
        {
          comName: 'headersFrom',
          tabName: '多级表头'
        },
        {
          comName: 'rowMerge',
          tabName: '行合并'
        },
        {
          comName: 'formSynthesis',
          tabName: '综合'
        }
      ]
    };
  },
  methods: {
    changeCom(name) {
      this.activeName = name;
      console.log(name);
    }
  }
};
</script>

<style lang="scss" scoped>
.main {
  padding: 20px 0;
}
</style>

实现

<template>
  <div class="kl-tab">
    <div class="kl-table-line"></div>
    <div
      v-for="(item, index) in tabOptions"
      :key="item.comName"
      :class="[activeName === item.comName ? 'tab-active' : '', 'kl-tab-pane']"
      @click="changeTable(index)"
    >
      {{ item.tabName }}
    </div>
  </div>
</template>

<script>
export default {
  name: 'demo',
  props: {
    tabOptions: {
      type: Array,
      default: []
    },
    activeName: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      currentTabWidth: 56,
      tablePaneArr: [], // table-plan的宽
      currentTabIndex: 0
    };
  },
  mounted() {
    this.$nextTick(() => {
      // 获取 所有tab-plan 的宽
      let els = document.querySelectorAll('.kl-tab > .kl-tab-pane');
      if (els && els.length > 0) {
        els.forEach((item) => {
          this.tablePaneArr.push(item.offsetWidth);
        });
      }

      this.setLinePos();
    });
  },
  methods: {
    // 切换tab
    changeTable(index) {
      this.activeName = this.tabOptions[index].comName;
      // 底部下划线
      this.setLinePos();
      this.$emit('change', this.activeName);
    },
    // 设置下面标签的位置
    setLinePos() {
      // 拿到当前激活的table的宽

      this.currentTabIndex = this.tabOptions.findIndex((item) => {
        return item.comName === this.activeName;
      });

      if (!this.activeName && this.currentTabIndex === -1) {
        this.currentTabIndex = 0;
      }
      this.currentTabWidth = this.tablePaneArr[this.currentTabIndex];

      let el = document.querySelector('.kl-table-line');
      if (el) {
        el.style.width = this.currentTabWidth + 'px';
        let leftWidth = 0;
        this.tablePaneArr.forEach((item, index) => {
          if (index < this.currentTabIndex) {
            leftWidth = item + leftWidth;
          }
        });

        el.style.left = leftWidth + 20 * this.currentTabIndex + 'px';
      }
    }
  }
};
</script>

<style lang="scss" scoped>
.kl-tab {
  display: flex;
  cursor: pointer;
  position: relative;
  height: 50px;
  border-bottom: 2px solid #ccc;

  .kl-table-line {
    position: absolute;
    left: 0;
    bottom: -2px;
    height: 2px;
    width: 40px;
    background-color: #409eff;
    transition: all 0.5s;
  }
  .kl-tab-pane {
    display: flex;
    align-items: center;
    height: 50px;
    line-height: 50px;
    margin-right: 20px;
    font-size: 14px;
    color: #555;
    font-weight: 600;
    &:nth-last-of-type(1) {
      margin-right: 0px;
    }
  }
}

.tab-active {
  color: #409eff !important;
}
</style>
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:10:38  更:2021-11-28 11:12:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 5:05:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码