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 相关文章推荐
Jquery 高亮显示文本中重要的关键字
Dec 24 Javascript
jquery select动态加载选择(兼容各种浏览器)
Feb 01 Javascript
js将控件隐藏及display属性的使用介绍
Dec 30 Javascript
js判断undefined类型示例代码
Feb 10 Javascript
JQuery下拉框应用示例介绍
Apr 23 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
Jan 25 Javascript
浅谈js中的延迟执行和定时执行
May 31 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
Dec 08 Javascript
canvas 弹幕效果(实例分享)
Jan 11 Javascript
Javascript中的async awai的用法
May 17 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
Apr 16 Javascript
JavaScript中条件语句的优化技巧总结
Dec 04 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
目录,文件操作详谈―PHP
2006/11/25 PHP
判断PHP数组是否为空的代码
2011/09/08 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
PHP attributes()函数讲解
2019/02/03 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
jQuery实现长文字部分显示代码
2013/05/13 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
nodejs微信开发之接入指南
2019/03/17 NodeJs
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Python画图学习入门教程
2016/07/01 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
pycharm创建一个python包方法图解
2019/04/10 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
Python属性和内建属性实例解析
2020/01/14 Python
python openpyxl模块的使用详解
2021/02/25 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
启动一个线程是用run()还是start()
2016/12/25 面试题
派出所所长先进事迹
2014/05/19 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
工作失误检讨书范文
2015/01/26 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA
Django框架中表单的用法
2022/06/10 Python