在 Vue 项目 10 分钟实现一个数字滚动效果

点击上方 前端瓶子君,关注公众号

回复算法,加入前端编程面试算法每日一题群

1. 前言

快要双十一了,然后公司要制作一个展示的电子大屏,其中总金额的数字需要滚动的切换效果,类似于这样:

4cf721cef914466bbf61487c1e7d7e6d.png
动画.gif

2. 思考&实现

2.1 思考

诶,作为十年代码经验~常年摸鱼~的我,想起来vue中的transition-group可以实现类似的效果,首先来看看官网的案例[1]效果:

353a47b3d8650fbed16cf7a0fa232c21.png
2.gif

2.2 实现

于是我们先参照官网实现一个简单的效果:

9ea0e675f6041a03ea586e15cec484cd.png
3.gif

由于项目比较简单,所以这里采用的是cdn方式,代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        * {
            margin: 0px;
            padding: 0px;
        }

        body,
        html {
            min-width: 1920px;
            min-height: 1080px;
            width: 100%;
            height: 100%;
        }

        #app {
            position: relative;
        }

        .amount {
            color: gold;
            font-size: 85px;
            display: flex;
            justify-content: center;
        }

        .list-enter-active,
        .list-leave-active {
            transition: transform 1s ease, opacity 1s ease;
        }

        .list-enter-from {
            opacity: 0;
            transform: translateY(50%);
        }

        .list-leave-to {
            opacity: 0;
            transform: translateY(-50%);
        }
    </style>

    <title>Document</title>
</head>

<body id="app">
    <div class="amount">
        <div style="display: flex;">
            <span>¥</span>
            <transition-group name="list" tag="p">
                <p style="display: inline-block;" v-for="(item , index) in todayAmountComputed" :key="item + index">
                    {{item}}</p>
            </transition-group>
        </div>
    </div>
</body>

<script src="https://unpkg.com/vue@next" defer></script>

<script>
    document.addEventListener('DOMContentLoaded', () => {
        Vue.createApp({
            data() {
                return {
                    todayAmount: '0',
                    platformSales1: 4090013,
                }
            },
            computed: {
                todayAmountComputed() {
                    return this.todayAmount.split('');
                },
            },
            mounted() {
                setInterval(() => {
                    if (this.todayAmount === '0') {
                        this.todayAmount = '1000';
                    }
                    this.todayAmount = '' + Math.floor(Math.random() * 10000);
                }, 2000);
            },
        }).mount('#app');
    })

</script>

</html>

复制代码

现在离完整的效果,其实只差一步了,现在由于原来的数字会占用空间,所以导致离开的进入的没有在同一直线上,所以,我们加上position:absoulte,再使用left定位将它们固定在合理的位置上,代码如下:

<body id="app">
    <div id="amount">
        <div style="display: flex;">
            <span>¥</span>
            <transition-group name="list" tag="p" style="position: relative;">
                <p style="display: inline-block;position: absolute;" v-for="(item , index)                     in todayAmountComputed"
                    :style="{
                    left:  index * 50 + 'px',
                    }" :key="item + index">
                    {{item}}</p>
            </transition-group>
        </div>
    </div>
</body>

复制代码

此时就会呈现出下列效果:

fd639033f389c82b8f3a00201c60d20f.png
4.gif

哇咔咔,很接近了,有木有。

3. 注入灵魂

嘿嘿嘿,最后就是注入灵魂,给每个数字添加一点点延迟:

<body id="app">
    <div id="amount">
        <div style="display: flex;">
            <span>¥</span>
            <transition-group name="list" tag="p" style="position: relative;">
                <p style="display: inline-block;position: absolute;" v-for="(item , index)                     in todayAmountComputed"
                    :style="{
                    left:  index * 50 + 'px',
                    'transition-delay': 0.1 * index + 's'
                    }" :key="item + index">
                    {{item}}</p>
            </transition-group>
        </div>
    </div>
</body>
复制代码

最终效果如下:

b5963a8bebb520c3e4f4f85ad5c6698a.png
5.gif

最后附上最终代码链接参考[2]:https://gitee.com/Agrement/javascript/blob/master/%E6%8E%98%E9%87%91/index.html

4. 总结

7c3b6940ce75c03885e391385b4c3c9a.png
不过如此(熊猫头柠檬精算了表情包)_柠檬精_不过如此_熊猫_算了表

关于本文

作者:RadiumAg

https://juejin.cn/post/7019597165538312200

最后

欢迎关注【前端瓶子君】✿✿ヽ(°▽°)ノ✿

回复「算法」,加入前端编程源码算法群,每日一道面试题(工作日),第二天瓶子君都会很认真的解答哟!

回复「交流」,吹吹水、聊聊技术、吐吐槽!

回复「阅读」,每日刷刷高质量好文!

如果这篇文章对你有帮助,「在看」是最大的支持

 》》面试官也在看的算法资料《《

“在看和转发”就是最大的支持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值