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 读取操作Sql中的Xml字段
Oct 09 Javascript
js中的json对象详细介绍
Oct 29 Javascript
jquery实现拖拽调整Div大小
Jan 30 Javascript
JQuery显示、隐藏div的几种方法简明总结
Apr 16 Javascript
在JS方法中返回多个值的方法汇总
May 20 Javascript
使用bootstrap3开发响应式网站
May 12 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
Dec 16 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
Feb 08 Javascript
angular框架实现全选与单选chekbox的自定义
Jul 06 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
Jul 10 Javascript
weui框架实现上传、预览和删除图片功能代码
Aug 24 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
Nov 11 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+oracle 分页类
2006/10/09 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
2011/10/22 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
vue实现选中效果
2020/10/07 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
Python中print和return的作用及区别解析
2019/05/05 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
Django打印出在数据库中执行的语句问题
2019/07/25 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
从python读取sql的实例方法
2020/07/21 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
大学生村官任职感言
2014/01/09 职场文书
大学生新学期计划书
2014/04/28 职场文书
期末评语大全
2014/05/04 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
紫日观后感
2015/06/05 职场文书
解析目标检测之IoU
2021/06/26 Python
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS