分享一个 VUE 侧边导航共用组建

news2024/9/21 20:36:40

项目效果图:

项目描述:加载组建时,隐藏,鼠标滑动到指定区域的时候该菜单选中高亮,点击菜单跳转到指定模块,每个页面都适用。
在这里插入图片描述

html 部分:

提示:我这里有英文所以有$i18n.locale==='zh' 判断,使用的时候按照个人项目情况使用。

 <div class="left-nav-box" ref="nav-box">
    <div class="nav">
      <div class="line">
        <div class="sub-line active" :style="`margin-top: ${active*0.152}rem`"></div>
      </div>
      <ul>
        <li v-for="(item,index) in menu"
            :key="item.name" @click="tabClick(item,index)"
            :style="`color:${active===index?'#fff':'rgba(255, 255, 255, 0.70)'}`"
        >
          {{ $i18n.locale === 'zh' ? item.title : item.titleEn }}
        </li>
      </ul>
    </div>
  </div>

css部分:

.left-nav-box {
  position: fixed;
  top: 220px;
  left: 20px;
  z-index: -1;
  //display: none;
  opacity: 0;
  transition: 0.3s ease-in-out;
}

.line {
  background: rgba(255, 255, 255, 0.26);
  width: 4px;
  border-radius: 4px 4px 4px 4px;
  overflow: hidden;

  .sub-line {
    width: 4px;
    height: 32px;
    background: #1874F6;
    border-radius: 4px;
  }
}

.active {
  transition: 0.3s ease-in-out;
}

.nav {
  display: flex;
  padding: 12px;
  font-size: 15px;
  min-width: 200px;
  background: rgba(0, 0, 0, 0.26);
  border-radius: 4px 4px 4px 4px;
  opacity: 1;
  border: 1px solid rgba(255, 255, 255, 0.3);
  backdrop-filter: blur(25px);

  ul {
    width: 100%;
  }

  li {
    width: 100%;
    font-weight: 700;
    color: rgba(255, 255, 255, 0.7);
    display: block;
    cursor: pointer;

    &:hover {
      color: #fff;
    }

    margin-bottom: 9px;
    margin-left: 12px;

    &:last-child {
      margin-bottom: 0;
    }
  }
}

侧边栏json部分:

//注意:1: 数组的key名,需要根据组建的name来设置
//     2: 侧边菜单什么时候出现需要,在使用的组建中设置 id = 组建的name
//     3: 点击的链接需要在组建中设置 id= name.url(name:组建的name即home.url)
//     4: 需要在页面显示,设置菜单json数组就可以了
export default {
    home:[
        {url:'tab1',title:"xxxx",titleEn:"xxxx"},
        {url:'tab2',title:"xxxx",titleEn:"xxxx"},
    ]
}

js部分:

import menu from "../LeftTabs/leftMenu"
export default {
  name: "leftNav",
  data() {
    return {
      menuLeft: menu,
      active: 0,
      num: 0,
      top: []
    }
  },
  props: {
    menu: {
      type: Array,
      default: []
    },
    startMouse: {
      type: String,
      default: '#tab1'
    }
  },
  mounted() {
    this.getLoad();
  },
  watch: {
    $route: {
      handler: function () {
        this.getLoad()
      }
    }
  },
  methods: {
    getLoad() {
      this.top = [];
      if (this.menuLeft[this.$route.name]) {
        this.menuLeft[this.$route.name].forEach((item, index) => {
          this.num = index;
          //获取每个侧边菜单距离顶部的距离
          this.top[index] = document.getElementById(item.url).offsetTop;
        })
        window.addEventListener("scroll", this.scrollDown)
      } else {
        window.removeEventListener('scroll', this.scrollDown)
      }
    },
    scrollDown() {
      //获取从哪里开始显示侧边栏
      let top = document.getElementById(this.startMouse);
      if (top) {
        let scrollTop =
            window.pageYOffset ||
            document.documentElement.scrollTop ||
            document.body.scrollTop;
        //获取菜单的每一项的小于鼠标滑动的距离顶部的高度
        let item = this.top.filter(item => item < scrollTop);
        // 排序取最大的一个
        let numTxt = item.sort((a, b) => b - a)[0];
         // 取最大的一个的索引
        let index = this.top.findIndex(item => item === numTxt);
        // 默认选中
        this.active = isUndefined(numTxt) ? 0 : (numTxt < scrollTop ? index : this.num);
        if (top.offsetTop < scrollTop) {
          this.mouseShow();
        } else {
          this.mouseHide();
        }
      }
    },
    tabClick(item, index) {
      this.active = index;
      let tab = document.getElementById(item.url);
      tab?.scrollIntoView();
    },
    mouseShow() {
      let flag = this.$refs["nav-box"];
      flag.style.opacity = '1';
      flag.style.zIndex = '2004';
    },
    mouseHide() {
      let flag = this.$refs["nav-box"];
      flag.style.opacity = '0';
      flag.style.zIndex = '-1';
    }
  }
}

应用:

提示:这里我是写在全局的layout里面,因为的的项目用的地方比较多。可根据自己的项目更改

import leftMenu from '@/components/LeftTabs/leftMenu'

<leftNav :menu="menuList"
         :startMouse="start"  
         v-if="menuList!==''"
/>

export default {
  data() {
    return {
      menuList:leftMenu[this.$route.name],
      start:this.$route.name,
      show: true
    }
  },
  components: {
    leftNav
  },
  mounted() {
    this.getList();
  },
  watch: {
    $route: {
      handler: function () {
        this.getList();
      },
      deep:true
    },
  },
  methods:{
    getList(){
      this.menuList = leftMenu[this.$route.name] || "";
      this.start = this.$route.name;
    }
  }
}
//id="home" 一定要组建的name
 <div class="home-top" id="home">
 </div>
 //锚点滚动到指定位置,此id需要在json数组中的url定义的一致
  <div class="home-tab1" id="tab1">
 </div>
  <div class="home-tab2" id="tab2">
 </div>

总结:

好记性, 不如乱笔头,记个笔记。
第一:可能自己以后能用到
第二:可能帮助到有需要的人

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

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

相关文章

UniPro助力金融企业数字化转型 强化项目协作与跟踪

根据一份来自Standish Group的研究报告&#xff08;"CHAOS Report"&#xff09;&#xff0c;该报告对美国各行业的项目进行了调查&#xff0c;结果显示仅有不到一半&#xff08;约44%&#xff09;的项目能够成功按时完成&#xff0c;并达到预期的业务目标。其中&…

行云管家荣获CFS第十二届财经峰会 “2023产品科技创新奖”

7月26日至27日&#xff0c;CFS第十二届财经峰会暨2023可持续商业大会在京盛大召开。峰会主题为“激活高质量发展澎湃活力”&#xff0c;超1000位政商领袖、专家学者、企业及媒体代表出席了本次盛会&#xff0c;共同分享新技术新产品新趋势、研判全球新挑战与新变局下企业的机遇…

掌握文件重命名快捷键,使用替换功能轻松删除文件名中的符号!

您是否经常面对繁琐的文件重命名工作&#xff1f;是时候掌握一些文件管理的小技巧&#xff0c;让您的工作更加高效便捷了&#xff01;现在&#xff0c;我们向您介绍一种简单的方法&#xff0c;通过文件重命名快捷键和替换功能&#xff0c;轻松删除文件名中的符号&#xff01; …

【chap6-字符串】用Python3刷《代码随想录》

字符串是由若干字符组成的有限序列&#xff0c;也可以理解为一个字符数组 344. 反转字符串 344. 反转字符串 思路&#xff1a;双指针法。定义两个指针&#xff08;即索引下标&#xff09;&#xff0c;一个从字符串前面&#xff0c;一个从字符串后面&#xff0c;两个指针同时…

机器学习:监督学习、无监督学习、半监督学习、强化学习

1 引言 机器学习是一种人工智能领域的技术&#xff0c;它旨在让计算机通过学习数据和模式&#xff0c;而不是明确地进行编程来完成任务。机器学习分为监督学习&#xff08;Supervised Learning&#xff09;、无监督学习&#xff08;Unsupervised Learning&#xff09;、半监督…

算法笔记(Java)——动态规划

动态规划方法论 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#x…

网络安全策略应包含哪些?

网络安全策略是保护组织免受网络威胁的关键措施。良好的网络安全策略可以确保数据和系统的保密性、完整性和可用性。以下是一个典型的网络安全策略应包含的几个重要方面&#xff1a; 1. 强化密码策略&#xff1a;采用强密码&#xff0c;要求定期更换密码&#xff0c;并使用多因…

form-data 提交文件请求远程调用

文件请求方法 /*** 上传图文消息内的图片 获取url* 富文本内的图片** param file*/public static String uploadMediaGetUrl(File file) throws IOException {if (!file.exists()) {return null;}String responseData null;try {String url "http://localhost:8503/fil…

Spring Boot集成单元测试调用dao,service

文章目录 Spring Boot集成单元测试调用dao&#xff0c;service1 添加相关依赖2 新建测试类 Spring Boot集成单元测试调用dao&#xff0c;service 1 添加相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-st…

VirtualBox配置宿主机和虚拟机网络互通+外网访问

VirtualBox 版本&#xff1a;7.0 虚拟机版本&#xff1a;CentOS-7-x86_64-Everything-1804_2.iso 宿主机版本&#xff1a;Windows 10-21H2 VirtualBox 和 虚拟机安装 省略~ VirtualBox 配置 在虚拟机的【设置】选项中配置两张网卡&#xff0c;图下图所示&#xff0c;网卡一用…

Vue3 基础知识点汇总

1.vue3 基础 1.1vue3基础及创建 npm init vue@latest1.2.熟悉项目目录及关键文字 1.3 组合式API-setup 1.4.组合式 API reactive 和ref 函数 (都是为了生成响应式数据)

【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段

在工作中可能会遇到这样的场景&#xff1a;有多个GDB要素、表格&#xff0c;或者是SHP文件&#xff0c;需要给这个要素或表添加相同的多个字段。 在这种情况下&#xff0c;手动添加就变得很繁琐&#xff0c;于是就做了主个工具。 需求具体如下图&#xff1a; 左图是待处理数据…

测试的概念

测试职责 需求分析 测试分析 设计测试用例 执行测试用例 掌握自动化测试技术 验证产品是否实现了应该实现的功能,或者实现了不应该实现的功能 在整个软件生命周期中&#xff0c;测试是一个贯穿始终的过程&#xff0c;它包含了不同阶段和不同类型的测试,以此来保证软件工程的稳…

金融翻译难吗,如何做好金融翻译?

我们知道&#xff0c;金融翻译涉及企业经济这块的&#xff0c;是影响各公司发展很重要的一方面&#xff0c;翻译做得好&#xff0c;可以促进公司内外的交流&#xff0c;及时掌握各种信息&#xff0c;做好应对。那么&#xff0c;金融翻译难吗&#xff0c;如何做好金融翻译&#…

第五章 Opencv图像处理框架实战 5-3 图像阈值与平滑处理

图像阈值 ret, dst cv2.threshold(src, thresh, maxval, type) src&#xff1a; 输入图&#xff0c;只能输入单通道图像&#xff0c;通常来说为灰度图 dst&#xff1a; 输出图 thresh&#xff1a; 阈值 maxval&#xff1a; 当像素值超过了阈值&#xff08;或者小于阈值&am…

【C进阶】回调函数(指针进阶2,详解,小白必看)

目录 6. 函数指针数组 6.1简单计算器 6.2函数指针数组实现计算器 7. 指向函数指针数组的指针(仅作了解即可) 8.回调函数 8.1关于回调函数的理解​编辑 8.1.1用回调函数改良简单计算器 8.2qsort库函数的使用 8.2.1冒泡排序 8.2.2qsort的概念 8.3冒泡排序思想实现qsor…

数据结构--基础知识

数据结构是什么&#xff1f; 数据结构是计算机科学中研究数据组织、存储和管理的方法和原则。它涉及存储和操作数据的方式&#xff0c;以便能够高效地使用和访问数据。 相关内容 基本组成 数组&#xff08;Array&#xff09;&#xff1a;数组是一种线性数据结构&#xff0c;…

MySql005——使用SQL创建数据库和表

在《MySql000——MySql数据库的下载、安装以及使用图形化工具创建数据库和表》中&#xff0c;我们使用图形化工具MySQL Workbench创建数据库和表&#xff0c;下面我们将使用SQL来实现这一过程 一、数据库操作 1.1、创建数据库 1.1.1、创建MySQL数据库通用写法 使用 create 命…

ts一些常用符号

非空断言操作符(!) 具体是指在上下文中当类型检查器无法断定类型时&#xff0c;一个新的后缀表达式操作符 ! 可以用于断言操作对象是非 null 和非 undefined 类型。具体而言&#xff0c;x! 将从 x 值域中排除 null 和 undefined 。 1. 赋值时忽略 undefined 和 null function…

Simulink仿真模块 - Saturation Dynamic

Saturation Dynamic将输入信号限制在动态饱和上界和下界值之间 在仿真库中的位置为&#xff1a;Simulink / Discontinuities 模型为&#xff1a; 说明 Saturation Dynamic 模块产生输出信号&#xff0c;该信号是以来自输入端口 up 和 lo 的饱和值为界的输入信号的值。 输入输…