在我们做管理后台亦或是产品流程时,总是需要一个菜单栏或者导航栏来架起我们的产品架构,那么,如何用vue实现侧边折叠导航栏呢?接下来将一一介绍。

请先看效果演示图。

步骤1:先架构整个页面的布局,撰写html、css和js
HTML代码

<template><div id="main"><div class="content"><!-- 左边导航栏 --><div class="admin_nav col-lg-3 col-xl-2" v-show="fullWidth"><div class = "admin_nav_site"><div class="title">数据中心后台管理</div><ul v-for="(item,index) in navList" :key="index"><li @click="handleToTitle(index,item)" @mouseenter="changeTitleColor(index)" @mouseleave="removeTitleColor(index)"ref="title" :class="{active:currentSort == index}" class="col-lg-12"><div class="left_icon"><i :class="'iconfont '+item.className"></i></div><div class="middle">{{item.title}}</div><div class="right_icon"><i :class="'iconfont '+item.close"></i></div></li><li v-for="(it,idx) in item.secMenu" :key="idx" v-show="item.isSubShow" class="active1"><router-link :to="it.path" tag="a">{{it.name}}</router-link></li></ul></div></div><!-- 右边内容 --><div class="admin_content col-12 col-md-12 col-lg-12 col-xl-10"><div class="admin_header"><!-- 导航图标 --><div class="H5_item" v-show="!fullWidth"><i class="iconfont icon-daohanglan" @click="make_menu" class-name="H5-menu"></i></div><div class="user"><div class="userHead"><span><img src="../../assets/image/userhead.svg"></span><span>admin</span></div><div class="logOut"><i class="iconfont icon-tuichu"></i></div></div></div><div class="admin_body"><keep-alive><router-view /></keep-alive></div></div></div></div>
</template>

JS代码

<script>import axios from 'axios';export default {name: 'navigation',data() {return {navList: [{title: '用户管理',isSubShow: false,className: 'icon-guanliyuan1',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '工号管理',path: '/home/navigation-one/user'}, // {// name: '角色管理',// path: '/home/navigation-one/role'// }, // {// name: '权限管理',// path: '/home/navigation-one/user'// }, ]},{title: '资源管理',isSubShow: false,className: 'icon-ziyuan',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '我的收藏',path: '/home/navigation-one/user'},{name: '我的项目',path: '/home/navigation-one/role'}]},{title: '综合管理',isSubShow: false,className: 'icon-zonghe',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '划配管理',path: '/home/navigation-one/user'},{name: '数据信息',path: '/home/navigation-one/role'}]},{title: '系统消息',isSubShow: false,className: 'icon-xiaoxi',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '实时动态',path: '/home/navigation-one/user'},{name: '过去动态',path: '/home/navigation-one/role'}]}],currentSort: 0,pagetype: "index",fullWidth: true,dismenu: true}},methods: {active(index) {this.currentSort = index;},changeTitleColor(index) {this.currentSort = index;},removeTitleColor(index) {this.currentSort = null;},handleToTitle(ind, item) {this.navList[ind].isSubShow = !this.navList[ind].isSubShow;if (this.navList[ind].isSubShow == true) {this.navList[ind].close = 'icon-zhedie';} else {this.navList[ind].close = 'icon-close';}}}}
</script>

CSS代码

    #main {background: #F0F6FF;font-size: 0.16rem;}#main .content {display: flex;flex-direction: row;}.content .admin_nav {min-height: 9.37rem;max-height: 1.3rem;padding: 0 !important;background: #364150;position: relative;}.content .admin_nav .admin_nav_site{height: 100vh;}.content .admin_nav .title {height: 1.39rem;line-height: 1.39rem;background: rgba(63, 73, 86, 1);color: #FFFFFF;text-align: center;font-size: 0.18rem;display: flex;justify-content: center;}.content .admin_nav .title div {padding: 0 0.03rem;}.content .admin_nav .title div:first-child i {font-size: 0.18rem;}.content .admin_nav ul .active {background: rgba(68, 81, 99, 1);}.content .admin_nav ul .active1 a.router-link-active {color: #fff;}.content .admin_nav ul li {height: 0.6rem;display: flex;flex-direction: column;justify-content: center;align-items: center;font-size: 0.18rem;}.content .admin_nav ul li a {color: #cecdc5;cursor: pointer;}.content .admin_nav ul li:first-child {font-size: 0.2rem;height: 0.64rem;display: flex;flex-direction: row;align-items: center;color: #BEC5C0;cursor: pointer;}.content .admin_nav ul li:first-child div {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;color: #BEC5C0;}.content .admin_nav ul li:first-child .left_icon {width: 22%;}.content .admin_nav ul li:first-child .left_icon i {color: #1296DB;}.content .admin_nav ul li:first-child .middle {width: 56%;display: flex;justify-content: flex-start;}.content .admin_nav ul li:first-child .right_icon {width: 22%;}.admin_nav .admin .middle:hover {color: #fff;}.admin_nav .admin .right_icon i:hover {color: #fff;}.admin_nav .admin .middle.router-link-active {color: #fff;}.content .admin_nav_position {position: absolute;z-index: 3000;}.content .admin_content {padding: 0 !important;}.content .admin_content .admin_header {width: 100%;height: 0.6rem;background: #364150;display: flex;flex-direction: row;align-items: center;justify-content: space-between;}.content .admin_content .admin_header .H5_item {width: 0.4rem;height: 0.4rem;border-radius: 0.2rem;display: flex;justify-content: center;align-items: center;margin-left: 0.2rem;}.content .admin_content .admin_header .H5_item i {font-size: 0.22rem;color: #fff;}.content .admin_content .admin_header .user {width: 100%;display: flex;align-items: center;justify-content: flex-end;}.content .admin_content .admin_header .user .userHead {height: 0.6rem;display: flex;flex-direction: row;align-items: center;color: #fff;font-size: 0.18rem;}.content .admin_content .admin_header .user .userHead span {padding: 0 0.05rem;}.content .admin_content .admin_header .user .userHead span:nth-child(1) {position: relative;}.content .admin_content .admin_header .user .userHead span img {width: 0.4rem;height: 0.4rem;border-radius: 50%;}.content .admin_content .admin_header .user .userHead span input {width: 0.4rem;height: 0.4rem;position: absolute;overflow: hidden;opacity: 0;cursor: pointer;}.content .admin_content .admin_header .user .logOut {color: #fff;margin-left: 0.12rem;margin-right: 0.5rem;}.content .admin_content .admin_header .user .logOut i {color: #1296DB;font-size: 0.24rem;cursor: pointer;}.toggle-cart-enter-active {transition: all 0.4s linear;}.toggle-cart-leave-active {transition: all 0.4s linear;}.toggle-cart-enter {transform: translateX(-200%);}.toggle-cart-leave-active {transform: translateX(-200%);}

步骤2:撰写完基本网页布局和样式后,对部分细节进行剖析。

1、动态绑定路径

<router-link :to="it.path" tag="a">{{it.name}}</router-link>

2、一级菜单,标题及折叠符号

①通过@mouseenter和@mouseleave事件,当鼠标移入和移出时,改变标题区域背景颜色

②通过@click事件,当鼠标点击时,显示二级菜单列表

③利用:class动态绑定类名,触发active方法,修改折叠符号状态;绑定图标类名,通过遍历,修改对应图标

<ul v-for="(item,index) in navList" :key="index"><li @click="handleToTitle(index,item)" @mouseenter="changeTitleColor(index)" @mouseleave="removeTitleColor(index)" ref="title" :class="{active:currentSort == index}" class="col-lg-12"><div class="left_icon"><i :class="'iconfont '+item.className"></i></div><div class="middle">{{item.title}}</div><div class="right_icon"><i :class="'iconfont '+item.close"></i></div></li><li v-for="(it,idx) in item.secMenu" :key="idx" v-show="item.isSubShow" class="active1"><router-link :to="it.path" tag="a">{{it.name}}</router-link></li>
</ul>
active(index) {this.currentSort = index;
},changeTitleColor(index) {this.currentSort = index;
},removeTitleColor(index) {this.currentSort = null;
},handleToTitle(ind, item) {this.navList[ind].isSubShow = !this.navList[ind].isSubShow;if (this.navList[ind].isSubShow == true) {this.navList[ind].close = 'icon-zhedie';} else {this.navList[ind].close = 'icon-close';}
}

步骤3:菜单栏完成后,在网页端能进行查看,但是还需做一个手机端适配,这样就达到两端同步适应的效果。实现如下:

①对左边导航栏再撰写第二套代码,并绑定好对应的参数实现显示和隐藏

②运用vue已有的transition,绑定name值,实现动画效果绑定

HTML代码

<!-- 移动端导航栏 -->
<transition name="toggle-cart"><div class="admin_nav admin_nav_position col-8 col-md-5 col-lg-3 col-xl-3" v-show="!fullWidth&&!dismenu"><div class="title"><div v-show="!fullWidth"><i class="iconfont icon-daohanglan" @click="make_menu" class-name="H5-menu"></i></div><div>数据中心后台管理</div></div><ul v-for="(item,index) in navList" :key="index"><li @click="handleToTitle(index,item)" @mouseenter="changeTitleColor(index)" @mouseleave="removeTitleColor(index)" ref="title" :class="{active:currentSort == index}"><div class="left_icon"><i :class="'iconfont '+item.className"></i></div><div class="middle">{{item.title}}</div><div class="right_icon"><i :class="'iconfont '+item.close"></i></div></li><li v-for="(it,idx) in item.secMenu" :key="idx" v-show="item.isSubShow" class="active1"><router-link :to="it.path" tag="a">{{it.name}}</router-link></li></ul></div>
</transition>

JS代码

mounted() {window.onresize = () => { //监听屏幕变化this.page_width();};this.page_width();
},
methods: {make_menu() { //点击导航图标this.dismenu = !this.dismenu;},page_width() { //获取屏幕宽度var screenWidth = window.screen.width;if (screenWidth <= 1024) {this.fullWidth = false;} else {this.fullWidth = true;}}
}

最后来看下手机端效果:

附上全文代码:

<template><div id="main"><div class="content"><!-- 左边导航栏 --><div class="admin_nav col-lg-3 col-xl-2" v-show="fullWidth"><div class = "admin_nav_site"><div class="title">数据中心后台管理</div><ul v-for="(item,index) in navList" :key="index"><li @click="handleToTitle(index,item)" @mouseenter="changeTitleColor(index)" @mouseleave="removeTitleColor(index)"      ref="title" :class="{active:currentSort == index}" class="col-lg-12"><div class="left_icon"><i :class="'iconfont '+item.className"></i></div><div class="middle">{{item.title}}</div><div class="right_icon"><i :class="'iconfont '+item.close"></i></div></li><li v-for="(it,idx) in item.secMenu" :key="idx" v-show="item.isSubShow" class="active1"><router-link :to="it.path" tag="a">{{it.name}}</router-link></li></ul></div><!-- 管理员端 --><!-- <ul class="admin"><li class="col-lg-12"><div class="left_icon"><i class="iconfont icon-guanliyuan1"></i></div><router-link to="/admin/administrator/secadmin" tag="div" class="middle">管理员端</router-link><div class="right_icon"><i class="iconfont icon-jinru"></i></div></li></ul> --></div><!-- 右边内容 --><div class="admin_content col-12 col-md-12 col-lg-12 col-xl-10"><div class="admin_header"><!-- 导航图标 --><div class="H5_item" v-show="!fullWidth"><i class="iconfont icon-daohanglan" @click="make_menu" class-name="H5-menu"></i></div><div class="user"><div class="userHead"><span><img src="../../assets/image/userhead.svg"></span><span>admin</span></div><div class="logOut"><i class="iconfont icon-tuichu"></i></div></div></div><div class="admin_body"><keep-alive><router-view /></keep-alive></div></div><!-- 移动端导航栏 --><transition name="toggle-cart"><div class="admin_nav admin_nav_position col-8 col-md-5 col-lg-3 col-xl-3" v-show="!fullWidth&&!dismenu"><div class="title"><div v-show="!fullWidth"><i class="iconfont icon-daohanglan" @click="make_menu" class-name="H5-menu"></i></div><div>数据中心后台管理</div></div><ul v-for="(item,index) in navList" :key="index"><li @click="handleToTitle(index,item)" @mouseenter="changeTitleColor(index)" @mouseleave="removeTitleColor(index)"ref="title" :class="{active:currentSort == index}"><div class="left_icon"><i :class="'iconfont '+item.className"></i></div><div class="middle">{{item.title}}</div><div class="right_icon"><i :class="'iconfont '+item.close"></i></div></li><li v-for="(it,idx) in item.secMenu" :key="idx" v-show="item.isSubShow" class="active1"><router-link :to="it.path" tag="a">{{it.name}}</router-link></li></ul></div></transition></div></div>
</template><script>import axios from 'axios';export default {name: 'navigation-1',data() {return {token: '',navList: [{title: '用户管理',isSubShow: false,className: 'icon-guanliyuan1',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '工号管理',path: '/home/navigation-one/user'}, // {// name: '角色管理',// path: '/home/navigation-one/role'// }, // {// name: '权限管理',// path: '/home/navigation-one/user'// }, ]},{title: '资源管理',isSubShow: false,className: 'icon-ziyuan',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '我的收藏',path: '/home/navigation-one/user'},{name: '我的项目',path: '/home/navigation-one/role'}]},{title: '综合管理',isSubShow: false,className: 'icon-zonghe',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '划配管理',path: '/home/navigation-one/user'},{name: '数据信息',path: '/home/navigation-one/role'}]},{title: '系统消息',isSubShow: false,className: 'icon-xiaoxi',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '实时动态',path: '/home/navigation-one/user'},{name: '过去动态',path: '/home/navigation-one/role'}]}],currentSort: 0,pagetype: "index",fullWidth: true,dismenu: true}},mounted() {window.onresize = () => { //监听屏幕变化this.page_width();};this.page_width();},methods: {active(index) {this.currentSort = index;},changeTitleColor(index) {this.currentSort = index;},removeTitleColor(index) {this.currentSort = null;},handleToTitle(ind, item) {this.navList[ind].isSubShow = !this.navList[ind].isSubShow;if (this.navList[ind].isSubShow == true) {this.navList[ind].close = 'icon-zhedie';} else {this.navList[ind].close = 'icon-close';}},make_menu() { //点击导航图标this.dismenu = !this.dismenu;},page_width() { //获取屏幕宽度var screenWidth = window.screen.width;if (screenWidth <= 1024) {this.fullWidth = false;} else {this.fullWidth = true;}}}}
</script><style scoped>#main {background: #F0F6FF;font-size: 0.16rem;}#main .content {display: flex;flex-direction: row;}.content .admin_nav {min-height: 9.37rem;max-height: 1.3rem;padding: 0 !important;background: #364150;position: relative;}.content .admin_nav .admin_nav_site{height: 100vh;}.content .admin_nav .title {height: 1.39rem;line-height: 1.39rem;background: rgba(63, 73, 86, 1);color: #FFFFFF;text-align: center;font-size: 0.18rem;display: flex;justify-content: center;}.content .admin_nav .title div {padding: 0 0.03rem;}.content .admin_nav .title div:first-child i {font-size: 0.18rem;}.content .admin_nav ul .active {background: rgba(68, 81, 99, 1);}.content .admin_nav ul .active1 a.router-link-active {color: #fff;}.content .admin_nav ul li {height: 0.6rem;display: flex;flex-direction: column;justify-content: center;align-items: center;font-size: 0.18rem;}.content .admin_nav ul li a {color: #cecdc5;cursor: pointer;}.content .admin_nav ul li:first-child {font-size: 0.2rem;height: 0.64rem;display: flex;flex-direction: row;align-items: center;color: #BEC5C0;cursor: pointer;}.content .admin_nav ul li:first-child div {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;color: #BEC5C0;}.content .admin_nav ul li:first-child .left_icon {width: 22%;}.content .admin_nav ul li:first-child .left_icon i {color: #1296DB;}.content .admin_nav ul li:first-child .middle {width: 56%;display: flex;justify-content: flex-start;}.content .admin_nav ul li:first-child .right_icon {width: 22%;}.admin_nav .admin .middle:hover {color: #fff;}.admin_nav .admin .right_icon i:hover {color: #fff;}.admin_nav .admin .middle.router-link-active {color: #fff;}.content .admin_nav_position {position: absolute;z-index: 3000;}.content .admin_content {padding: 0 !important;}.content .admin_content .admin_header {width: 100%;height: 0.6rem;background: #364150;display: flex;flex-direction: row;align-items: center;justify-content: space-between;}.content .admin_content .admin_header .H5_item {width: 0.4rem;height: 0.4rem;border-radius: 0.2rem;display: flex;justify-content: center;align-items: center;margin-left: 0.2rem;}.content .admin_content .admin_header .H5_item i {font-size: 0.22rem;color: #fff;}.content .admin_content .admin_header .user {width: 100%;display: flex;align-items: center;justify-content: flex-end;}.content .admin_content .admin_header .user .userHead {height: 0.6rem;display: flex;flex-direction: row;align-items: center;color: #fff;font-size: 0.18rem;}.content .admin_content .admin_header .user .userHead span {padding: 0 0.05rem;}.content .admin_content .admin_header .user .userHead span:nth-child(1) {position: relative;}.content .admin_content .admin_header .user .userHead span img {width: 0.4rem;height: 0.4rem;border-radius: 50%;}.content .admin_content .admin_header .user .userHead span input {width: 0.4rem;height: 0.4rem;position: absolute;overflow: hidden;opacity: 0;cursor: pointer;}.content .admin_content .admin_header .user .logOut {color: #fff;margin-left: 0.12rem;margin-right: 0.5rem;}.content .admin_content .admin_header .user .logOut i {color: #1296DB;font-size: 0.24rem;cursor: pointer;}.toggle-cart-enter-active {transition: all 0.4s linear;}.toggle-cart-leave-active {transition: all 0.4s linear;}.toggle-cart-enter {transform: translateX(-200%);}.toggle-cart-leave-active {transform: translateX(-200%);}
</style>

注:

1、css样式中的rem换算成px为对应的rem值*100,如:font-size:0.24rem;=>  font-size:24px;

2、文章中涉及到的iconfont类名是因为引用了阿里图标,如遇到不知道如何引用的可以翻阅博文→ https://blog.csdn.net/weixin_44803753/article/details/113423633

3、关于router-link对应的跳转,如有小伙伴不太清楚如何使用vue-router配置路由的可以翻阅博文→https://blog.csdn.net/weixin_44803753/article/details/113436625

Ending(〃'▽'〃)!

vue实现侧边折叠菜单栏手风琴效果相关推荐

  1. vue 手风琴效果_Vue实现侧边菜单栏手风琴效果实例代码

    编程之家收集整理的这篇文章主要介绍了Vue实现侧边菜单栏手风琴效果实例代码,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. 效果图如下所示: {{item.name}} { // 判断如 ...

  2. h5 手风琴效果_小程序-实现折叠面板-手风琴效果

    背景 无论是在小程序还是 h5 网页,折叠菜单,手风琴是一个非常常见的效果,如今也有很多现成的 UI 组件库已经实现了这一效果的,但有时候在写原生小程序时,单单就是一个折叠菜单效果,却要引入整个 UI ...

  3. Axure 9 实战案例,动态面板的应用 6,导航菜单栏的手风琴效果

    前言 Hello!欢迎来到Axure 9 实战案例教程专栏.点击了解课程简介>> 我们接着再继续学习动态面板的应用,本篇课程我们来讲解一下,如何运用动态面板绘制导航菜单栏的手风琴效果. 我 ...

  4. html折叠 手风琴效果,jQuery制作效果超棒的手风琴折叠菜单

    拉风的jQuery制作的手风琴折叠菜单,效果非常不错!这里是之前版本的改进版,主要是jquery代码改进 演示图: main.js $(function(){ var tmp = null, $tit ...

  5. Bootstrap JS插件使用实例(6)-折叠(手风琴效果)

    本篇文章讨论Bootstrap的js插件的折叠效果(bootstrap-collapse.js),即控制页面某一区域内容的显示和隐藏.通过将多个这样的折叠元素组合起来,我们就可以实现诸如手风琴或是导航 ...

  6. vue怎么实现手风琴效果_Vue动画实现简易手风琴组件

    1.需求描述 最近做Vue项目有个需求,用手风琴效果实现对企业信息的展示,具体是在鼠标移入时,图片拉伸放大,其中包含标题及简述的浮现,流畅度要高.经过一番思考研究终于完成了,下面上代码. 2.代码部分 ...

  7. VUE实现折叠展开动画效果

    VUE实现折叠展开动画效果 第一种情况:从中间向两边展开效果(水平缩放) .input-search {position: absolute;bottom: 8px;right: 0px;width: ...

  8. bootstrap中jquery插件——collapse折叠效果-手风琴效果

    先来掌握collapse插件的基本用法,再慢慢深入实例. collapse最基本的效果是像下图所示的,点击按钮可以显示/隐藏下面的元素: 实现代码如下: <a class="btn b ...

  9. vue 手风琴组件_Vue 使用Element-ui table组件实现手风琴效果

    利用Element-UI提供的表格组件做成手风琴效果, 即同时只能有一个行展开 效果展示 手风琴效果 版本说明 "vue": "^2.6.11", " ...

最新文章

  1. (原创)c#学习笔记10--定义类成员03--接口的实现01--显示实现接口成员
  2. cscope使用技巧
  3. Linux内存初始化(C语言部分)
  4. 恐龙快跑小程序对接流量主源码+前端 v5.0.4 全开源微擎框架
  5. 小明是个急性子,上小学的时候经常吧老师写在黑板上的题目抄错 有一次,老师出的题目是:36x495=? 他却给抄成了:396x45=? 但是结果很戏剧性,他的 答案是对的 因为36*495 = 39
  6. 关于mysql数据库的说法错误的是_MYSQL数据库2013-2014学年考试试卷
  7. 关于csrss.exe和winlogon.exe进程多、占用CPU高的解决办法
  8. win7修改ftp服务器密码,win7ftp服务器设置用户名密码设置
  9. 两个月的一些工作总结
  10. Android 直接拨号和调用拨号盘
  11. 【简约而不简单:神级代码的小秘密】| 第二章 栈
  12. mysql最大整数类型_MySQL教程19-整数类型
  13. t检验 显著性检验 significance test
  14. Centos7.6下构建虚拟主机实验(基于域名、端口及IP地址)
  15. 从腾讯云服务器迁移到轻量应用服务器
  16. 网络安全行业常见的权威职业证书有哪些?
  17. 【训练题48:想法 + 模拟】Lawn of the Dead | HDU6992 | 杭电多校四 08题
  18. 做人做事,必须要搞清楚的9个顺序
  19. 电脑经常自动关机的系统解决方案
  20. 游戏开发方案—《逃离禁闭岛》

热门文章

  1. 利用redis List队列简单实现秒杀 PHP代码实现
  2. Redis——缓存击穿、穿透、雪崩
  3. [转]《吐血整理》系列-顶级程序员工具集
  4. Android studio之迁移定制出现Installation failed with message Failed to finalize session
  5. Android之ndk-build -j4
  6. linux之怎么使vim永久显示行号
  7. c语言将十进制转化为二进制算法_base64算法初探即逆向分析
  8. 今年不容易,要懂得爱护自己
  9. 《销售总监》读书笔记
  10. mysql学时用什么类型_MYSQL数据库学习----MYSQL数据类型