不同风格Tabs

news2024/10/6 12:30:32

风格

通过type设置风格,支持三种风格card、borderCard、line

 

 

 核心代码

  组件双向绑定

modelVal: {
      type: Number | String,
      required: true
    },
 model: {
    prop: 'modelVal',
    event: 'change'
  }
this.$emit('change', this.active)

代码

<template>
  <div
    :class="['tabs', { 'tabs-card': type === 'card' }, { 'tabs-boder-card': type === 'borderCard' }, { 'tabs-line': type === 'line' }]"
    :style="{ 'height': height }">
    <div class="tabs-nav">
      <div v-if="type === 'line'" class="active-bar"
        :style="{ 'width': activeBarWidth + 'px', 'transform': `translateX(${moveNum}px)` }"></div>
      <div v-for="(item, index) in list" :key="index" :class="['tabs-item', { 'active': active === index }]"
        @click="switchTab(index, item)">
        {{ item[showLabel] }}
      </div>
    </div>
  </div>
</template>
<script>
export default {
  props: {
    type: {
      type: String,
      default: 'card' // card borderCard line
    },
    list: {
      type: Array,
      default: () => []
    },
    showLabel: {
      type: String,
      default: 'label'
    },
    modelVal: {
      type: Number | String,
      required: true
    },
    height: {
      type: String,
      default: '42px'
    }
  },
  model: {
    prop: 'modelVal',
    event: 'change'
  },
  data() {
    return {
      active: Number(this.modelVal),
      moveNum: 0, // 移动距离
      activeBarWidth: 0 // line风格下状态条宽
    }
  },
  watch: {
    'list': {
      handler() {
        this.$nextTick(() => {
          let li = document.querySelectorAll('.tabs>.tabs-nav>.tabs-item')[0]
          this.activeBarWidth = li ? li.offsetWidth : 0
        })
      },
      immediate: true
    }
  },
  methods: {
    switchTab(index, item) {
      this.active = index
      if (this.type === 'line') {
        const lis = document.querySelectorAll('.tabs>.tabs-nav>.tabs-item')
        let num = 0
        for (let i = 0; i < this.active; i++) {
          num += lis[i].offsetWidth
        }
        this.moveNum = num
        this.activeBarWidth = lis[this.active].offsetWidth
      }
      this.$emit('change', this.active)
      this.$emit('switchTab', { active: this.active, row: item })
    }
  }
}
</script>
<style lang="scss" scoped>
.tabs {
  width: 100%;
  font-size: 16px;
  font-weight: 400;
  font-family: PingFangSC-Regular, PingFang SC;
  color: #333333;
}

@import url('./tabsCard.scss');
@import url('./tabsBorderCard.scss');
@import url('./tabsLine.scss');
</style>

scss

tabsBorderCard.scss

.tabs-boder-card {
  border-bottom: 1px solid #E5E7ED;

  .tabs-nav {
    display: flex;

    .tabs-item {
      padding: 10px 25px;
      border: 1px solid #E5E7ED;
      background-color: #F6F6F6;
      cursor: pointer;
      box-sizing: border-box;
    }

    .active {
      color: #36CFC9;
      border-top: 2px solid #36CFC9;
      border-bottom: none;
      background-color: #fff;
    }
  }
}

tabsCard.scss

.tabs-card {
  border-bottom: 1px solid #36CFC9;

  .tabs-nav {
    height: 100%;
    display: flex;

    .tabs-item {
      height: 100%;
      padding: 0 10px;
      line-height: 42px;
      cursor: pointer;
      box-sizing: border-box;
    }

    .active {
      color: #FFFFFF;
      background: #36CFC9;
      border-radius: 8px 8px 0px 0px;
    }
  }
}

tabsLine.scss

.tabs-line {
  border-bottom: 2px solid #ECECEC;

  .tabs-nav {
    display: flex;
    position: relative;

    .tabs-item {
      padding: 10px 16px;
      cursor: pointer;
      box-sizing: border-box;
    }

    .active {
      color: #36CFC9;
    }

    .active-bar {
      height: 2px;
      position: absolute;
      bottom: -2px;
      left: 0;
      background-color: #36CFC9;
      transition: all 0.5s ease;
    }
  }
}

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

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

相关文章

【链表OJ 1】移除链表元素val

大家好&#xff0c;欢迎来到我的博客&#xff0c;此题是关于链表oj的第一题&#xff0c;此后还会陆续更新博客&#xff0c;如有错误&#xff0c;欢迎大家指正。 来源:https://leetcode.cn/problems/remove-linked-list-elements/description/ 题目: 方法一:定义prev和cur指针…

基于STM32微控制器的物联网(IoT)节点设计与实现

基于STM32微控制器的物联网(IoT)节点的设计和实现。我们讨论物联网节点的基本概念和功能,并详细介绍了STM32微控制器的特点和优势。然后,我们将探讨如何使用STM32开发环境和相关的硬件模块来设计和实现一个完整的物联网节点。最后,我们将提供一个示例代码,展示如何在STM3…

侯捷 C++面向对象编程笔记——9 复合 委托

9 复合 委托 9.1 Composition 复合 类似于c中结构里有结构——class里有class deque 是一个已经存在的功能很多的类&#xff08;两头进出的队列&#xff09;&#xff1b;利用deque的功能来实现queue的多种操作 该例只是复合的一种情况——设计模式 Adapter 9.1.1 复合下的构造…

【JavaEE进阶】Spring创建与使用

文章目录 一. 创建 Spring 项目1.1 创建一个Maven项目1.2 添加Spring依赖1.4. 创建一个启动类 二. 将 Bean 对象存放至 Spring 容器中三. 从 Spring 容器中读取到 Bean1. 得到Spring对象2. 通过Spring 对象getBean方法获取到 Bean对象【DI操作】 一. 创建 Spring 项目 接下来使…

实时服务器监控

为 IT 基础架构建立适当的监控系统的重要性不容低估&#xff0c;管理员使用的监控解决方案可确保通过消除瓶颈和优化资源使用以获得最佳性能来充分发挥基础架构的潜力。 多年来&#xff0c;IT 基础架构变得越来越复杂&#xff0c;对网络监控的需求也随之增加&#xff0c;虽然网…

R语言3_安装SeurateData

环境Ubuntu22/20, R4.1 在命令行中键入&#xff0c; apt-get update apt install libcurl4-openssl-dev libssl-dev libxml2-dev libcairo2-dev libgtk-3-dev # libcairo2-dev :: systemfonts # libgtk :: textshaping进入r语言交互环境&#xff0c;键入&#xff0c; instal…

运动蓝牙耳机哪个最好、最好用的运动蓝牙耳机推荐

在奔跑的律动中&#xff0c;一款优秀的运动耳机能为我们带来动力。今天&#xff0c;我为大家推荐五款经过精心挑选的运动耳机&#xff0c;它们不仅具备卓越的音质和稳定的连接性&#xff0c;还采用舒适的佩戴设计和耐用的防水功能&#xff0c;可以让我们在运动中畅享音乐的同时…

数据结构之栈和队列---c++

栈和队列的简单介绍 栈 栈是一个“先进后出”结构 队列 入队演示 队列是一种“先进先出”的结构 出队演示 接下来我们开始本次的内容 栈实现队列 分析 1.我们可以老老实实的写一个栈然后将所有的接口函数实现出来&#xff0c;最后再进行实现队列&#xff0c;但是显然…

git开发过程中的使用

1、先创建本地分支&#xff0c;然后修改代码 2、本地提交 push 3、合并为主分支 回到master分支

【【萌新的STM32 学习-6】】

萌新的STM32 学习-6 BSP 文件夹&#xff0c;用于存放正点原子提供的板级支持包驱动代码&#xff0c;如&#xff1a;LED、蜂鸣器、按键等。 本章我们暂时用不到该文件夹&#xff0c;不过可以先建好备用。 CMSIS 文件夹&#xff0c;用于存放 CMSIS 底层代码&#xff08;ARM 和 ST…

Linux——设备树

目录 一、Linux 设备树的由来 二、Linux设备树的目的 1.平台识别 2.实时配置 3.设备植入 三、Linux 设备树的使用 1.基本数据格式 2.设备树实例解析 四、使用设备树的LED 驱动 五、习题 一、Linux 设备树的由来 在 Linux 内核源码的ARM 体系结构引入设备树之前&#x…

Vue——webpack

webpack 一、Install1.全局安装2.局部安装 二、总结1.打包2.定义脚本3.配置文件定义&#xff08;webpack.config.js)4.项目重新加载依赖5.webpack打包Css6.style-loader 一、Install 1.全局安装 npm install webpack webpack-cli -g2.局部安装 以项目为单位&#xff0c;一个项…

2023中国数字人力峰会|用「消失的Ta」解读数字化人效管理

7月28日&#xff0c;DHR公会主办的「2023中国数字人力峰会」在北京顺利举办。盖雅工场联合创始人兼CEO章新波带来主题为「消失的它」的精彩分享。以下为分享内容&#xff1a; 近期&#xff0c;大家都在讨论消失的Ta&#xff0c;我也想借此话题举几个例子&#xff0c;聊聊对于企…

thinkphp8.0多应用模式下提示控制器不存在

thinkphp 8.0 开启多应用模式 1、按照官方文档说明 &#xff0c;已经安装了 think-multi-app composer require topthink/think-multi-app 2、控制器的命名空间也没写错。 3、访问路径与目录名、控制器、方法名一样&#xff0c;访问地址是没错的。 4、网上有说&#xff0c;在…

实现vscode上用gdb调试stm32

实现vscode上用gdb调试stm32 这周负责编写设备的某个模块&#xff0c;其中遇到了一些变量地址不正确的错误&#xff0c;按理这种底层变量错误用gdb一类的调试器就能很快查到&#xff0c;可是初入嵌入式一行&#xff0c;此C语言非彼C语言&#xff0c;对于gdb怎么对接到项目上根…

冠达管理投资前瞻:三星加码机器人领域 大信创建设提速

上星期五&#xff0c;沪指高开高走&#xff0c;盘中一度涨超1%打破3300点&#xff0c;但随后涨幅收窄&#xff1b;深成指、创业板指亦强势震动。截至收盘&#xff0c;沪指涨0.23%报3288.08点&#xff0c;深成指涨0.67%报11238.06点&#xff0c;创业板指涨0.95%报2263.37点&…

vue 在方法里用字符串赋值图片路径获取不到,提示找不到图片

原因 直接通过字符串赋值命名路径是不会生效的&#xff0c;如 this.file1"../assets/addmodel/TAR.png" 因为在Vue模板中直接使用字符串赋值的方式不会被解析为正确的资源路径。 你可以使用动态绑定&#xff08;v-bind 或简写为 :&#xff09;来设置图片的路径。…

基于Spring Boot的医院预约挂号网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的医院预约挂号网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

边写代码边学习之LSTM

1. 什么是LSTM 长短期记忆网络 LSTM&#xff08;long short-term memory&#xff09;是 RNN 的一种变体&#xff0c;其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径&#xff0c;让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲&a…

K8S系列文章之 使用Kind部署K8S 并发布服务

简单介绍 kind 即 Kubernetes In Docker&#xff0c;顾名思义&#xff0c;就是将 k8s 所需要的所有组件&#xff0c;全部部署在一个docker容器中&#xff0c;是一套开箱即用的 k8s 环境搭建方案。使用 kind 搭建的集群无法在生产中使用&#xff0c;但是如果你只是想在本地简单…