vue+elementui的导航滑块组件

工作需要做一个带滑块效果的导航栏,初步想法是用element的导航组件去做,后面摸坑结合各位大佬的博客初步实现效果,话不多说,直接上代码,记录一下爬坑之旅

  1 <template>
  2   <div class="y-nav">
  3     <el-row class="nav">
  4       <el-menu
  5         :default-active="$route.path"
  6         class="el-menu-demo"
  7         mode="horizontal"
  8         @select="handleSelect"
  9         text-color="#fff"
 10       >
 11         <el-menu-item index="/index">
 12           <router-link
 13             to="/"
 14             @mouseover.native="itransition($event )"
 15             @mouseout.native="outtransition($event)"
 16           >首页</router-link>
 17         </el-menu-item>
 18         <el-menu-item index="/leaderboard/leaderlist">
 19           <router-link
 20             :to="{name:‘leaderboard‘}"
 21             @mouseover.native="itransition($event )"
 22             @mouseout.native="outtransition($event)"
 23           >排行榜</router-link>
 24         </el-menu-item>
 25         <el-menu-item index="/library">
 26           <router-link
 27             :to="{name:‘library‘}"
 28             @mouseover.native="itransition($event )"
 29             @mouseout.native="outtransition($event)"
 30           >书库</router-link>
 31         </el-menu-item>
 32         <el-menu-item index="/recharge">
 33           <router-link
 34             to="/recharge"
 35             @mouseover.native="itransition($event )"
 36             @mouseout.native="outtransition($event)"
 37           >充值</router-link>
 38         </el-menu-item>
 39         <el-menu-item index="/vip">
 40           <router-link
 41             :to="{name:‘vip‘}"
 42             @mouseover.native="itransition($event )"
 43             @mouseout.native="outtransition($event)"
 44           >VIP专区</router-link>
 45         </el-menu-item>
 46         <el-menu-item index="/institution">
 47           <router-link
 48             to="/institution"
 49             @mouseover.native="itransition($event )"
 50             @mouseout.native="outtransition($event)"
 51           >院校</router-link>
 52         </el-menu-item>
 53         <el-menu-item index="/community">
 54           <router-link
 55             to="/community"
 56             @mouseover.native="itransition($event )"
 57             @mouseout.native="outtransition($event)"
 58           >社区</router-link>
 59         </el-menu-item>
 60         <el-menu-item index="/author">
 61           <router-link
 62             to="/author"
 63             @mouseover.native="itransition($event )"
 64             @mouseout.native="outtransition($event)"
 65           >作者福利</router-link>
 66         </el-menu-item>
 67
 68         <div class="moveblock" ref="moveblock"></div>
 69       </el-menu>
 70     </el-row>
 71   </div>
 72 </template>
 73 <script>
 74 export default {
 75   data() {
 76     return {};
 77   },
 78   // created() {
 79   //   console.log(document.querySelector(".el-menu>.is-active").offsetLeft);
 80   // },
 81   mounted() {
 82     //获取menu宽度
 83     let menuwidth = document.querySelector(".el-menu-item.is-active>a")
 84       .offsetWidth;
 85     //获取li
 86     let liwidth = document.querySelectorAll(".el-menu li");
 87     //背景
 88     let moveblock = document.querySelector(".moveblock");
 89     //设置背景的宽度
 90     // moveblock.style.width = liwidth[0].offsetWidth + "px";
 91     let selfLeft = document.querySelector(".el-menu .is-active").offsetLeft;
 92
 93     moveblock.style.width = menuwidth + "px";
 94
 95     let winwidth = document.body.clientWidth;
 96     // console.log("base:" + selfLeft);
 97     moveblock.style.left = selfLeft + 35 + "px";
 98   },
 99   methods: {
100     handleSelect(key, keyPath) {
101       console.log(key, keyPath);
102     },
103     itransition($event) {
104       //为悬浮元素添加hover
105       // $event.currentTarget.className = "router-link-active hover";
106       //获取元素的left值
107       let left = $event.currentTarget.getBoundingClientRect().left;
108       //获取移动元素
109       let moveblock = document.querySelector(".moveblock");
110       //获取可视区域的宽度
111       let winwidth = document.body.clientWidth;
112       if (winwidth > 1200) {
113         moveblock.style.left = left - (winwidth - 1200) / 2 + "px";
114       } else {
115         moveblock.style.left = left + "px";
116       }
117     },
118     outtransition($event) {
119       // $event.currentTarget.className = "router-link-active";
120       //获取移动元素
121       let moveblock = document.querySelector(".moveblock");
122       //获取is-active的offsetLeft
123       let selfLeft = document.querySelector(".el-menu .is-active").offsetLeft;
124       // let selfLeft = this.$refs.moveblock.offsetLeft;
125       moveblock.style.left = selfLeft + 35 + "px";
126     }
127   }
128 };
129 </script>
130 <style lang="sass">
131     @import "@/assets/css/public/header/nav.scss";
132 </style>

一、element组件的is-active

:default-active="$route.path"

导航的is-active,当时纠结了好久,百度了好久看到这个办法,还是不行,后来才注意到要结合

<el-menu-item index="/index">

获取当前的路由路径和index中的数据进行对比,添加is-active

二、关于刷新后的元素offsetleft问题

最初的想法是

let selfLeft = document.querySelectorAll(".el-menu .is-active").offsetLeft;

 刷新后发现selfLeft的值为undefined,怀疑是mounted中无法获取刷新后元素的dom,先后试验了$nextTick 和setTimeout均无法解决问题,后将整体代码放到created()中仍未解决问题,

在created()中直接打印document.querySelectorAll(".el-menu .is-active").offsetLeft;也是现实undefined,document.querySelectorAll(".el-menu .is-active")为一个数组结构,果断换用

let selfLeft = document.querySelector(".el-menu .is-active").offsetLeft;

 出现数据,至此组件效果基本实现,代码结构稍显混乱,感觉有很大的优化空间,望各位大佬提出建议~



原文地址:https://www.cnblogs.com/Keyrt/p/10910511.html

时间: 2024-07-31 20:06:00

vue+elementui的导航滑块组件的相关文章

vue+elementUI 做的递归组件

废话少说,直接上最新鲜的干货 当然,你得提前安装好bootstrap,router,element-ui,vue-axios 1.上递归组件,此处参考了某位大神的代码,具体不知道是谁,因为到处都有人用 <template> <div> <template v-for='menu in menuList'> <!-- 如果当前有子菜单,则显示 el-submenu ,在el-subment 里调用 递归组件 --> <el-submenu v-if='m

vue + elementui 中的弹窗组件封装成公共组件

如果一个弹窗比较简单,可以直接放在页面中,通过visible属性的true,false控制显示隐藏就可以了,我们今天要说的是将个比较复杂的弹窗组件封装成全局组件,然后可以在项目中的任何一个页面引用~~下面走起 1.首先要注册个全局组件,用下面的全局API  Vue.component('my-component', { /* ... */ }) 在js文件中首先引入这个弹窗组件,组件名称是iesPersonRadioDialog,项目中会引入一个js文件,这个js文件中在分别引入其他的js,模块

vue实现首页导航面板组件

效果图 src/pages/home/nav.vue <template> <div class="nav"> <ul class="nav-list"> <li class="nav-item" v-for="(nav,index) in navItems" :key="index"> <a :href="nav.linkUrl"

vue element-ui 日期选择器组件 日期时间格式化

vue element-ui 组件开发大大提高了我们的效率,但有时候并不能满足我们的需求,例如时间,日期组件: element-ui 日期返回的格式是这样的,看下图: 但我们要的是另一个格式 , 如下图: 怎么解决? 可以用一个插件 moment.js 解决 1:下载,安装 npm install moment --save 2:引用,我这里是全局引用,并用原型链把方法挂到了vue上面,看下图: 3:使用,看下图: moment(date).format("YYYY-MM-DD HH:mm:ss

element-ui使用导航栏跳转路由用法

element-ui使用导航栏跳转路由用法 最近初学vue,试着做一个小项目熟悉语法与思想,其中使用elemen-ui的导航栏做路由跳转切换页面.下面记录一下学习过程 element-ui引入vue项目的用法参考element官网 首先复制官网的例子,在这基础上再修改成我们想要的样子. <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal"

vue element-ui IE9--11报 “无法获取未定义或null引用的属性‘toLowerCase’”

今天做zymh比赛的一个管理后台,用的技术是vue+element-ui+vue-router+axios,其他浏览器运行的很好,但是在IE(从IE11到IE9,vue支持IE9以上)都报错 点进去就是定位到了markUp这个函数,经查询是element-ui报错,element-UI在使用MessageBox,Message等组件时,只需要用import导入,而不需要继续Vue.component(Message.name,Message) . 将各个组件中的Vue.component(Mes

vue学习笔记の实现select组件

通过腾讯训练营这几天的学习,初步实现了自定义的选择下拉框组件,其中,可以把下拉选项抽离出来作为子组件,整个组件为父组件,其主要由<div>.<input>.<custom-select>.<ul>.<li>等标签构成基本的选择组件页面结构.主要的功能项:输入框及button按钮,构成初次展现的页面,通过点击输入框按钮,下拉列表选择项出现,当点击选择项中的某一项内容时,输入框中会出现相应的内容,再点击输入框,下拉选择项列表隐藏.同时,通过父组件与子

elementUI的导航栏在刷新页面的时候选中状态消失的解决

首先elementUI的导航栏中的选中项的高亮显示时的字体颜色可以在属性中设置,但是高亮时的背景颜色不能设置,所以要自己修改高亮的背景颜色 .el-menu-item.is-active { background-color: #00b4aa !important; } 在使用elementUI构建vue项目的时候会遇到页面刷新的时候子路由会保持原来的,页面中的内容也是当前对应路由的内容,但是elementUI的导航栏中的高亮显示的却失去了原来的状态,以下是我解决这个内容的方法,暂时没有发现什么

Vue学习笔记入门篇——组件的使用

本文为转载,原文:Vue学习笔记入门篇--组件的使用 组件定义 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 组件使用 注册 注册一个全局组件,你可以使用 Vue.component(tagName, options).组件在注册之后,便可以在父实例的模块中以自定义元素 的形式使用.