Vue3 大屏数字滚动效果

 父组件:

<template>

  <div class="homePage">

    <NumRoll v-for="(v, i) in numberList" :key="i" :number="v"></NumRoll>

  </div>

</template>

<script setup>

import { onMounted, ref } from 'vue'

import NumRoll from '@/views/components/numRoll.vue'

const numberList = ref([0])

const number = ref(1200)

onMounted(() => {

  numberList.value = number.value.toString().split('').map(item => Number(item))

  setInterval(()=>{

    number.value = Math.round(Math.random() * (100000 - 1000) + 1000);

    numberList.value = number.value.toString().split('').map(item => Number(item))

  },2000)

})

</script>

<style lang='scss' scoped>

.homePage {

  padding: 10px;

  display: flex;

}

</style>

子组件:

<template>

  <div class="box">

    <span class="num" :style="{transform: `translate(-50%, -${number * 10}%)`}">0123456789</span>

  </div>

</template>

<script setup>

import { onMounted } from 'vue'

const props = defineProps({

  number: {

    type: Number,

    default: 5,

    required: true,

  },

});

onMounted(() => { })

</script>

<style lang='scss' scoped>

.box {

  height: 82px;

  width: 54px;

  line-height: 82px;

  text-align: center;

  background-color: #149373;

  border-radius: 10px;

  margin-right: 5px;

  // CSS属性定义文本行是否水平或垂直布置以及块扩展的方向。

  writing-mode: vertical-lr;

  // 文字方向  竖直

  text-orientation: upright;

  position: relative;

  overflow: hidden;

}

.num {

  font-size: 62px;

  position: absolute;

  left: 50%;

  top:7px;

  color: #ffffff;

  transition: all 1.5s;

}

</style>