vue3數(shù)字上下滾動顯示動效

實現(xiàn)動效如下:

2023-07-19 11.10.26.gif
2023-07-19 11.10.53.gif

number-ad.jpg

代碼具體如下:

  • vue3+ts+setup 封裝組件

第一步封裝組件 NumberAnimation.vue

  <template>
    <div class="number-digital">
        <div class="box-item">
            <li :class="{ 'number-item': !isNaN(item), 'mark-item': isNaN(item) }"
                :style="{ marginRight: needDivideMgright(index) }" v-for="(item, index) in orderNum" :key="index">
                <span v-if="!isNaN(item)">
                    <i :id="`numberItem${index}`">0123456789</I>
                </span>
                <div v-if="needDivideDot(index)" class="num-dot">,</div>
            </li>
        </div>
    </div>
</template>
   
<script lang="ts" setup>
const props = defineProps<{
    numm: number | string
    numLen: number
    noneDivide?: boolean // 默認需要超過7位數(shù)字以上以,分隔
}>()
function needDivideDot(index: number): boolean {
    if (props.noneDivide) { //不需要分隔符
        return false
    }
    if (props.numLen <= 7) {
        return false
    }
    return index === props.numLen - 8 || index === props.numLen - 5
}
function needDivideMgright(index: number): string {
    if (props.noneDivide) { //不需要分隔符
        return '2px'
    }
    if (props.numLen <= 7) {
        return '2px'
    }
    return (index === props.numLen - 7 || index === props.numLen - 4) ? '14px' : '2px'
}

const orderNum = ref<Array<number>>([]);
// 處理數(shù)字
// numm: 傳入的數(shù)字  numLen: 默認顯示幾位數(shù)
const toOrderNum = (num: string | number) => {
    num = num.toString();
    if (num.length < props.numLen) {
        num = '0' + num // 如未滿定義的位數(shù)快骗,添加"0"補位
        toOrderNum(num) // 遞歸添加"0"補位
    } else if (num.length === props.numLen) {
        orderNum.value = num.split('') as unknown as number[] // 將其便變成數(shù)據(jù)奈偏,渲染至滾動數(shù)組
    }

}
watch(() => props.numm, (newVal: any) => {
    toOrderNum(newVal)
    setNumberTransform()
})
function setNumberTransform() {
    for (let index = 0; index < orderNum.value.length; index++) {
        const ele: HTMLDivElement = document.getElementById(`numberItem${index}`) as HTMLDivElement
        if (ele) {
            ele.style.transform = `translate(-50%, -${orderNum.value[index] as number * 10}%)`
        }
    }
}
toOrderNum(props.numm)
onMounted(() => {
    setTimeout(() => {
        setNumberTransform()
    }, 200)
})

</script>
<style lang='scss' scoped>
.number-digital {
    margin-right: 8px;

    .box-item {
        position: relative;
        font-size: 54px;
        line-height: 41px;
        text-align: center;
        list-style: none;
        color: #2D7CFF;
        writing-mode: vertical-lr;
        text-orientation: upright;
        /*文字禁止編輯*/
        -moz-user-select: none;
        -webkit-user-select: none;
        -ms-user-select: none;
        -khtml-user-select: none;
        user-select: none;
    }

    /*滾動數(shù)字設置*/
    .number-item {
        width: 50px;
        height: 56px;
        color: #fff;
        font-size: 40px;
        font-family: MiSans, MiSans-Demibold;
        font-weight: 800;
        list-style: none;
        margin-right: 3px;
        background: rgba(3, 21, 42, 0.50);
        border: 1px solid #4d9ef8;
        box-shadow: 0px 0px 3px 0px #01072E;

        &>span {
            position: relative;
            display: inline-block;
            margin-right: 10px;
            width: 100%;
            height: 100%;
            writing-mode: vertical-rl;
            text-orientation: upright;
            overflow: hidden;

            &>I {
                font-style: normal;
                position: absolute;
                top: 8px;
                left: 50%;
                transform: translate(-50%, 0);
                transition: transform 1s ease-in-out;
                letter-spacing: 10px;
            }
        }
    }

    .number-item:last-child {
        margin-right: 0;
    }

    .num-dot {
        display: inline-block;
        margin-left: 8px;
        height: 53px;
        font-size: 47px;
        font-family: MiSans, MiSans-Demibold;
        font-weight: normal;
        text-align: CENTER;
        color: #ffffff;
        line-height: 47px;
    }

}
</style>
  

第二步 使用 NumberAnimation.vue組件

 <!-- 逗號分隔 (需要import引入組件) -->
            <NumberAnimation :numm="rand" :numLen="9"></NumberAnimation>
 <!-- 不進行逗號分隔 (需要import引入組件) -->
            <NumberAnimation :numm="rand" :numLen="9" :noneDivide="true"></NumberAnimation>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末窑眯,一起剝皮案震驚了整個濱河市栋烤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揍移,老刑警劉巖斤吐,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呢灶,居然都是意外死亡,警方通過查閱死者的電腦和手機钮热,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烛芬,“玉大人隧期,你說我怎么就攤上這事∽嘎Γ” “怎么了仆潮?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遣臼。 經(jīng)常有香客問我性置,道長,這世上最難降的妖魔是什么揍堰? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任鹏浅,我火速辦了婚禮,結果婚禮上屏歹,老公的妹妹穿的比我還像新娘隐砸。我一直安慰自己,他們只是感情好蝙眶,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布季希。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪式塌。 梳的紋絲不亂的頭發(fā)上博敬,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音峰尝,去河邊找鬼偏窝。 笑死,一個胖子當著我的面吹牛境析,可吹牛的內容都是我干的囚枪。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼劳淆,長吁一口氣:“原來是場噩夢啊……” “哼链沼!你這毒婦竟也來了?” 一聲冷哼從身側響起沛鸵,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤括勺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后曲掰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疾捍,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年栏妖,在試婚紗的時候發(fā)現(xiàn)自己被綠了乱豆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡吊趾,死狀恐怖宛裕,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情论泛,我是刑警寧澤揩尸,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站屁奏,受9級特大地震影響岩榆,放射性物質發(fā)生泄漏。R本人自食惡果不足惜坟瓢,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一勇边、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧折联,春花似錦粥诫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谊囚。三九已至,卻和暖如春执赡,著一層夾襖步出監(jiān)牢的瞬間镰踏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工沙合, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奠伪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓首懈,卻偏偏與公主長得像绊率,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子究履,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容