在Angular中制作大屏数字滚动效果


前言

在工作中总会制作数据大屏,而数字的滚动也是其中常用的,最近学习到一种使用js方法和css来制作数字滚动的效果

一、效果

数字滚动效果

二、制作步骤

HTML:

 <ng-container *ngFor="let item of numberList">
                <div class="number1">
                    <!-- 是数字就滚动 -->
                    <span *ngIf="!getIsNaN(item); else not"> <i #numberInfo>0123456789</i> </span>
                    <!-- 不是数字就用逗号 -->
                    <ng-template #not>
                        <span *ngIf="getIsNaN(item)">{{ item }}</span></ng-template
                    >
                </div>
            </ng-container>

TS:1.先获取一组随机的数字,将数字转换为8位数,不足8位数在前面补0,且以显示金额的形式显示,最后转换为数组且每三位数以逗号隔开 

2.再通过viewchildren获取模板变量为numberInfo的元素,将其转换为数组,就得到了一个数组中全是符合条件的元素,

3.筛选出为数字的值的数组,进行for循环,条件是index=0且index小于符合条件的数组长度,index++,这样就可以对获取到的随机数字每一位进行数字的偏移,视觉上就是数字的滚动效果

 numberList = [];
    timer: any;

    //是否为非数字
    getIsNaN(number: any) {
        return isNaN(number);
    }
    // 生成0-99999999随机数
    getRandomNumber() {
        //Math.pow(底数x,指数y) 10的8次方
        //Math.random 大于等于0小于1的随机数
        //Math.floor 返回小于或等于一个给定数字的最大整数
        return Math.floor(Math.random() * Math.pow(10, 8));
    }

    //数字补0且数字转换为金额的格式
    toOrderNum(num: any) {
        num = num.toString();
        // 把订单数变成字符串
        if (num.length < 8) {
            num = '0' + num; // 如未满八位数,添加"0"补位
            this.toOrderNum(num); // 递归添加"0"补位 直到长度大于8
        } else if (num.length === 8) {
            // 数中加入逗号
            num = num.slice(0, 2) + ',' + num.slice(2, 5) + ',' + num.slice(5, 8);
            this.numberList = num.split(''); // 将其便变成数据,渲染至滚动数组
        } else {
        }
    }

//获取符合的所有元素
    @ViewChildren('numberInfo') numberInfo!: QueryList<ElementRef>;

//每隔2秒就重新获取一组数字
    increaseNumber() {
        this.timer = setInterval(() => {
            this.toOrderNum(this.getRandomNumber());
            this.setNumberTransform();
        }, 2000);
    }

    // 设置每一位数字的偏移
    setNumberTransform() {
        let numberItems = this.numberInfo.toArray();
        let numberArr = this.numberList.filter((item: any) => !isNaN(item));
        for (let index = 0; index < numberItems.length; index++) {
            let elem = numberItems[index];
            elem.nativeElement.style.transform = `translate(-50%, -${numberArr[index] * 10}%)`;
        }
    }

 ngAfterViewInit() {
        this.increaseNumber();
    }

SCSS:

  .number1 {
                display: inline-block;
                width: 20px;
                height: 36px;
                font-size: 30px;
                line-height: 36px;
                & > span {
                    position: relative;
                    display: inline-block;
                    margin-right: 5px;
                    width: 100%;
                    height: 100%;
                    writing-mode: vertical-rl; //垂直方向自右而左的书写方式。
                    text-orientation: upright; //此值自然地设置水平脚本的字符(直立),以及垂直脚本的字形。它使所有字符都被视为从左到右。
                    overflow: hidden;//超出的部分数字进行隐藏

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值