Vue框架+Element UI怎样实现响应式导航栏
Admin 2022-10-13 群英技术资讯 344 次浏览
开始之前
按照计划,前端使用Vue.js+Element UI,但在设计导航栏时,发现element没有提供传统意义上的页面顶部导航栏组件,只有一个可以用在很多需要选择tab场景的导航菜单,便决定在其基础上改造,由于我认为实现移动端良好的体验是必须的,所以便萌生了给其增加响应式功能的想法。
需求分析与拆解
假设我们的导航栏有logo和四个el-menu-item。
给window绑定监听事件,当宽度小于a时,四个链接全部放入右侧el-submenu的子菜单:
当宽度大于a时,右侧el-submenu不显示,左侧el-menu-item正常显示:
所以,先创建一个数组,存储所有所需的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啦~)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章我们来了解JS数组的深复制和浅复制的相关内容,很多新手不是很理解深复制和浅复制究竟是什么,因此本文就给大家来介绍一下,下文有很详细的介绍,有需要的朋友可以参考,接下来就跟随小编来一起学习一下吧!
前台----> 后台后台要接受前台的数据,只能通过http 但是前台接受后台的数据有 from ajax jsonpnodejs给我们提供了模块url模块,可以专门解析url地址让我们在走一遍流程案例:consthttp=require("http");//引入http模块,创建服务器constur
本文实例为大家分享了微信小程序实现轮播图指示器的具体代码,供大家参考,具体内容如下1.文件目录2.轮播图页面布局需求:自定义轮播指示器:当轮播图发生变化时,自定义轮播指示器跟随图片发生对应改变bindchange:current 改变时会触发 change 事件,即当图片索引发生变化时触发的事件current:当前所在
最终效果展示xhr发起请求!DOCTYPE htmlhtml lang=en head meta charset=UTF-8 meta http-equiv=X-UA-Compatible content=IE=edge meta name=viewport content=width=device-
这篇文章主要给大家介绍关于JavaScript async和await的内容,一些朋友对于async和await不是很理解,对此,本文就给大家详细的介绍一下async和await的作用及原理,感兴趣的朋友就继续往下看吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008