element 实现导航栏收起展开功能及思路
上篇文章介绍了vue使用ElementUI时导航栏默认展开功能的实现,今天介绍下element 导航栏收起展开功能的实现思路。
element 导航栏收起展开
实现思路
1. 首先给
el-menu
加上:collapse="isCollapse"
属性,这个属性也是element
上的一个参数,意思为是否开启折叠动画,在data
中定义isCollapse
,用true
和false
控制展开与收起。
2. 在
html
中写入以下代码。
<el-menu :collapse="isCollapse" class="el-menu-vertical"></el-menu>
3. 这里还需要把
el-aside
的宽度设置为跟el-menu
一样,以免出现执行展开收起时宽度不一样。
<!-- width的宽度跟collapse一样动态控制 --> <el-aside width="collapse"></el-aside>
4. 展开和收起按钮利用两个
icon
图标,通过点击事件来动态控制显示与隐藏。
<el-header> <!-- 点击展开收起导航和切换对应图标 --> <i class="el-icon-s-fold" @click="isC" v-show="block"></i> <i class="el-icon-s-unfold" @click="isC" v-show="toggle"></i> </el-header>
5.
data
中定义的变量。
export default { name: "Main", data() { return { isCollapse: false, //导航栏默认为展开 toggle: false,//第二个图标默认隐藏 block: true,//默认显示第一个图标 }; }, };
6. methods
中的点击事件。
methods: { // 动态控制展开与收起和切换对应图标 isC() { this.isCollapse = !this.isCollapse; this.toggle = !this.toggle; this.block = !this.block; }, },
7. 用到的
css
代码。
.el-menu-vertical:not(.el-menu--collapse) { width: 240px; }
最后附上完整代码
<template> <div> <el-container> <!-- width的宽度跟collapse一样动态控制 --> <el-aside width="collapse"> <!-- :collapse="isCollapse" class="el-menu-vertical" 动态控制导航菜单的收起与展开 router:让index作为 path 进行路由跳转 --> <el-menu :default-active="$route.path" router :collapse="isCollapse" class="el-menu-vertical" background-color="#393e42" text-color="#fff" active-text-color="rgb(64, 158, 255)"> <el-submenu index="1"> <!-- 插槽 插入一级导航标题 --> <template slot="title"> <i class="el-icon-s-tools"></i> <span>工厂设置</span> </template> <!-- 二级导航标题 --> <el-menu-item-group> <el-menu-item index="/A-Business/A-Business"> <i class="el-icon-s-shop"></i>商户信息 </el-menu-item> </el-menu-item-group> </el-submenu> </el-menu> </el-aside> <el-container> <el-header> <div class="box_bgd" @click="isC"> <!-- 点击展开收起导航和切换对应图标 --> <i class="el-icon-s-fold" v-show="block"></i> <i class="el-icon-s-unfold" v-show="toggle"></i> </div> </el-header> <el-main> <router-view></router-view> </el-main> </el-container> </el-container> </div> </template> <script> export default { data() { return { isCollapse: false, //导航栏默认为展开 toggle: false, //第二个图标默认隐藏 block: true, //默认显示第一个图标 }; }, methods: { // 动态控制展开与收起和切换对应图标 isC() { this.isCollapse = !this.isCollapse; this.toggle = !this.toggle; this.block = !this.block; }, }, }; </script> <style scoped> .el-header { background-color: #b3c0d1; color: #333; line-height: 60px; height: 100%; padding: 0 !important; } .el-aside { background-color: #393e42; color: #333; height: 100vh; } .el-menu { border-right-width: 0; } .el-main { color: #333; } .el-menu-vertical:not(.el-menu--collapse) { width: 240px; } .box_bgd { height: 60px; display: flex; align-items: center; justify-content: center; cursor: pointer; width: 54px; } .box_bgd i { font-size: 20px; } .box_bgd:hover { background-color: rgb(203, 215, 230); } </style>
效果如下
PS:Vue结合element-ui实现导航菜单展开收缩小功能
1. 先上个效果图
这里我把控制菜单收缩的放在中间了,是可以随便调整的。
2. 问题思路想法
① 首先是布局,这就是个很经典的后台管理系统的容器页面,这里分为上下结构,上面一般放些系统logo、 登录的用户信息,还有一些小功能等等。然后下面又分为左右结构,左边就是我们的导航菜单,右边那一块儿是我们将来所有的业务页面存放的地方
② 上下结构布局好说,下面左右结构我们采用display:flex布局,但是问题就是宽度该怎么去设置,我们要实现菜单的收缩功能,宽度都是动态的变化的,右边也要随着左边的变动而改变,结论就是,我们给左边设置宽度为 width: auto,然后右边不设置宽度,直接让右边宽度填满剩下的右侧,即给右侧div设置flex: 1,这样布局基本就可以了
③ 第三就是给el-menu 设置 class="el-menu-vertical" :collapse="isCollapse" 属性,一个是class类名,我们一会儿需要用到(就是展开的时候的宽度) ,还一个是isCollapse,表示开启折叠动画
3. 完整代码实现
<doc> 容器页面 </doc> <template> <div class="main"> <div class="layout-top"></div> <div class="layout-bottom"> <!-- 左侧 --> <div id="LayoutLeft" class="layout-left"> <el-menu default-active="1" class="el-menu-vertical" :collapse="isCollapse"> <el-submenu index="1"> <template slot="title"> <i class="el-icon-location"></i> <span slot="title">导航一</span> </template> <el-menu-item-group> <span slot="title">分组一</span> <el-menu-item index="1-1">选项1</el-menu-item> <el-menu-item index="1-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="1-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="1-4"> <span slot="title">选项4</span> <el-menu-item index="1-4-1">选项1</el-menu-item> </el-submenu> </el-submenu> <el-menu-item index="2"> <i class="el-icon-menu"></i> <span slot="title">导航二</span> </el-menu-item> </el-menu> <!-- 控制菜单的收缩 --> <div @click="shrinkMenu" class="shrink"> <i :class="isCollapse ? 'el-icon-s-unfold': 'el-icon-s-fold'"></i> </div> </div> <!-- 右侧 --> <div id="LayoutRight" class="layout-right"> <div class="layout-content"> <router-view></router-view> </div> </div> </div> </div> </template> <script> export default { computed: { isCollapse: { get() { return this.$store.state.common.isCollapse }, set(val) { this.$store.commit('common/updateisCollapse', val) } } }, methods: { shrinkMenu() { this.isCollapse = !this.isCollapse; } } } </script> <style> .main { width: 100vw; height: 100vh; } /* --- 上面部分 --- */ .layout-top { width: 100%; height: 60px; background: #b3c0d1; } /* ------ 下面部分 ------ */ .layout-bottom { width: 100%; height: calc(100% - 60px); /* flex布局 */ display: flex; } .layout-left { /* 左侧不设置宽度 */ width: auto; height: 100%; background: #d3dce6; position: relative; } .layout-right { height: 100%; /* flex关键代码,让右侧占满剩余宽度 */ flex: 1; background: #e9eef3; padding: 25px; box-sizing: border-box; } /* 将来所有的业务页面容器 */ .layout-content { width: 100%; height: 100%; background: #fff; } /* el-menu相关样式 */ .el-menu { height: 100%; border-right-width: 0; } /* 必须设置 */ .el-menu-vertical:not(.el-menu--collapse) { width: 200px; } /* 控制菜单收缩 */ .shrink { position: absolute; top: 50%; right: -25px; transform: translateY(-50%); width: 25px; height: 30px; border: 1px solid #b3c0d1; background: #b3c0d1; display: flex; justify-content: center; align-items: center; border-radius: 3px; cursor: pointer; z-index: 9999; } </style>
注意:这里我把 isCollapse 存在了Vuex中,然后就是比较简单的一些逻辑,大家稍微看下应该都能明白。
唯一的核心代码我觉得就是下面的左右两侧宽度设置的问题,左侧设置 width: auto,右侧不设置宽度,设置 flex: 1,这是核心的代码。另外还有个核心的是设置 el-menu 展开的宽度即:
.el-menu-vertical:not(.el-menu--collapse) { width: 200px; }
这个也是核心,要不然的话,展开收缩的时候会有问题。
到此这篇关于element 实现导航栏收起展开功能及思路的文章就介绍到这了,更多相关element 导航栏收起展开内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
vue中$nexttick,$set,$forceupdate的区别
本文主要介绍了vue中$nexttick,$set,$forceupdate的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-07-07
最新评论