element-ui 实现响应式导航栏的示例代码


Posted in Javascript onMay 08, 2020

开始之前

按照计划,前端使用Vue.js+Element UI,但在设计导航栏时,发现element没有提供传统意义上的页面顶部导航栏组件,只有一个可以用在很多需要选择tab场景的导航菜单,便决定在其基础上改造,由于我认为实现移动端良好的体验是必须的,所以便萌生了给其增加响应式功能的想法。

需求分析与拆解

假设我们的导航栏有logo和四个el-menu-item。

给window绑定监听事件,当宽度小于a时,四个链接全部放入右侧el-submenu的子菜单:

element-ui 实现响应式导航栏的示例代码

当宽度大于a时,右侧el-submenu不显示,左侧el-menu-item正常显示:

element-ui 实现响应式导航栏的示例代码

所以,先创建一个数组,存储所有所需的item:

navItems: [
 { name: "Home", indexPath: "/home", index: "1" },
 { name: "Subscribe", indexPath: "/subscribe", index: "2"},
 { name: "About", indexPath: "/about", index: "3" },
 { name: "More", indexPath: "/more", index: "4" }
]

监听宽度

很明显功能实现的关键是随时监听窗口的变化,根据对应的宽度做出响应,在data中,我使用screenWidth变量来存储窗口大小,保存初始打开页面时的宽度:

data() {
 return {
 screenWidth: document.body.clientWidth
 ......
 }
}

接下来在mounted中绑定屏幕监听事件,将最新的可用屏幕宽度赋给screenWidth:

mounted() {
 window.onresize = () => {
 this.screenWidth = document.body.clientWidth
 }
}

(关于document和window中N多的关于高度和宽度的属性,可以参考这篇文章。)

为了防止频繁触发resize函数导致页面卡顿,可以使用一个定时器,控制下screenWidth更新的频率:

watch: {
 screenWidth(newValue) {
 // 为了避免频繁触发resize函数导致页面卡顿,使用定时器
 if (!this.timer) {
  // 一旦监听到的screenWidth值改变,就将其重新赋给data里的screenWidth
  this.screenWidth = newValue;
  this.timer = true;
  setTimeout(() => {
  //console.log(this.screenWidth);
  this.timer = false;
  }, 400);
 }
 }
}

显示

有了屏幕宽度的实时数据后,就可以以computed的方式控制menuItem了。

computed: {
 ...
 leftNavItems: function() {
 return this.screenWidth >= 600 ? this.navItems : {};
 },
 rightNavItems: function() {
 return this.screenWidth < 600 ? this.navItems : {};
 }
},

通过简单的判断即可在窗口宽度变化时,将菜单里的内容放入预先设置的正常菜单或者当宽度小于600时显示的右侧下拉菜单,附上html部分代码:

<el-menu text-color="#2d2d2d" id="navid" class="nav" mode="horizontal" @select="handleSelect">
 <el-menu-item class="logo" index="0" route="/home">
 <img class="logoimg" src="../assets/img/logo.png" alt="logo" />
 </el-menu-item>
 <el-menu-item
 :key="key"
 v-for="(item,key) in leftNavItems"
 :index="item.index"
 :route="item.activeIndex"
 >{{item.name}}</el-menu-item>
 <el-submenu
 style="float:right;"
 class="right-item"
 v-if="Object.keys(rightNavItems).length === 0?false:true"
 index="10"
 >
 <template slot="title">
  <i class="el-icon-s-fold" style="font-size:28px;color:#2d2d2d;"></i>
 </template>
 <el-menu-item
  :key="key"
  v-for="(item,key) in rightNavItems"
  :index="item.index"
  :route="item.activeIndex"
 >{{item.name}}</el-menu-item>
 </el-submenu>
</el-menu>

总结

总的来说,一个丐版就算完成了,这里只提供了一种可能的思路,如需实践可以增加更多判断规则及功能。(主要是已经转用Vuetify啦~)

到此这篇关于element-ui 实现响应式导航栏的示例代码的文章就介绍到这了,更多相关element 响应式导航栏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
Sep 16 Javascript
javascript 上下banner替换具体实现
Nov 14 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
Jan 09 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
Nov 28 Javascript
EasyUI中实现form表单提交的示例分享
Mar 01 Javascript
ECMAScript6中Set/WeakSet详解
Jun 12 Javascript
JS动态改变浏览器标题的方法
Apr 06 Javascript
基于jquery实现ajax无刷新评论
Aug 19 Javascript
原生JavaScript编写canvas版的连连看游戏
May 29 Javascript
JS求解三元一次方程组值的方法
Jan 03 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
Dec 13 Javascript
深度了解vue.js中hooks的相关知识
Jun 14 Javascript
JS控制下拉列表左右选择实例代码
May 08 #Javascript
VSCode搭建React Native环境
May 07 #Javascript
Javascript查看大图功能代码实现
May 07 #Javascript
用VsCode编辑TypeScript的实现方法
May 07 #Javascript
JavaScript交换变量的常用方法小结【4种方法】
May 07 #Javascript
原生JavaScript创建不可变对象的方法简单示例
May 07 #Javascript
Javascript幻灯片播放功能实现过程解析
May 07 #Javascript
You might like
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
PHP开发中常用的8个小技巧
2008/08/27 PHP
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
javascript hashtable实现代码
2009/10/13 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
Python常用内置模块之xml模块(详解)
2017/05/23 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python实现简易数码时钟
2021/02/19 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
美国知名生活购物网站:Goop
2017/11/03 全球购物
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
高三毕业生自我鉴定
2013/12/20 职场文书
十佳美德少年事迹材料
2014/02/05 职场文书
大学生活自我评价
2014/04/09 职场文书
论文指导教师评语
2014/04/28 职场文书
品德评语大全
2014/05/05 职场文书
公司承诺书怎么写
2014/05/24 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
婚宴新郎致辞
2015/07/28 职场文书
MongoDB使用profile分析慢查询的步骤
2021/04/30 MongoDB
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript