vue-无缝滚动+高亮某一行

6 篇文章 0 订阅

vue实现无缝滚动首先一开始参考了

https://www.cnblogs.com/liuerpeng/p/11724257.html但是实现的效果会出现一点点的停顿

后面决定使用插件vue-seamless-scroll

npm install vue-seamless-scroll --save

在main.js里面

import scroll from 'vue-seamless-scroll'
Vue.use(scroll)

页面上

 

<vue-seamless-scroll
            :data="data"
            class="seamless-warp"
            :class-option="classOption"
            ref="unitScroll"
          >
            <ul
              class="infinite-list"
              @mouseenter="mEnter"
              @mouseleave="mLeave"
            >
              <li
                v-for="(item,index) in data"
                :class="item.active  ? 'infinite-list-item item-active' : 'infinite-list-item'"
                :key="index"
                @click="clickSelectedUnit(index)"
              >
                <div class="infinite-left">{{ item.xxx }}</div>
                <div class="infinite-right">{{item.xxxx}}</div>
                <div class="infinite-right">{{item.xxxxx}}</div>
              </li>
            </ul>
</vue-seamless-scroll>

通过计数器去进行计数并根据当前transform得出在第二行的数据是那一个然后进行高亮,具体可以看scroll方法 

computed: {
    classOption() {
      return {
        hoverStop: true,
        step: 0.3
      };
    }
  },

mounted() {
    let self = this;
    this.getData();
    // 无缝滚动计数器
    if (this.timer1) {
      clearInterval(this.timer1); // 如果有先清除计数器
    }
    this.timer1 = setInterval(self.scroll, 50); // 开始计数
  },

data(){
    return {
        timer1:"",
        data:[]
    }
}

methods:{
    getData(){
        //todo
    },

    // 高亮某一行
    scroll() {
      let self = this;
      let parentNode = document.getElementsByClassName("infinite-list")[0]
        .parentNode.parentNode;
      let translates = parentNode.style.transform;
      let result = translates.match(/\(([^)]*)\)/); // 正则()内容
      let matrix = result ? result[1].split(",") : translates.split(",");
      let y = parseFloat(matrix[1]); // 拿到transyform的y的值
      let height = Math.floor(Math.abs(y) / 36) + 1;
      let child = document.getElementsByClassName("infinite-list")[1]
        .childNodes;
      if (height >= self.data.length) {
        child[0].classList.add("item-active");
        self.clickSelectedUnit(0);
      } else {
        child[0].classList.remove("item-active");
        self.clickSelectedUnit(height);
      }
    },

    // 鼠标移入
    mEnter() {
      clearInterval(this.timer1);
    },

    // 鼠标移出
    mLeave() {
      this.timer1 = setInterval(this.scroll, 50);
    },

    // 实有单位选中某一行高亮
    clickSelectedUnit(i) {
      this.data.forEach((item, index) => {
        if (index == i) {
          item.active = true;
        } else {
          item.active = false;
        }
      });
    },
}
.seamless-warp {
    overflow: hidden;
    margin: calc(1vh) vw(0) calc(2.2vh) vw(0);
  }
  .infinite-list {
    padding: 0px vw(20);

    .infinite-list-item {
      height: 32px;
      display: flex;
      justify-content: space-between;
      align-items: center;
      font-size: 14px;
      color: #222222;
      margin-bottom: 5px;
      list-style: none;
      div {
        width: vw(140);
      }
    }
    .item-active {
      background-color: #f4f8ff;
      color: #3e7bff;
    }
  }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值