实现简单的数字滚动效果

1,300 阅读1分钟

实现简单的数字滚动效果

工作中遇到的小组件分享

效果

lxb.gif

实现原理

每个数字使用0-9竖向排列,利用transform:translateY()改变数字位置,完了加超出隐藏,再加个transition动画过度效果

滚动3.png computed处理传入的的数据,得到一个计算后的数字位置百分比数组。

  computed: {
    str() {
      return this.num.toString();
    },
    numArr() {
      let result = [];
      for(let i = 0; i < this.str.length; i++){
        result.push(-Number(this.str[i]) * 10)
      }
      return result; // [-20, -90, -50, -20]
    }
  }

根据传入数据长度循环渲染,用计算好的位置数组给每列translateY()动态样式

      <div 
        class="item"
        v-for="(item, itemIndex) in str.length"
        :key="itemIndex" 
      >
        <div class ="item_box" :style="'transform:translateY(' +  numArr[itemIndex] + '%)'">
          <div 
            v-for="(item, index) in 10"
            :key="index" 
          >
            {{index}}
          </div>
        </div>
      </div>

完整代码

<template>
  <div class="bff">
    <div class="box">
      <div 
        class="item"
        v-for="(item, itemIndex) in str.length"
        :key="itemIndex" 
      >
        <div class ="item_box" :style="'transform:translateY(' +  numArr[itemIndex] + '%)'">
          <div 
            v-for="(item, index) in 10"
            :key="index" 
          >
            {{index}}
          </div>
        </div>
      </div>
    </div>
  </div> 
</template>

<script>
export default {
  name: "Gundong",
  props: {
    num: {
      type: Number,
      default: 2952,
    },
  },
  computed: {
    str() {
      return this.num.toString();
    },
    numArr() {
      let result = [];
      for(let i = 0; i < this.str.length; i++){
        result.push(-Number(this.str[i]) * 10)
      }
      return result;
    }
  },
}
</script>

<style lang="scss">
.bff{
  width: 100%;
  height: 50px;
  background: #000;
  .box{
    display: flex;
    .item{
      width: 30px;
      height: 40px;
      border: 1px solid #fff;
      color: #ffff00;
      font-family: "LetsgoDigitalRegular";
      font-size: 40px;
      text-align: center;
      line-height: 40px;
      margin: 5px;
      overflow: hidden;
      .item_box{
        transition: all 1s;
      }
    }
  }
}
</style>