说明

  • 最近想做一个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的使用

  • 元素纵轴滚动

    • 元素可以滚动,父元素高度固定overflowhidden,子元素高度超过父元素高度即可滑动,不多解释。
  • 左菜单、右菜单可以在父元素滑动
    • 左菜单栏因为要用到 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左右菜单联动相关推荐

  1. Vue实现左右菜单联动实现

    知乎 个人博客 Github 源码传送门:Rain120/vue-study 根据掘金评论需求,更新了数据接口并修复了一些问题 之前在外卖软件上看到这个左右联动的效果,觉得很有意思,所以就尝试使用Vu ...

  2. vue 左右滑动菜单_Vue实现左右菜单联动实现代码

    本文介绍了Vue实现左右菜单联动实现代码吗,分享给大家,也给自己留个笔记,具体如下: 之前在外卖软件上看到这个左右联动的效果,觉得很有意思,所以就尝试使用 Vue 来实现,将这个联动抽离成为一个单独的 ...

  3. PHP随机配菜_PHP+JS三级菜单联动菜单实现方法

    本文实例讲述了PHP+JS三级菜单联动菜单实现方法.分享给大家供大家参考,具体如下: 智能递归菜单-读取数据库 TD { FONT-FAMILY: "Verdana", " ...

  4. js_jQuery【下拉菜单联动dom操作】

    下拉菜单联动dom操作案例 源码: <!DOCTYPE html> <html lang="en"><head><meta charset ...

  5. vue怎么实现右键二级菜单_vue中如何自定义右键菜单详解

    在所编辑的页面,需要添加右键菜单的元素,绑定contextmenu事件,如下: v-for="item in resourceList" :key="item.id&qu ...

  6. Flutter 左右菜单联动

    效果: 像这种左右菜单联动的效果很常见,即点击左边菜单列表右边刷新,这里演示一下在Flutter中的实现 页面结构 很简单,分为左右结构,左边是一个ListView,右边也是一个ListView,然后 ...

  7. vue项目-element UI-NavMenu 导航菜单始终只展开一个

    vue项目-element UI-NavMenu 导航菜单始终只展开一个 全局搜索:unique-opened找到该配置将其改成true unique-opened:是否只保持一个子菜单的展开 < ...

  8. vue、Dropdown 下拉菜单、Dropdown属性事件、vue Dropdown 全部下拉菜单、vue Dropdown 全部属性事件

    vue.Dropdown 下拉菜单.Dropdown属性事件.vue Dropdown 全部下拉菜单.vue Dropdown 全部属性事件 设计规则 何时使用 代码演示 1.基本 2.右键菜单 3. ...

  9. axure添加下拉菜单联动

    axure使用中会遇到下拉菜单联动的设置问题,本文分步讲解. 首先,在空白页面中拖拽一个下拉框,如下所示: 之后设置该下拉框选项,如下所示: 设置下拉框名字为班号,如下所示: 之后再拖入一个下拉框,并 ...

  10. Android 多级菜单联动操作

    今天是分享一个android实现三级菜单联动效果,到了第三级菜单有点复杂,下面带着大家看下代码. 项目结构: 为了让大家更有的耐心的阅读, 我先从简单的开始说起,我们先看下demo实现的效果吧!这样可 ...

最新文章

  1. HOWTO:InstallShield中如何制作应用程序的卸载快捷方式
  2. 本地数据jqGrid分页
  3. Javascript框架 - ExtJs - 类
  4. Activity中的setDefaultKeyMode() (转载)
  5. 轻松搭建Windows8云平台开发环境
  6. 共享内存shared pool (3):Library cache
  7. 项目管理十大知识领域之项目成本管理
  8. 理论小知识:字符串mset命令
  9. [转帖]「白帽黑客成长记」Windows提权基本原理(上)
  10. Excel技巧之减肥
  11. 第四回 还君明珠双泪垂,恨不相逢未嫁时
  12. SPA和MPA的区别
  13. 中国智能手机集成电路(IC)行业市场供需与战略研究报告
  14. 高中计算机必修选修知识点,新课标高中数学必修+选修全部知识点精华归纳总结...
  15. 一支口红用了5年_一支口红用多久最好 口红一般用多久
  16. 半球展开图_新手入门如何学习钣金放样展开,老师傅分享篇(二)!
  17. 考研英语 - word-list-9
  18. dmc matlab程序,DMC信道容量迭代算法(Matalab实现)
  19. SQL注入葵花宝典(基础篇)
  20. 程序人生:Hello’s P2P

热门文章

  1. March 2007 CTP Linq 的一些改变
  2. spring集成kafka
  3. 5G是卡位未来的重要基础设施 物联网已成为新的攻击入口
  4. struts导入Excel进行解析
  5. 20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程
  6. IPV4报头格式详解
  7. myeclipse优化方案
  8. 损失函数中正则化项L1和L2的理解
  9. 离线轻量级大数据平台Spark之MLib机器学习协同过滤ALS实例
  10. Ethernet/IP 学习笔记六