vue 上下轮播封装

<template>
  <div class="roll">
    <ul :class="{'roll-content': true, 'sliding': sliding}" ref="list">
      <li class="roll-list" v-for="(item, index) in data" :key="index" :style="liStyle">
        <slot :item="item" :index="index">
        </slot>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  props: {
    data: {
      type: Array,
      required: true
    },
    itemHeight: {
      type: Number,
      default: 24
    },
    rollNum: {
      type: Number,
      default: 1
    },
    time: {
      type: Number,
      default: 4000
    },
    showNum: {
      type: Number,
      required: true
    }
  },
  data () {
    return {
      liStyle: '',
      interval: false,
      sliding: false
    }
  },
  watch: {
    itemHeight () {
      this.initStyle()
    },
    data: {
      deep: true,
      handler (val, oldval) {
        if (oldval.length === 0 && val.length > this.showNum) {
          this.goRoll()
        }
      }
    }
  },
  destroyed () {
    clearInterval(this.interval)
  },
  mounted () {
    this.initStyle()
    this.data.length > this.showNum && this.goRoll()
  },
  methods: {
    initStyle () {
      this.liStyle = `height: ${this.itemHeight}px;`
    },
    goRoll () {
      this.interval = setInterval(() => {
        let list = this.$refs.list
        this.sliding = true
        list.style.marginTop = `-${this.itemHeight * this.rollNum}px`
        setTimeout(() => {
          for (var i = 0; i < this.rollNum; i++) {
            let first = this.data.shift()
            this.data.push(first)
          }
          this.sliding = false
          list.style.marginTop = '0px'
        }, 1500)
      }, this.time)
    }
  }
}
</script>

<style lang="scss" scoped>
  .roll{
    color: #fff;
    height: 100%;
    overflow: hidden;
    .sliding {
      transition: all 1.5s;
    }
    .roll-list{
      font-size: 16px;
      overflow: hidden;
    }
  }
</style>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值