vue和better-scroll实现列表左右联动效果详解


Posted in Javascript onApril 29, 2019

一.实现思路

  1. (1)实现上是左右分别一个better-scroll列表
  2. (2)利用计算右侧列表每一个大区块的高度来计算左侧的位置

二.实现

1.实现左右两个better-scroll

(1)dom结构(better-scroll要求,会把最外层dom的第一个子元素作为要滚动的区域)

左边滚动列表dom
 <div class="menu-wrapper" v-el:menu-wrapper>
   <ul>
    <li v-for="item in goods" class="menu-item"
      :class="{'current':currentIndex === $index}"
      @click="selectMenu($index,$event)">
     <span class="text border-1px">
      <span v-show="item.type > 0" class="icon"
       :class="classMap[item.type]"></span>{{item.name}}
     </span>
    </li>
   </ul>
  </div>

右边滚动列表dom
<div class="food-wrapper" v-el:food-wrapper>
   <ul>
    <li v-for="item in goods" class="food-list food-list-hook">
     <h1 class="title">{{item.name}}</h1>
     <ul>
      <li v-for="food in item.foods" class="food-item border-1px">
       <div class="icon">
        <img width="57" height="57" :src="food.icon">
       </div>
       <div class="content">
        <h2 class="name">{{food.name}}</h2>
        <p class="desc">{{food.description}}</p>
        <div class="extra">
         <span class="count">月售{{food.sellCount}}份</span>
         <span>好评率{{food.rating}}%</span>
         <div class="price">
          <span class="now">¥{{food.price}}</span>
          <span class="old" v-show="food.oldPrice">¥{{food.oldPrice}}</span>
         </div>
        </div>
       </div>
      </li>
     </ul>
    </li>
   </ul>
  </div>

在数据请求完成后的$nextTick中初始化better-scroll,就能实现两个列表分别能滚动,至于联动,要后面自己做

_initScroll() {
    this.menuScroll = new BScroll(this.$els.menuWrapper,{
     click:true  //允许better-scroll列表上的点击事件
    });
    this.foodsScroll = new BScroll(this.$els.foodWrapper,{
     probeType : 3  //让better-scroll监听scroll事件
    });
    this.foodsScroll.on('scroll',(pos) => {
     this.scrollY =Math.abs(Math.round(pos.y));
    })
   },

2.实现联动效果

(1)具体的联动实现思路

  1. 在渲染完成后($nextTick内),初始化better-scroll,并在初始化函数内添加右侧列表的scroll监听事件,并记录scrollY值到,存入vue的data中
  2. 在渲染完成后($nextTick内),计算右侧列表的每一个大区块的高度,并累加,存入数组listHeight
  3. 因为scrollY值在滚动中总是不断变化的,所以在computed中计算出currentIndex,当前滚动区域是哪一个大区块,也就是listHeight数组的下标
  4. 在dom中根据currentIndex应用左侧列表被点中的样式
  5. 在左侧列表某一项被点中的时候,右侧列表滑动到某一个大块区域,
//初始化better-scroll
_initScroll() {
    this.menuScroll = new BScroll(this.$els.menuWrapper,{
     click:true
    });
    this.foodsScroll = new BScroll(this.$els.foodWrapper,{
     probeType : 3
    });
    this.foodsScroll.on('scroll',(pos) => {
     this.scrollY =Math.abs(Math.round(pos.y));
    })
   },
_calculateHeight() {
    let foodList = this.$els.foodWrapper.getElementsByClassName("food-list-hook");
    let height = 0;
    this.listHeight.push(height);
    for(let i=0;i<foodList.length;i++) {
     let item = foodList[i];
     height += item.clientHeight;
     this.listHeight.push(height);
    }
   }
computed: {
   currentIndex() {
    for(let i=0;i< this.listHeight.length;i++) {
     let height1 = this.listHeight[i];
     let height2 = this.listHeight[i+1];
     if(!height2 || (this.scrollY >= height1 && this.scrollY < height2)){
      return i;
     }
    }
    return 0;
   }
  },
<div class="menu-wrapper" v-el:menu-wrapper>
   <ul>
    <!-- :class="{'current':currentIndex === $index}" 就是根据currentIndex应用左侧列表被点中的样式 -->
    <li v-for="item in goods" class="menu-item"
      :class="{'current':currentIndex === $index}"
      @click="selectMenu($index,$event)">
     <span class="text border-1px">
      <span v-show="item.type > 0" class="icon"
       :class="classMap[item.type]"></span>{{item.name}}
     </span>
    </li>
   </ul>
  </div>
//被点击事件
//dom
<div class="menu-wrapper" v-el:menu-wrapper>
   <ul>
    <!-- @click="selectMenu($index,$event)" 就是点击事件 -->
    <li v-for="item in goods" class="menu-item"
      :class="{'current':currentIndex === $index}"
      @click="selectMenu($index,$event)">
     <span class="text border-1px">
      <span v-show="item.type > 0" class="icon"
       :class="classMap[item.type]"></span>{{item.name}}
     </span>
    </li>
   </ul>
  </div>
//js  
selectMenu(index,event) {
    if(!event._constructed) {
     return ;
    }
    let foodList = this.$els.foodWrapper.getElementsByClassName("food-list-hook");
    let el = foodList[index];
    this.foodsScroll.scrollToElement(el,300);
   },

以上所述是小编给大家介绍的vue和better-scroll实现列表左右联动效果详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 节点操作 以及DOMDocument属性和方法
Dec 06 Javascript
(function($){...})(jQuery)的意思
Jul 22 Javascript
jQuery异步获取json数据方法汇总
Dec 22 Javascript
举例讲解Node.js中的Writable对象
Jul 29 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
Apr 01 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
May 30 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
Sep 15 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
Aug 24 Javascript
详解node字体压缩插件font-spider的用法
Sep 28 Javascript
微信小程序实现留言板功能
Nov 02 Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 Javascript
layui switch 开关监听 弹出确定状态转换的例子
Sep 21 Javascript
Vue 引入AMap高德地图的实现代码
Apr 29 #Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
Apr 29 #Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
Apr 29 #Javascript
微信小程序-form表单提交代码实例
Apr 29 #Javascript
vue在index.html中引入静态文件不生效问题及解决方法
Apr 29 #Javascript
微信小程序传值以及获取值方法的详解
Apr 29 #Javascript
小程序封装wx.request请求并创建接口管理文件的实现
Apr 29 #Javascript
You might like
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
php读取纯真ip数据库使用示例
2014/01/26 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
原生JavaScript实现随机点名表
2021/01/14 Javascript
Python修改Excel数据的实例代码
2013/11/01 Python
开始着手第一个Django项目
2015/07/15 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
Django框架实现的分页demo示例
2019/05/25 Python
Python实现平行坐标图的两种方法小结
2019/07/04 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
python调用私有属性的方法总结
2020/07/24 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
设计师珠宝:Ylang 23
2018/05/11 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
巾帼建功标兵事迹材料
2014/05/11 职场文书
单位委托书
2014/10/15 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
汽车转让协议书
2015/01/29 职场文书
小学校长开学致辞
2015/07/29 职场文书
宿舍管理制度范本
2015/08/07 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书