vue 數(shù)字滾動組件

項目數(shù)據(jù)交易金額翻滾 (數(shù)字翻滾效果

主要思路:

  • 將數(shù)字拆分合并為數(shù)組,把數(shù)組中為數(shù)字的每一項替換為0-9標(biāo)簽,外層data-*為原數(shù)字
  • 用原數(shù)字乘每個數(shù)字(頁面0-9標(biāo)簽)的高度得到數(shù)字當(dāng)前要顯示的位置。
number(digit) {
                var num_arr = [];
                for (var i = 0; i < digit.length; i++) {
                    num_arr.push(digit[i]);
                }
                var str = '',
                    numlength = num_arr.length,
                    numLabel = '';
                for (var i = 0; i <= 9; i++) {
                    numLabel += ` <span class="num">${i}</span>`
                }
                for (var i = 0; i < numlength; i++) {
                    if (parseInt(num_arr[i]) >= 0) {
                        str += '<div  class="digit-container"  data-show=' + num_arr[i] + '> ' + numLabel + '</div>';
                    } else {
                        str += '<div ><span>' + num_arr[i] + '</span></div>';
                    }
                }
                this.dom = str;
                this.$nextTick(() => {
                    let obj = document.getElementsByClassName("digit-container");
                    let numDom = document.getElementsByClassName("num")[0];
                    for (let i in obj) {
                        if (typeof obj[i] == 'object') {
                            obj[i].style.transition = `all ${this.rollingSpeed}s`
                            obj[i].style.marginTop = -(Number(obj[i].dataset.show) * numDom.offsetHeight) + "px"
                            obj[i].style.width = numDom.offsetWidth + this.fontSpacing + "px"
                        }
                    }
                })
            }

組件

<template>
    <view class="content">
        <view class="box" :style="fontColorSize" v-html="dom"></view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                dom: ''
            }
        },
        watch: {
            rollNumber: function(newnum, oldnum) {
                this.number(this.rollNumber)
            }
        },
        props: {
            rollNumber: { //滾動的數(shù)字
                type: String,
                default: '5.548'
            },
            fontSpacing: { //數(shù)字間距 >8
                type: Number,
                default: 1
            },
            rollingSpeed: { //滾動速度
                type: Number,
                default: 1.5
            },
            fontColorSize: { //字體大小以及顏色
                type: String,
                default: ''
            }
        },
        created() {
            this.number(this.rollNumber)
        },
        methods: {
            number(digit) {
                var num_arr = [];
                for (var i = 0; i < digit.length; i++) {
                    num_arr.push(digit[i]);
                }
                var str = '',
                    numlength = num_arr.length,
                    numLabel = '';
                for (var i = 0; i <= 9; i++) {
                    numLabel += ` <span class="num">${i}</span>`
                }
                for (var i = 0; i < numlength; i++) {
                    if (parseInt(num_arr[i]) >= 0) {
                        str += '<div  class="digit-container"  data-show=' + num_arr[i] + '> ' + numLabel + '</div>';
                    } else {
                        str += '<div ><span>' + num_arr[i] + '</span></div>';
                    }
                }
                this.dom = str;
                this.$nextTick(() => {
                    let obj = document.getElementsByClassName("digit-container");
                    let numDom = document.getElementsByClassName("num")[0];
                    for (let i in obj) {
                        if (typeof obj[i] == 'object') {
                            obj[i].style.transition = `all ${this.rollingSpeed}s`
                            obj[i].style.marginTop = -(Number(obj[i].dataset.show) * numDom.offsetHeight) + "px"
                            obj[i].style.width = numDom.offsetWidth + this.fontSpacing + "px"
                        }
                    }
                })
            },
        },

    }
</script>

<style scoped>
    .content {
        display: flex;
        justify-content: center;
    }

    .box {
        overflow: hidden;
        display: flex;
        height: 30px;
    }

    >>>span {
        display: block;
    }
</style>

效果圖

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容