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+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
Oct 24 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
使用堆实现Top K算法(JS实现)
Dec 25 Javascript
javascript显示倒计时控制按钮的简单实现
Jun 07 Javascript
Javascript获取随机数的实现方法
Jun 22 Javascript
微信小程序中this.data与this.setData的区别详解
Sep 17 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
Feb 28 Javascript
详解小程序云开发数据库
May 20 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
Jan 16 Javascript
用js编写留言板
Mar 17 Javascript
JQuery表单元素取值赋值方法总结
May 12 jQuery
使用Typescript和ES模块发布Node模块的方法
May 25 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
基于mysql的论坛(2)
2006/10/09 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
php实现的双色球算法示例
2017/06/20 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
Javascript中的神器——Promise
2017/02/08 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
通过Pandas读取大文件的实例
2018/06/07 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
python线程优先级队列知识点总结
2021/02/28 Python
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
英国健身超市:Fitness Superstore
2019/06/17 全球购物
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
暑假实习求职信范文
2013/09/22 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
清正廉洁演讲稿
2014/05/22 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
公司授权委托书
2014/10/17 职场文书
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python