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

这篇具有很好参考价值的文章主要介绍了分享一个 VUE 侧边导航共用组建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目效果图:

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

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>

总结:

好记性, 不如乱笔头,记个笔记。
第一:可能自己以后能用到
第二:可能帮助到有需要的人文章来源地址https://www.toymoban.com/news/detail-621929.html

到了这里,关于分享一个 VUE 侧边导航共用组建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vane 一个适用于前端打工人的全栈框架,nodejs+vue3+typescript

    写这个的初衷是因为每次用node写接口的时候总是需要一些写大一堆的东西, 也有些人把很多接口都放在一个js文件内, 看起来很是杂乱, 后来用到nuxt写的时候, 感觉用文件名来命名接口路径很是方便, 无论是query参数还是params参数,都可以通过文件名来命名, 也可以通过文件夹层级

    2024年02月11日
    浏览(48)
  • vue + element ui 实现侧边栏导航栏折叠收起

    首页布局如下 要求点击按钮,将侧边栏收缩, 通过 row 和 col 组件,并通过 col 组件的 span 属性我们就可以自由地组合布局。 侧边栏代码  效果 补充路由:    

    2024年02月11日
    浏览(43)
  • vue2+element-ui实现侧边导航栏

    编写 client/src/components/LeftMenu.vue ,创建侧边导航栏: 编辑 client/src/views/Index.vue ,引入侧边导航栏:

    2024年02月02日
    浏览(48)
  • Vue读取本地静态.md并侧边栏导航跳转、展示.md文件

    vue markdown 侧边栏导航跳转 类似锚点跳转 - 灰信网(软件开发博客聚合) Vue使用mavon-editor插件解析markdown编辑预览_onpine的博客-CSDN博客 vue组件直接读取.md文档展示_vue项目中读取readme文件_小蒜瓣的博客-CSDN博客vue中使用mavonEditor(markdown编辑器插件)_兮赫的博客-CSDN博客 文档 mav

    2024年02月14日
    浏览(49)
  • Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(开发导航栏及公共部分)

    系列内容 参考链接 基于 Vue3.x + Vant UI 的多功能记账本(一) 项目演示,涉及知识点 基于 Vue3.x + Vant UI 的多功能记账本(二) 搭建开发环境 Vue3 + Vant UI_多功能记账本 1、底部导航栏 components 文件夹下,创建 NavBar.vue 组件 NavBar.vue 详细内容请看代码和注释 van-tabbar-item 为标签栏

    2024年02月02日
    浏览(57)
  • 【Vue项目搭建】修改【若依框架】的侧边栏、导航栏、面包屑样式、修改全局页面样式

    掌握分寸感,找目标一致的人协同你,有效地调配资源,就可以提高效率。 写在前面的话 :博主最近想要搭建自己的前端若依项目,因此此系列博客会做一些记录。我的项目gitee地址: https://gitee.com/xuruicong/rachel-front-show 说明:只运行前端项目,只需要要下载官方项目http:

    2024年01月19日
    浏览(104)
  • Vue - 完美解决 Element UI 侧边导航菜单 <el-menu> 出现滚动条,去掉 Element 侧边导航组件的横纵滚动条(但滚动功能依然保留,仅仅是去掉 “滚动条“)100% 解决方案

    网上的教程都不好使(甚至还有的提议在全局去掉,这么做万一需要怎么办?),本文可完美 100% 解决,代码简洁高效。 本文实现了 Element UI 组件库中,去掉 NavMenu 侧边导航菜单组件出现的滚动条! 并且是 “局部” 的,也就是说只去掉本页侧边栏菜单的滚动条,不会影响全

    2024年02月11日
    浏览(68)
  • vue 实现多个路由共用同一个页面组件

    这样的弊端是如果router-view里包含其他组件,切换其他组件会让其他组件也重新渲染。 这样的问题是导致切换路由会闪烁一下。因为切换后所有钩子函数都重新触发了。

    2024年02月07日
    浏览(62)
  • 多个Vue项目如何共用一个node_modules

    多个项目共同用一个项目的node_modules 问题:多个vue项目的node_modules依赖包相同,怎么共用同一个node_modules依赖包? 1.以管理员身份打开命令窗口cmd 2.输入命令:mklink /d 需要链接的项目地址 引用的源文件项目地址 1.如:源文件项目地址为:D:worksourceFilenode_modules 2.如:需要链

    2024年02月04日
    浏览(49)
  • vue3.0+element Plus实现页面布局,侧边栏菜单路由跳转

    一. 先在router.js文件中配置路由,将侧边栏中需要跳转的页面都添加到children中 二. 在view目录下新建一个文件,里面包含侧边栏要跳转的页面 三.  页面样式布局 1. 我选择使用自定义组件BaseLayout.vue文件来设置header和aside样式显示 也可以使用element plus中的Container 布局容器 

    2024年02月13日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包