element 实现导航栏收起展开功能及思路

作者:水星记_ 时间:2024-05-10 14:17:11 

上篇文章介绍了vue使用ElementUI时导航栏默认展开功能的实现,今天介绍下element 导航栏收起展开功能的实现思路。

element 导航栏收起展开

实现思路

1. 首先给 el-menu 加上 :collapse="isCollapse" 属性,这个属性也是 element 上的一个参数,意思为是否开启折叠动画,在 data 中定义 isCollapse ,用 truefalse 控制展开与收起。

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>

效果如下

element 实现导航栏收起展开功能及思路

PS:Vue结合element-ui实现导航菜单展开收缩小功能

1. 先上个效果图 

element 实现导航栏收起展开功能及思路

这里我把控制菜单收缩的放在中间了,是可以随便调整的。 

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;
}

这个也是核心,要不然的话,展开收缩的时候会有问题。

来源:https://blog.csdn.net/Shids_/article/details/112701159

标签:element,导航栏,收起,展开
0
投稿

猜你喜欢

  • Python中functools模块的常用函数解析

    2022-08-12 08:10:50
  • MySQL 随机函数获取数据速度和效率分析

    2024-01-13 00:43:01
  • Mysql获取当前日期的前几天日期的方法

    2024-01-16 01:22:31
  • MySQL创建表操作命令分享

    2024-01-25 20:08:35
  • 探究Python中isalnum()方法的使用

    2021-12-05 19:05:31
  • Vue的生命周期一起来看看

    2024-05-02 17:03:21
  • 基于HTML+JS实现简单的年龄计算器

    2024-04-23 09:27:29
  • 刚学完怎么用Python实现定时任务,转头就跑去撩妹!

    2022-07-09 06:50:02
  • MyBatis-plus+达梦数据库实现自动生成代码的示例

    2024-01-16 03:41:42
  • 使用Python生成随机密码的示例分享

    2023-05-23 11:32:10
  • python3.7.2 tkinter entry框限定输入数字的操作

    2021-02-22 14:40:36
  • PHP网页游戏学习之Xnova(ogame)源码解读(三)

    2024-06-05 15:41:29
  • 瞬间的设计 I

    2009-12-25 18:54:00
  • Python ndarray 数组的变形详情

    2023-05-13 14:58:47
  • 用JavaScript页面不刷新时全选择,全删除(GridView)

    2024-05-11 09:17:20
  • GitLab使用外部提供的Redis缓存数据库的方法详解

    2024-01-23 10:02:57
  • 目标检测mAP的概念及公式详解

    2022-05-24 17:55:57
  • 使用Django开发简单接口实现文章增删改查

    2023-02-12 22:29:37
  • 关于Python Socket编程的要点详解

    2021-11-25 17:44:11
  • golang切片扩容规则实现

    2024-04-27 15:31:22
  • asp之家 网络编程 m.aspxhome.com