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实现继承机制之构造函数方法对象冒充的使用详解
May 07 Javascript
css+js实现部分区域高亮可编辑遮罩层
Mar 04 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
Jun 09 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
Aug 06 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
Dec 10 Javascript
详解JavaScript权威指南之对象
Sep 27 Javascript
JS实现碰撞检测的方法分析
Jan 19 Javascript
Express之托管静态文件的方法
Jun 01 Javascript
vue中slot(插槽)的介绍与使用
Nov 12 Javascript
layui prompt 设置允许空白提交的方法
Sep 24 Javascript
node.js爬虫框架node-crawler初体验
Oct 29 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
Nov 02 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中变量及部分适用方法
2008/03/27 PHP
PHP session有效期问题
2009/04/26 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
php一个找二层目录的小东东
2012/08/02 PHP
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
详解Python 循环嵌套
2020/07/09 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
自愿解除劳动合同协议书
2014/09/11 职场文书
党员剖析材料范文
2014/12/18 职场文书
计生个人工作总结
2015/02/28 职场文书
晚会开场白和结束语
2015/05/29 职场文书
公司处罚决定书
2015/06/24 职场文书
Mysql Online DDL的使用详解
2021/05/20 MySQL
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers