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 相关文章推荐
学习ExtJS(一) 之基础前提
Oct 07 Javascript
js 未结束的字符串常量错误解决方法
Jun 13 Javascript
javascript基础第一章 JavaScript与用户端
Jul 22 Javascript
对xmlHttp对象方法和属性的理解
Jan 17 Javascript
jQuery 选择器详解
Jan 19 Javascript
javascript中使用正则表达式清理table样式的代码
Apr 01 Javascript
JS删除数组里的某个元素方法
Feb 03 Javascript
详解从买域名到使用pm2部署node.js项目全过程
Mar 07 Javascript
Vue程序调试的方法
Jun 17 Javascript
浅析Angular 实现一个repeat指令的方法
Jul 21 Javascript
vuex分模块后,实现获取state的值
Jul 26 Javascript
Ajax实现页面无刷新留言效果
Mar 24 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
php 获取完整url地址
2008/12/20 PHP
php变量范围介绍
2012/10/15 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
jquery animate 动画效果使用说明
2009/11/04 Javascript
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
js cavans实现静态滚动弹幕
2020/05/21 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
财务会计人员岗位职责
2013/11/30 职场文书
运动会标语
2014/06/21 职场文书
土地租赁意向书
2014/07/30 职场文书
乡镇党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
干部作风建设工作总结
2014/10/29 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
Python数据分析之pandas读取数据
2021/06/02 Python
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
Python极值整数的边界探讨分析
2021/09/15 Python