Vue如何控制鼠标滚轮滚动的距离,Vue如何控制鼠标滚轮在元素中滚动一次的距离

Vue如何控制鼠标滚轮滚动的距离,Vue如何控制鼠标滚轮在元素中滚动一次的距离

首先是解决问题的代码 ,之后在讲解 原理 ,以及自己的历程

代码

元素:
<div  ref="menu" @scroll="mouseScroll"> </div>
注意:元素必须是有滚动条的(本方法之支持上下滚动)


 data(){
    return {
              settm_2:true,
              tmat: "",
              settm_3: 0,
              settm_4: 0,
methods: {
    //    item  参数为数字,正数为向上,负数为向下----- 列:10,-10
    //鼠标滚动封装函数
    fun_going(item) {
      this.$refs.menu.scrollTop = this.settm_3;
      clearTimeout(this.tmat);
      this.tmat = setTimeout(() => {
          this.$refs.menu.scrollTop = this.$refs.menu.scrollTop + item;
          this.settm_3 = this.$refs.menu.scrollTop;
          this.settm_4 = this.$refs.menu.scrollTop;
      }, 100);
    // 鼠标滚动事件
    mouseScroll() {
      if (this.$refs.menu.scrollTop > this.settm_4) {
        //向下运动时
        this.fun_going(10);
      if (this.$refs.menu.scrollTop < this.settm_4) {
        //向上运动时
        this.fun_going(-10);


原理

由于@scroll是在判定 鼠标滚轮 滚动的时候执行函数,当你的滚动条滚到不能在滚得时候就不会再执行,所以在你滚到底或者顶的时候,函数不会再执行。

我这里设置了一个变量来记录元素滚动条滚动后的距离顶部的值,所以我一开始是设置settm_4:0

用this.$refs.menu.scrollTop获取滚动条距离顶部的值

当滑动的时候触发函数mouseScroll,并把this.$refs.menu.scrollTop赋值给this.settm_4来记录距离顶部的值方便判断。

然后用if语句

      if (this.$refs.menu.scrollTop > this.settm_4) {
        //向下运动时
       this.settm_4=this.$refs.menu.scrollTop
      if (this.$refs.menu.scrollTop < this.settm_4) {
        //向上运动时
        this.settm_4=this.$refs.menu.scrollTop

向下滑动时,this.$refs.menu.scrollTop比this.settm_4默认的0大,所以进入第一个if,并且记录下这次滑动距离顶部的值。

向上滑动时,this.$refs.menu.scrollTop比向下滑动时记录的this.settm_4的值要小,所以进入第二个if

这样就实现了判断滚动条是向下还是向上运动。

接下来举一个例子实现当向下滚动时控制距离(向上滚动同理),我这里采用是定时器

 if (this.$refs.menu.scrollTop > this.settm_4) {
        //向下运动时对距离顶部的值进行拦截,使它固定等于settm_3(初始为0)方便用来自己控它的距离
      this.$refs.menu.scrollTop = this.settm_3;
      //取消定时器,因为滑动一次鼠标滚轮,该函数会多次执行(大概为12次左右),如果执行多次他会
      //反复向下滑动你想让他滑动的距离(大概为12次左右),但是我们只想让他执行一次就够了,所以
      //可以用定时器实现,每次进入的时候先停止定时器,然后再开启,这样就可以只在最后一次执行计时器
      clearTimeout(this.tmat);
      this.tmat = setTimeout(() => {
          // item为需要向下移动的值
          // 由于滚动条有变化,所以会再次执行该函数(mouseScroll)
          this.$refs.menu.scrollTop = this.$refs.menu.scrollTop + item;
          // 更新settm_4的值,用来判断滚动条是向上还是向下滑动
          // 因为它是自执行不是鼠标滚轮执行的,所以 this.$refs.menu.scrollTop == this.settm_4;
          // 它不会走>或<的if语句
          this.settm_4 = this.$refs.menu.scrollTop;
          // 更新settm_3 的值,方便下一次拦截