常用mixin

4/5/2020 Vue

# 鼠标滚轮变换横向滚动

// 使用时请把需变换滚动的目标 dom id设置成  "scroll-container"
export const setScroolMixin = {
  data() {
    return {
      targetDom: null,
    };
  },
  mounted(){
    this.$nextTick(()=>{
      this.setScrool()
    })
  },
  beforeDestroy() {
    if (this.targetDom) {
      this.targetDom.removeEventListener(
        "DOMMouseScroll",
        this.handlerMouserScroll
      );
      this.targetDom.removeEventListener(
        "mousewheel",
        this.handlerMouserScroll
      );
    }
  },
  methods: {
    /*容器绑定鼠标滚轮事件*/
    setScrool() {
      //绑定的容器
      this.targetDom = document.getElementById("scroll-container"); // 获取DOM元素节点
      // 添加监听事件(不同浏览器,事件方法不一样,所以可以作判断,也可以如下偷懒)
      this.targetDom.addEventListener(
        "DOMMouseScroll",
        this.handlerMouserScroll,
        false
      ); //滚轮事件
      this.targetDom.addEventListener(
        "mousewheel",
        this.handlerMouserScroll,
        false
      ); //滚轮事件
    },

    handlerMouserScroll(event) {
      //获取滚轮跨距,兼容获取方式
      let detail = event.wheelDelta || event.detail || event.wheelDeltaY;
      /*反向*/
      let moveForwardStep = -1;
      /*正向*/
      let moveBackStep = 1;
      let step = 0;
      //如果跨步大于0,表明正向跨步,将跨步放大100倍,改变滑动速度,如果跨步小于0,表明反向跨步,将跨步放大500倍,改变滑动速度
      step = detail > 0 ? moveForwardStep * 80 : moveBackStep * 80;
      /*覆盖当前滚动条的位置,单位是像素,叠增或剃减*/
      // this.targetDom.scrollLeft = this.targetDom.scrollLeft + step

      //平滑值(越小越平滑越持久,反之,总之。总之,不能小于等于0,不能大于等于1,作者建议值:0.8)
      let slipNum = 0.8;
      //末尾值(越小,则越平稳,越大,则越仓促,作者建议值:5)
      let endNum = 5;
      /*递减步伐最大初始值=滚轮单位跨步值*/
      let decreasingPaceNum = step;
      /*平滑速度,越大,则越慢,越小,则越慢,作者建议值:70*/
      let paceNum = 70;

      /*效果一*/
      let t = setInterval(() => {
        if (Math.abs(decreasingPaceNum) < endNum) {
          clearInterval(t);
          return;
        }
        decreasingPaceNum = decreasingPaceNum * slipNum;
        this.targetDom.scrollLeft =
          this.targetDom.scrollLeft + decreasingPaceNum;
      }, paceNum);
    },
  },
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Last Updated: 12/30/2022, 2:33:12 PM