css仿el-tabs标签页效果

news2024/12/28 21:16:04

需求:el-tabs很多时候需要改间距或者下划线上还要加组件什么的比较麻烦,手写一个自己根据需求更改即可

1.效果

2.主要代码详解

主要代码如下:active是下划线,activeitem是选中后改变字体颜色, 'item-' + (index + 1),用item来区分获取当前文字对应的距离和宽度好计算下划线的位置

 <div class="tabs_wrap">
        <div
          v-for="(item, index) in tabsList"
          :key="item.value"
          :class="[
            'item',
            'item-' + (index + 1),
            { activeitem: currentIndex === index },
          ]"
          @click="changeIndex(index)"
        >
          {{ item.label || "" }}
        </div>
        <div class="active" :style="{ left: left + 'px' }"></div>
      </div>

 选中后设置的样式,active是一个块级元素

    .active {
      position: absolute;
      left: 0;
      bottom: 0;
      width: 50px;
      height: 2px;
      background: #409eff;
      border-radius: 50px;
      transition: left 0.3s ease;
    }
    .activeitem {
      color: #409eff;
    }

3.完整代码

<template>
  <div class="container fff">
    <div class="header">
      <span style="margin-right: 20px">项目</span>

      <el-select v-model="value" @change="projectChange" placeholder="请选择">
        <el-option
          v-for="item in options"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        >
        </el-option>
      </el-select>
      <div class="tabs_wrap">
        <div
          v-for="(item, index) in tabsList"
          :key="item.value"
          :class="[
            'item',
            'item-' + (index + 1),
            { activeitem: currentIndex === index },
          ]"
          @click="changeIndex(index)"
        >
          {{ item.label || "" }}
        </div>
        <div class="active" :style="{ left: left + 'px' }"></div>
      </div>
    </div>
    <div class="main"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      active: 1,
      options: [
        {
          value: "选项1",
          label: "黄金糕",
        },
        {
          value: "选项2",
          label: "双皮奶",
        },
        {
          value: "选项3",
          label: "蚵仔煎",
        },
        {
          value: "选项4",
          label: "龙须面",
        },
        {
          value: "选项5",
          label: "北京烤鸭",
        },
      ],
      value: "",
      currentIndex: 0,
      left: 0,
      tabsList: [
        {
          label: "1分析",
          value: "1",
        },
        {
          label: "2分析",
          value: "2",
        },
        {
          label: "3分析",
          value: "3",
        },
        {
          label: "4分析",
          value: "4",
        },
      ],
    };
  },
  mounted() {
    this.initPostion(0);
  },
  methods: {
    initPostion(index) {
      let currentItem = document.querySelector(".item-" + (index + 1));
      let activeItem = document.querySelector(".active");
      console.log(currentItem.offsetWidth);
      console.log(activeItem.offsetWidth);

      // 计算下划线位置
      this.left =
        currentItem.offsetWidth * index +
        (currentItem.offsetWidth - activeItem.offsetWidth) / 2;
      console.log(this.left);
    },

    changeIndex(index) {
      if (this.currentIndex === index) return;

      this.currentIndex = index;
      this.initPostion(index);
    },
  },
};
</script>

<style lang="scss" scoped>
.container {
  box-sizing: border-box;
  box-shadow: $base-box-shadow;
  padding: 10px 20px;
  .header {
    height: 60px;
    border-bottom: 1px solid #ebf3fc;
    display: flex;
    align-items: center;
    font-family: Microsoft YaHei;
    font-weight: 400;
    font-size: 14px;
    color: #313035;
    .tabs_wrap {
      width: 500px;
      position: relative;
      display: flex;
      align-items: center;
      justify-content: space-around;
      // font-size: 14px;
      height: 60px;
      line-height: 60px;
    }

    .item {
      cursor: pointer;
      flex: 1;
      text-align: center;
    }
    .active {
      position: absolute;
      left: 0;
      bottom: 0;
      width: 50px;
      height: 2px;
      background: #409eff;
      border-radius: 50px;
      transition: left 0.3s ease;
    }
    .activeitem {
      color: #409eff;
    }
  }
  .main {
    width: 100%;
    // border: 1px solid red;
    height: calc(100% - 60px);
  }
}
</style>

文章到此结束,希望对你有所帮助~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用.net core简易搭建webapi托管到IIS

1、从官网下载.NET Core 托管捆绑包 https://learn.microsoft.com/zh-cn/aspnet/core/tutorials/publish-to-iis?viewaspnetcore-8.0&tabsvisual-studio 2、新建ASP.NET Core WEB API项目 新建控制器TestController并生成GetInfo方法 3、发布 目标路径选择 2)显示所有…

花小钱、办大事的巴黎奥运会,能学点啥?|易搭云

“获得奥运会举办权的竞争几乎和体育赛事本身一样激烈。”众所周知&#xff0c;奥运会不仅能带来巨大的经济效益&#xff0c;更是国家实力和文化底蕴的彰显。时隔百年&#xff0c;奥运会的主会场又回到了巴黎&#xff0c;以浪漫著称的巴黎&#xff0c;奥运会突出的关键词却变成…

使用Cisco进行模拟RIP路由协议配置

实验四 RIP路由协议配置 文章目录 实验四 RIP路由协议配置1.实验目的2.实验流程3.RIPv1实验步骤4.RIPv2实验步骤 1.实验目的 1&#xff09;理解RIP路由的原理 2&#xff09;掌握RIP路由的配置方法 2.实验流程 开始→布置拓扑→配置IP地址→配置并验证RIPv1→配置并验证RIPv2…

SQL-锁

一.锁的介绍 锁是计算机协调多个进程或线程并发访问一资源的机制。在数据中,除传统的计算资源(CPU,RAM,I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因…

[io]进程间通信 -信号概念、分类、工作原理

概念、工作原理&#xff1a; 信号是一种异步通信机制&#xff0c;用于在不同进程之间传递事件信息 信号的产生&#xff1a;包括对前台进程用户输入&#xff08;CtrlC&#xff09;、系统状态变化硬件异常&#xff08;如内存访问错误&#xff09;、终端系统调用&#xff08;kil…

【JVM基础13】——垃圾回收-详细聊一下G1垃圾回收器

目录 1- 引言&#xff1a;G1垃圾回收器2- ⭐核心&#xff1a;详解 G1 垃圾回收器2-1 概述G1垃圾回收器2-2 新生代垃圾回收 Young Collection第一次新生代垃圾回收第二次新生代垃圾回收 2-3 并发标记阶段 Young Collection Concurrent Mark2-4 Mixed Collection&#xff08;混合…

中影国际影城使用的多联机空调集中管理系统

多联机空调集中管理系统 建筑能耗约占我国经济总能耗的30&#xff05;&#xff0c;而空调能耗占据建筑物总能耗的50%-70%&#xff0c;即中央空调的能耗约占国民经济能耗的两成。多联机集中控制管理系统&#xff0c;在节能降耗方面具有杰出的性能。 项目案例&#xff1a;中影国…

安卓控件RecyclerVieW

文章目录 导入依赖简单使用实现横向滚动瀑布式 RecyclerView是官方在5.0之后新添加的控件&#xff0c;推出用来替代ListView和GridView的列表控件。为了保证RecyclerView在所有Android系统版本上都能使用。Google将RecyclerView控件定义在了AndroidX中&#xff0c;只需要在项目…

三品PLM项目管理系统与CAD集成的实施指南

随着信息化技术的飞速发展&#xff0c;PLM产品生命周期管理系统与CAD三维计算机辅助设计软件的集成已成为企业研发创新的关键。本文将探讨PLM与三维CAD集成的重要性、实施要素、策略以及实际应用案例&#xff0c;为企业信息化建设提供参考。 PLM与三维CAD集成&#xff1a;信息化…

SQL进阶技巧:有序行转列问题如何保证不同字段内容有序性及内容一一对应?【collect_list函数有序性保证问题】

目录 0 问题描述【小红书面试题】 1 数据准备 2 问题分析 3 小结 0 问题描述【小红书】 有如下需求,需要将左边的表变换成右边的表,注意字段内容的顺序及对应内容的一致性。 第一个字段为name,第二个字段为subject,第三个字段为score,变换后要求subject按照语文、数学…

揭秘——DNS究竟是什么?

我们来聊聊网络世界中的一个重要角色——DNS。准备好了吗&#xff1f;让我们一起揭开DNS的神秘面纱吧&#xff01; DNS是什么&#xff1f; DNS&#xff0c;全称为域名系统&#xff08;Domain Name System&#xff09;&#xff0c;是互联网的一项核心服务。简单来说&#xff0…

IP地址HTTPS证书怎么申请?

IP地址证书的申请和部署是网络安全领域中一个特定而重要的环节&#xff0c;主要针对那些没有域名但需要确保通信安全的场景。下面将深入探讨IP地址证书申请部署的特点&#xff0c;包括无需域名、简化管理、准确填写信息、验证所有权、安装配置和测试验证等步骤。具体分析如下&a…

简单易懂的LLM三角原则,让你轻松开发大模型应用

不少朋友偷偷问我&#xff1a;“什么是LLM的三角原则&#xff1f;”今天就给大家仔细讲讲构建LLM应用的三角原则。这套原则其实不复杂&#xff0c;由“31”(一范式三原则)个基础组成&#xff0c;适合任何团队来实践。 说到以LLM为核心的应用&#xff0c;有不少人以为是高大上的…

每日期刊分享

检索:知网 G4 刊期:24年底版面; 收稿范围:收小学、初中、高中学段标准的教学设计、教学案例、教学 活动、教学反思、说课&#xff0c;教育故事稿件) 备注:不需要摘要、关键词等部分;参考20%内;理论稿多增加课本实 例 。

浏览器用户文件夹详解 - Secure Preferences(十一)

1.Secure Preferences简介 1.1 什么是Secure Preferences文件&#xff1f; Secure Preferences文件是Chromium浏览器中用于存储用户敏感信息和安全设置的一个重要文件。每当用户在浏览器中保存密码、设置安全选项或进行其他敏感操作时&#xff0c;这些信息都会被记录在Secure…

下一代 AI 搜索引擎 MindSearch:多智能体 + 系统2,模拟人类认知过程的 AI 搜索引擎

下一代 AI 搜索引擎 MindSearch&#xff1a;多智能体 系统2&#xff0c;模拟人类认知过程的 AI 搜索引擎 提出背景解法拆解实验评估开放集封闭集问答 论文大纲怎么进一步改进 MindSearch&#xff1f;1. 组合&#xff08;Combination&#xff09;2. 拆开&#xff08;Disassembl…

【iOS】class的底层结构总结

class的结构 方法缓存 我们先来整体看一下结构 class类中只有isa指针、superClass、cache方法缓存、bits具体的类信息 bits & FAST_DATA_MASK 指向一个新的结构体Class_rw_t&#xff0c; 里面包含着methods方法列表、properties属性列表、protocols协议列表、class_ro_…

C# 设计模式之外观模式

总目录 前言 在软件开发过程中&#xff0c;要完成一个功能&#xff0c;可能需要调用很多接口&#xff0c;不仅增加了代码间的耦合度&#xff0c;也增加了调试成本和维护的复杂度。不如我们把这些接口再封装一次&#xff0c;给一个很好的“外观”&#xff0c;让使用者使用更方便…

14. 计算机网络HTTPS协议(二)

1. 前言 上一章节中我们主要就 HTTPS 协议的前置知识进行介绍,下面会继续介绍 HTTPS 的通信过程以及抛出一些常见问题的探讨。因为候选人准备面试的时间和精力是比较有限的,我们在学习的过程要抓住重点,如果感觉对于细节缺乏了解,可以通过维基百科和查阅 StackOverflow 等…

美国大语言模型军事应用典型案例

源自&#xff1a;北京科技大学机械工程学院 作者&#xff1a;陈哲涵 黎学臻 注&#xff1a;若出现无法显示完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 人工智能、大数据、多模态大模型、计算机视觉、自然语言处理、数字孪生、深度强化学习 课程也可…