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

chatgpt/2023/9/24 2:26:58

项目效果图:

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

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.exyb.cn/news/show-5314558.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

面试之多线程案例(四)

1.单例模式 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时&#xff0c;为了防止频繁地创建对象使得内存飙升&#xff0c;单例模式可以让程序仅在内存中创建一个对象&#xff0c;让所有需要调用的地方都共享这一单例对象。…

vlan access, trunk, hybrid (tagged/untagged) 笔记

vlan 接口和配置 PVID&#xff08;port vlan ID&#xff09; 定义 pvid 主要目的&#xff1a; 当交换机接口收到没有 vlan tag 标签的包时&#xff0c;接口会将定义的 pvid 作为当前包的 vlan id。当对映 pvid vlan 的包&#xff0c;通过当前交换机接口发出时&#xff0c;接…

IDEA中连接虚拟机 管理Docker

IDEA中连接虚拟机 管理Docker &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮…

SQL注入之布尔盲注

SQL注入之布尔盲注 一、布尔盲注介绍二、布尔盲注的特性三、布尔盲注流程3.1、确定注入点3.2、判断数据库的版本3.3、判断数据库的长度3.4、猜解当前数据库名称&#xff08;本步骤需要重复&#xff09;3.5、猜解数据表的数量3.6、猜解第一个数据表名称的长度3.7、猜解第一个数据…

数据结构--基础知识

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

【Python】Python使用TK实现动态爱心效果

【Python】Python使用Tk实现动态爱心效果 画布使用了缓存机制&#xff0c;启动时绘制足够多的帧数&#xff0c;运行时一帧帧地取出来展示&#xff0c;明显更流畅&#xff0c;加快了程序执行速度。将控制跳动动画的函数从正弦函数换成了贝塞尔函数&#xff0c;贝塞尔函数更灵活…

多模块Springboot项目maven单独打包子模块

背景介绍 最近接手一个项目代号XXL&#xff0c;是一个多模块的Springboot项目&#xff0c;在解决了线上的bug之后&#xff0c;想单独给子模块打包上线部署&#xff0c;问题来了。如果整个工程一起mvn -X -DskipTests clean package&#xff0c;打包出来的XXL-web.jar是可以正常…

【LeetCode每日一题】——766.托普利茨矩阵

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【题目进阶】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 766.托普利茨矩阵 四【题目描述…
推荐文章