js自定义数字跳动效果computeNumber

<!--
 * @Author: your name
 * @Date: 2020-03-29 10:37:57
 * @LastEditTime: 2020-03-29 10:42:43
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \lwnhwyfront\src\components\computeNumber.vue
 -->
<template>
  <div id="demo">
    <div class="nwwest-roll" :style="{'height': styleHeight + 'px'}" id="nwwest-roll">
      <ul id="roll-ul" class="roll-ul">
        <li v-for="(item, index) in list" :style="{'height': styleHeight + 'px'}" ref="rollul" class="rollLi" :key="index" :class="{anim:animate==true}">
          <span class="name">{{item}}</span>
        </li>
      </ul>
    </div>
  </div>
</template>
<script>
  export default {
    props: {
      number: {
        type: [String, Number],
        default: ''
      },
      styleHeight: {
        type: Number,
        default: 0
      },
      autoplay: {
        type: Boolean,
        default: false
      }
    },
    watch: {
      number (newValue, oldValue) {
        if( newValue !== oldValue ) {
          this.list[1] = newValue
          this.list[0] = oldValue
          this.num = newValue;
          this.scroll(this.number);
        }
      }
    },
    data () {
      return {
        animate: true,
        list: [this.number, this.number],
        num: this.number,
        newNum: this.number,
        timeout: '',
        timeInterval: ''
      }
    },
    mounted () {
      if( this.autoplay ) {
        this.timeInterval = setInterval(() => {
          this.scroll(this.number);
        }, 4000);
      }
    },
    beforeDestroy() {
      clearInterval(this.timeout)
      clearInterval(this.timeInterval)
    },
    methods: {
      scroll(num){
        let con1 = this.$refs.rollul;
        /* styleHeight */
        // let marginTopHeight = (this.styleHeight - 10) + 'px'
        con1[0].style.marginTop = 0;
        this.animate = !this.animate;
        var that = this;
        that.timeout = setTimeout(() =>{
          that.list[1] = num
          con1[0].style.marginTop = -this.styleHeight + 'px';
          that.animate = !that.animate;
          setTimeout(() => {
            that.list[0] = num
          }, 1000);
        }, 80)
      }
    }
  }
</script>
<style lang="" scoped>
  .nwwest-roll {
    overflow: hidden;
  }
  .nwwest-roll .name{
    display: inline-block;
  }

  .roll-ul {
    list-style: none;
    padding: 0;
    margin: 0;
  }
  .anim {
    transition: all 1s;
  }
</style>

页面使用:xxx.vue页面

 
        JS:import computeNumber from "@/components/computeNumber.vue";
            HTML:<div class="f45">
              <compute-number autoplay :styleHeight="45" :number="huAll"></compute-number>
            </div>

 

 



posted @ 2021-07-11 21:47  soon_k  阅读(517)  评论(0编辑  收藏  举报