s

vue右侧滚动,左侧联动联动,以及点击左侧,右侧滚东到相应区域的做法!!!

vue右侧滚动,左侧联动联动

1.首先要保证你的 ul 可以滑动, 这里借助第三方 滑动库  better-scroll.js  

使用方法:

npm install better-scroll

import BScroll from 'better-scroll'

new BScroll('.包裹ul的容器class')  【https://www.awesomes.cn/repo/ustbhuangyi/better-scroll】

 

 

2.获得所有 ul 下面的li 离 滑动条顶部的距离 数组 tops

  通过累加 li的  clientHeight 到一个 数组中

_initTops () {
      let tops = [];
      let top = 0;
      tops.push(top)
      let lis = this.$refs.foodsUl.querySelectorAll('.food-list-hook');
      [...lis].forEach((li) => {
        top += li.clientHeight
        tops.push(top)
      })
      this.tops = tops // tops 定义在vue实例data属性上
    },

3.获得滚动条滑动距离

  better-scroll 提供了 获取滚掉条滚动距离的函数

     const fBS = new BScroll('.foods-wrapper', {probeType: 2}) // 第一个参数为包裹ul容器class  传递第二个配置参数 
      /* 
      probeType: 2  表示允许获取y轴滑动距离
      
      */
      fBS.on('scroll', ({x, y}) => { // 需要借助 better-scroll 提供的on 函数来绑定滑动事件, 回调函数中 x,y 分别表示 滑动的x y轴距离
        this.scrollY = Math.abs(y)     //vue 实例data 属性上 初始化 scrollY,然后将滚动条滚动距离实时传递给scrollY 
      })

4.将scrollY与tops中的元素比较,在那个范围内就返回这个元素索引值, 用于 动态加载 高亮类 current表示当前是在这个区域

computed : {
    
    currentIndex () { //v-for 渲染时 的 index和 这里返回的index 比较  如果 相等 就给 li加上 相应高亮类【
<li class="menu-item" v-for="(good, index) in store" :key="index"
              :class="{current: index===currentIndex}" @click="clickMenuItem(index)">
const {scrollY, tops} = this
      const index = [...tops].findIndex((top, index) => {
        return scrollY >= top && scrollY < tops[index + 1]
      })
      console.log(index)
      return index
    }
  },

5. 快速滑动,利用惯性 滑动时,左侧nav不变化, =》 better-scroll 提供了 监听 滚动结束的事件  scrollEnd

绑定这个事件,将 结束位置的滚动条移动距离赋值给 scrollY即可!!!

 

点击左侧,右侧滚东到相应区域

需要主义的是  better。scroll 默认会阻止元素的点击事件, 需要通过配置 better-scroll 实例来统一分发点击事件

【click: true】

<li class="menu-item" v-for="(good, index) in store" :key="index" :class="{current: index===currentIndex}" @click="clickMenuItem(index)">

  methods

  

clickMenuItem (index) {
      this.scrollY = this.tops[index];
      this.fBS.scrollTo(0,-this.tops[index], 200) // this.FBS 为 better-scroll实例对象
    // scrollTo() 为better-scroll 提供函数, 表示滑动到那个位置 scrollTo(x,y,time, type) xy位置,time:动画事件, type:滑动方式(先快后满,匀速。。。)
    
    

  

【还有和scrollToElement】

  scrollToElement(el, time, offsetX, offsetY, easing)


  • 参数:
    • {DOM | String} el 滚动到的目标元素, 如果是字符串,则内部会尝试调用 querySelector 转换成 DOM 对象。
    • {Number} time 滚动动画执行的时长(单位 ms)
    • {Number | Boolean} offsetX 相对于目标元素的横轴偏移量,如果设置为 true,则滚到目标元素的中心位置
    • {Number | Boolean} offsetY 相对于目标元素的纵轴偏移量,如果设置为 true,则滚到目标元素的中心位置
    • {Object} easing 缓动函数,一般不建议修改,如果想修改,参考源码中的 ease.js 里的写法
  • 返回值:无
  • 作用:滚动到指定的目标元素。

}

 

posted @ 2021-05-31 15:55  努力不搬砖的iori  阅读(1495)  评论(0编辑  收藏  举报