Vue使用better-scroll左右菜单联动
说明
代码
- 页面结构以及数据
//页面结构
<template>
<div id="wrap">
<div class="goodMenu" ref="goodMenu">
<ul>
<li v-for="(item ,index) in goodMenu" :key="index"
:class="{active: currentIndex === index}"
@click="selectLeft(index)" ref="lItem">{{ item}}</li>
</ul>
</div>
<div class="goodList" ref="goodList">
<ul>
<li v-for="(items, index) in goodList" :key="index" ref="rItem">
<p>{{ items.name}}</p>
<div v-for="(item, key) in items.data" :key="key">
{{ item}}
</div>
</li>
</ul>
</div>
</div>
</template>
//数据
<script>
export default {
data(){
return {
goodMenu: ['菜单1', '菜单2','菜单3', '菜单4', '菜单5', '菜单6', '菜单7', '菜单8'],
goodList: [
{ name: '菜单1', data: ['1.1', '1.2', '1.3', '1.4', '1.5']},
{ name: '菜单2', data: ['1.1', '1.2', '1.3', '1.4', '1.5', '1.6']},
{ name: '菜单3', data: ['1.1', '1.2', '1.3', '1.4', '1.5']},
{ name: '菜单4', data: ['1.1', '1.2', '1.3', '1.4', '1.5']},
{ name: '菜单5', data: ['1.1', '1.2', '1.3', '1.4', '1.5', '1.6', '1.7', '1.8']},
{ name: '菜单6', data: ['1.1', '1.2', '1.3', '1.4', '1.5']},
{ name: '菜单7', data: ['1.1', '1.2', '1.3', '1.4']},
{ name: '菜单8', data: ['1.1', '1.2']},
],
scrollY: 0,//获取实时滚动位置
heightList: []//获取每一个li的高度
}
}
</script>
- 渲染结果
- 左边菜单栏(goodMenu)。
- 右边菜单栏(goodList),每一项有一个标题:name,以及菜单数据: data数组。再结合 v-for指令及相关样式即可完成页面简单布局(不是重点)
- 其他数据先不必理会,先把页面结构渲染出来,下面会一一讲解。

better-scroll的使用
- 元素纵轴滚动
- 元素可以滚动,父元素高度固定,overflow为 hidden,子元素高度超过父元素高度即可滑动,不多解释。
- 左菜单、右菜单可以在父元素滑动
- 左菜单栏因为要用到 click事件,默认better-scroll是默认阻止 click事件,设置为true派发一个click事件。
- 右菜单栏,因为需要滚动,并且需要获取实时滚动距离scrollY,因此设置 probeType设置为3,它有三个值1、2、3。看以查看文档probeType。
//引入better-scroll
import Bscroll from 'better-scroll'
export default {
created(){
//因为 _scrollInit函数需要操作DOM,因此必须在DOM元素存在文档中才能获取DOM节点
//因此在 nextTick回调函数里面调用可以是实现此功能
this.$nextTick(() => {
this._scrollInit()
this.getHeight()
})
},
methods:{
//初始化 better-scroll
_scrollInit(){
this.menuList = new Bscroll(this.$refs.goodMenu, {
click: true
})
this.goodmenu = new Bscroll(this.$refs.goodList, {
probeType: 3
})
this.goodmenu.on('scroll', (pos) =>{
//获取实时滚动的距离 使用scrollY接收
this.scrollY = Math.abs(Math.round(pos.y))
})
}
}
- 获取右菜单栏每个li的高度
- 这里获取 li 的高度即为当前li的高度加上之前 li 的高度,第一个元素为 0(必须)
methods: {
getHeight(){
//获取每一个li的高度
const lis = this.$refs.rItem
//heightList的第一个元素为0
let height = 0
this.heightList.push(height)
//之后的高度即为当前li的高度加上之前面li的高度和
lis.forEach(item =>{
height += item.clientHeight
this.heightList.push(height)
})
}
}
- 右菜单滚动,左菜单同步
- 这里就是根据右菜单滑动的距离以及每一个每一个 li 的高度的比较返回当前应该显示左菜单 li的索引,让该 li 高亮显示,即:class="{active: currentIndex === index}"。
computed:{
currentIndex(){
const index = this.heightList.findIndex((item, index) =>{
return this.scrollY >= this.heightList[index] && this.scrollY < this.heightList[index + 1]
})
return index > 0 ? index : 0
}
}
- 左菜单点击,右菜单同步
- 把点击的 菜单索引传入,使用scrollToElement滚动到右菜单的目标元素
selectLeft (index) {
let rItem = this.$refs.rItem
let el = rItem[index]
this.goodmenu.scrollToElement(el, 1000)
}
- 问题:有时候 currentIndex 会判断不准确,是滑动距离scrollY 以及右菜单 li的高度比较问题,同样一段代码,每个项目遇到的问题都是不一样的,我也是参考网上很多的例子,发现一到自己这里就出现了很多问题,每个人遇到的问题都是不一样的,结合自己的问题,想办法解决,这也是成长的一部分。
Vue使用better-scroll左右菜单联动的更多相关文章
- 省市联动_简单的Demo,适用于各种二级菜单联动
最近搞了一个功能,是查询页面需要用到二级菜单联动,获取到选中的属性value传入到后台. 平常都是用AJAX或者JQuery ,通过XML或者JSON的方式,这样的话需要调用数据库,像典型得到省市联动 ...
- JavaScript(jquery)实现二级菜单联动
为什么写这篇随笔? 二级菜单的联动一直是我心中一块石头,犹记得大一的时候只会用一点的Dreamweaver,当时做二级菜单难受啊,啥都不会,网上找了些资料,也看不懂别人的代码更别说用起来了 前些日子. ...
- 【vue】iView-admin2.0动态菜单路由
vue项目实现动态路由有俩种方式 一.前端在routers中写好--所有--路由表 <前端控制路由>,登录时根据用户的角色权限来动态的显示菜单路由 二.前端通过调用接口请求拿到当前用户-- ...
- Ajax和JSON完成二级菜单联动的功能
首先需要找好JSON的包哦: 链接:http://pan.baidu.com/s/1jH6gN46 密码:lbh1 1:首先创建一个前台页面,比如secondMenu.jsp,源码如下所示: < ...
- vue+element-ui实现无限级动态菜单树
使用vue+element-ui实现无限级动态菜单 该案例实现主要使用递归的思想,递归对新人来容易迷惑的是自己调用自己,直到满足条件为止,接下来我们就一步一步实现一个动态多级菜单vue组件 搭建项目并 ...
- Jenkins配置下拉菜单联动效果
在使用Jenkins集成时,经常需要配置一些环境信息,由于测试.线上.预发布需要切换环境和域名,需要在Jenkins中配置下拉菜单联动效果. 首先选择参数化构建过程,然后首先配置环境,环境分为:测试环 ...
- vue+element实现省区市三级联动以及详细地址的输入
Vue+elementui实现省区市三级联动+详细地址的输入 详细需求,需要手动更改用户所在的地址. 安装依赖项 npm install element-china-area-data -S 在组建中 ...
- [转]asp三级select菜单联动(加数据库)
'数据库结构'类别1表名称:a 字段:ID,Name 说明:ID为主键是类别1的ID值,Name为类别1的名称'类别2表名称:aa 字段:ID,aID,Name 说明:ID为主键是类别2的ID值,aI ...
- vue监听scroll使用报错的解决办法
错误说明:在切换路由以后,依旧在其他页面触发了scroll有关的函数, 错误原因:在spa项目中,window对象是不变的,所以每次使用后需要销毁. 解决办法:vue的生命周期destroyed中销毁 ...
随机推荐
- HashMap 原理解析
HashMap是由数组加链表的结合体.如下图: 图中可以看出HashMap底层就是一个数组结构,每个数组中又存储着链表(链表的引用) JDK1.6实现hashmap的方式是采用位桶(数组)+链表的方式 ...
- Python综合应用:教你用字符打印一张怀旧风格的照片
1. 前言第一次在学校机房里见到计算机,还是上古时期.计算机型号大概是LASER-310吧,有点记不清了.那会儿,显示器还是单色的,只能显示文本,每行最多显示80个字符.想看图片,印象中只能用针式打印 ...
- 洛谷$P$2252 取石子游戏 博弈论
正解:博弈论 解题报告: 传送门! 威佐夫博弈板子昂$QwQ$ 关于这一类问题也有个结论,是说,先手必败的状态一定形如$(\left \lfloor i+\phi \right \rfloor,\le ...
- $Noip2018/Luogu5020$ 货币系统 $dp$
$Luogu$ 去年我这题获得了$20$的好分数$ovo..........$ $Sol$ 现在来看其实非常显然叭,只要把能被别的数表示出来的数去掉就好了. $f[i]$表示$i$数能否被其他数表示. ...
- C语言联合体(union)的使用方法及其本质-union
转载自:https://blog.csdn.net/si_zhou_qun_84342712/article/details/53187106 1.联合体union的基本特性——和struct的同与不 ...
- ffmpeg 视频合并
/// <summary> /// 视频合并 /// </summary> /// <param name="File1">第一个视频地址< ...
- Go中锁的那些姿势,估计你不知道
什么是锁,为什么使用锁 用俗语来说,锁意味着一种保护,对资源的一种保护,在程序员眼中,这个资源可以是一个变量,一个代码片段,一条记录,一张数据库表等等. 就跟小孩需要保护一样,不保护的话小孩会收到伤害 ...
- Netty快速入门(08)ByteBuf组件介绍
前面的内容对netty进行了介绍,写了一个入门例子.作为一个netty的使用者,我们关注更多的还是业务代码.也就是netty中这两种组件: ChannelHandler和ChannelPipeline ...
- kettle连接oracle数据库报错,ORA-12505
报错信息: Error connecting to database: (using class oracle.jdbc.driver.OracleDriver) Listener refused t ...
- map set vector用法小总结
1.Map 定义 #include<map> map<string,bool> mp; 插入 mp[s]=; mp.insert(make_pair(s,)); 输出 cout ...