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+xml技术实现分页浏览
Jul 27 Javascript
Javascript原型链的原理详解
Jan 05 Javascript
基于jquery实现最简单的选项卡切换效果
May 08 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
May 20 Javascript
Bootstrap table分页问题汇总
May 30 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
Feb 13 Javascript
JavaScript编写一个贪吃蛇游戏
Mar 09 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
Jul 12 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
Dec 05 Javascript
jQuery操作动画完整实例分析
Jan 10 jQuery
Vue中keep-alive组件作用详解
Feb 04 Javascript
Javascript类型判断相关例题及解析
Aug 26 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
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
过滤掉PHP数组中的重复值的实现代码
2011/07/17 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
php的dl函数用法实例
2014/11/06 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
php微信开发之图片回复功能
2018/06/14 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
JavaScript Event事件学习第一章 Event介绍
2010/02/07 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
js移动端图片压缩上传功能
2020/08/18 Javascript
微信小程序实现留言板功能
2018/11/02 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python 域名分析工具实现代码
2009/07/15 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
python实现按首字母分类查找功能
2019/10/31 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
详解python的super()的作用和原理
2020/10/29 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
德国苹果商店:MacTrade
2020/05/18 全球购物
个人简历自我评价范文
2014/02/04 职场文书
商铺租赁意向书
2014/04/01 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
咖啡店创业计划书
2014/08/15 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python