首頁 > 軟體

vue實現翻牌動畫

2022-04-20 13:00:30

本文範例為大家分享了vue實現翻牌動畫的具體程式碼,供大家參考,具體內容如下

應用場景

常用於大屏訂單數量展示

原理

  • 利用css writing-mode: vertical-rl 使數位垂直排列
  • 利用css transform 使數位捲動

實現思路

  • 根據css先讓數位垂直排列,總共設定8列
  • 根據元件傳遞的數值,如果不滿8位元,遞迴補零
  • 補零之後,迴圈根據 translate(-50%, -${numberArr[index] * 10}%,檢視動畫
<template>
    <div class="chartNum">
        <div class="box-item">
            <li
                :class="{'number-item':!isNaN(item),'mark-item':!isNaN(item)}"
                v-for="(item,index) in orderNum"
                :key="index">
                <span v-if="!isNaN(item)">
                    <i ref="numberItem">0123456789</i>
                </span>
                <span class="comma" v-else>{{item}}</span>
            </li>
        </div>
    </div>
</template>

<script>
    export default {
        name: "hChartNum",
        props:{
          num:{
              type:Number,
              default:1123
          }
        },
        data() {
            return {
                orderNum: ['0', '0', '0', '0', '0', '0', '0', '0'], // 預設訂單總數
            }
        },
        mounted(){
            setTimeout(() => {
                this.toOrderNum(this.num) // 這裡輸入數位即可呼叫
            }, 500);
        },
        methods:{
            // 設定文字捲動
            setNumberTransform(){
                const numberItems = this.$refs.numberItem // 拿到數位的ref,計算元素數量
                const numberArr = this.orderNum.filter(item => !isNaN(item))
                // 結合css,讓文字捲動起來
                for (let index = 0; index < numberItems.length; index++) {
                    const elem = numberItems[index];
                    elem.style.transform = `translate(-50%, -${numberArr[index] * 10}%)`
                }
            },


            // 處理訂單數位
            toOrderNum(num){
                num = num.toString();
                if(num.length < 8){
                    num = '0' + num; // 未滿8位元,補零
                    this.toOrderNum(num); // 遞迴新增"0"補位
                }
                else if(num.length == 8){
                    this.orderNum = num.split('')
                }
                else{
                    // 資料量超過8位元
                    this.$message.error('資料量過大');
                }
                this.setNumberTransform();
            }
        }
    }
</script>

<style scoped lang="less">
    .box-item{
        position: relative;
        height: 100px;
        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; /*webkit瀏覽器*/
        -ms-user-select: none; /*IE10*/
        -khtml-user-select: none; /*早期瀏覽器*/
        user-select: none;
    }

    /*預設逗號設定*/
    .number-item{
        width: 10px;
        height: 100px;
        margin-right: 5px;
        line-height: 10px;
        font-size: 48px;
        position: relative;
        & > span{
            position: absolute;
            width: 100%;
            bottom: 0;
            writing-mode: vertical-rl;
            text-orientation: upright;
          }
    }

    /*捲動數位設定*/
    .number-item {
        width: 41px;
        height: 75px;
        background: url(./img/bg.jpg) no-repeat center center;
        background-size: 100% 100%;
        list-style: none;
        margin-right: 5px;
        border-radius:4px;
        border:1px solid rgba(221,221,221,1);
        & > 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:11px;
                left: 50%;
                transform: translate(-50%,0);
                transition: transform 1s ease-in-out;
                letter-spacing: 10px;
            }
        }
    }
    .number-item:last-child {
        margin-right: 0;
    }
</style>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com