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 相关文章推荐
LBS blog sql注射漏洞[All version]-官方已有补丁
Aug 26 Javascript
js 效率组装字符串 StringBuffer
Dec 23 Javascript
js 立即调用的函数表达式如何写
Jan 12 Javascript
用于deeplink的js方法(判断手机是否安装app)
Apr 02 Javascript
js实现字符串和数组之间相互转换操作
Jan 12 Javascript
js字符串截取函数slice、substring和substr的比较
May 17 Javascript
星期几的不同脚本写法(推荐)
Jun 01 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
微信小程序开发中的疑问解答汇总
Jul 03 Javascript
JavaScript比较同一天的时间大小实例代码
Feb 09 Javascript
IE11下处理Promise及Vue的单项数据流问题
Jul 24 Javascript
使用layer模态框给新页面传值的方法
Sep 27 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
在线短消息收发的程序,不用数据库
2006/10/09 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
php+jQuery递归调用POST循环请求示例
2016/10/14 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
JavaScript 函数replace深入了解
2013/03/14 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
jquery+css实现下拉列表功能
2017/09/03 jQuery
ES6如何用一句代码实现函数的柯里化
2020/01/18 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
python3实现短网址和数字相互转换的方法
2015/04/28 Python
Tornado 多进程实现分析详解
2018/01/12 Python
Python装饰器用法实例总结
2018/02/07 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
印度民族服装购物网站:BIBA
2019/08/05 全球购物
高考自主招生自荐信
2013/10/20 职场文书
可口可乐广告词
2014/03/20 职场文书
公司表扬稿范文
2015/05/05 职场文书
公司欠款证明
2015/06/24 职场文书
python 逐步回归算法
2021/04/06 Python
Vue如何实现组件间通信
2021/05/15 Vue.js
HttpClient实现表单提交上传文件
2022/08/14 Java/Android