Vue使用better-scroll左右菜单联动
说明
- 最近想做一个vue商城小项目,练习一下vue的语法,刚刚好碰到了需要左右菜单实现联动,因此就接触了 better-scroll。
- github地址
- 中文文档。
代码
- 页面结构以及数据
//页面结构<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-scrollimport 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的第一个元素为0let height = 0this.heightList.push(height)//之后的高度即为当前li的高度加上之前面li的高度和lis.forEach(item =>{height += item.clientHeightthis.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.rItemlet el = rItem[index]this.goodmenu.scrollToElement(el, 1000)}
- 问题:有时候 currentIndex 会判断不准确,是滑动距离scrollY 以及右菜单 li的高度比较问题,同样一段代码,每个项目遇到的问题都是不一样的,我也是参考网上很多的例子,发现一到自己这里就出现了很多问题,每个人遇到的问题都是不一样的,结合自己的问题,想办法解决,这也是成长的一部分。
转载于:https://www.cnblogs.com/HJ412/p/10755722.html
Vue使用better-scroll左右菜单联动相关推荐
- Vue实现左右菜单联动实现
知乎 个人博客 Github 源码传送门:Rain120/vue-study 根据掘金评论需求,更新了数据接口并修复了一些问题 之前在外卖软件上看到这个左右联动的效果,觉得很有意思,所以就尝试使用Vu ...
- vue 左右滑动菜单_Vue实现左右菜单联动实现代码
本文介绍了Vue实现左右菜单联动实现代码吗,分享给大家,也给自己留个笔记,具体如下: 之前在外卖软件上看到这个左右联动的效果,觉得很有意思,所以就尝试使用 Vue 来实现,将这个联动抽离成为一个单独的 ...
- PHP随机配菜_PHP+JS三级菜单联动菜单实现方法
本文实例讲述了PHP+JS三级菜单联动菜单实现方法.分享给大家供大家参考,具体如下: 智能递归菜单-读取数据库 TD { FONT-FAMILY: "Verdana", " ...
- js_jQuery【下拉菜单联动dom操作】
下拉菜单联动dom操作案例 源码: <!DOCTYPE html> <html lang="en"><head><meta charset ...
- vue怎么实现右键二级菜单_vue中如何自定义右键菜单详解
在所编辑的页面,需要添加右键菜单的元素,绑定contextmenu事件,如下: v-for="item in resourceList" :key="item.id&qu ...
- Flutter 左右菜单联动
效果: 像这种左右菜单联动的效果很常见,即点击左边菜单列表右边刷新,这里演示一下在Flutter中的实现 页面结构 很简单,分为左右结构,左边是一个ListView,右边也是一个ListView,然后 ...
- vue项目-element UI-NavMenu 导航菜单始终只展开一个
vue项目-element UI-NavMenu 导航菜单始终只展开一个 全局搜索:unique-opened找到该配置将其改成true unique-opened:是否只保持一个子菜单的展开 < ...
- vue、Dropdown 下拉菜单、Dropdown属性事件、vue Dropdown 全部下拉菜单、vue Dropdown 全部属性事件
vue.Dropdown 下拉菜单.Dropdown属性事件.vue Dropdown 全部下拉菜单.vue Dropdown 全部属性事件 设计规则 何时使用 代码演示 1.基本 2.右键菜单 3. ...
- axure添加下拉菜单联动
axure使用中会遇到下拉菜单联动的设置问题,本文分步讲解. 首先,在空白页面中拖拽一个下拉框,如下所示: 之后设置该下拉框选项,如下所示: 设置下拉框名字为班号,如下所示: 之后再拖入一个下拉框,并 ...
- Android 多级菜单联动操作
今天是分享一个android实现三级菜单联动效果,到了第三级菜单有点复杂,下面带着大家看下代码. 项目结构: 为了让大家更有的耐心的阅读, 我先从简单的开始说起,我们先看下demo实现的效果吧!这样可 ...
最新文章
- HOWTO:InstallShield中如何制作应用程序的卸载快捷方式
- 本地数据jqGrid分页
- Javascript框架 - ExtJs - 类
- Activity中的setDefaultKeyMode() (转载)
- 轻松搭建Windows8云平台开发环境
- 共享内存shared pool (3):Library cache
- 项目管理十大知识领域之项目成本管理
- 理论小知识:字符串mset命令
- [转帖]「白帽黑客成长记」Windows提权基本原理(上)
- Excel技巧之减肥
- 第四回 还君明珠双泪垂,恨不相逢未嫁时
- SPA和MPA的区别
- 中国智能手机集成电路(IC)行业市场供需与战略研究报告
- 高中计算机必修选修知识点,新课标高中数学必修+选修全部知识点精华归纳总结...
- 一支口红用了5年_一支口红用多久最好 口红一般用多久
- 半球展开图_新手入门如何学习钣金放样展开,老师傅分享篇(二)!
- 考研英语 - word-list-9
- dmc matlab程序,DMC信道容量迭代算法(Matalab实现)
- SQL注入葵花宝典(基础篇)
- 程序人生:Hello’s P2P