Vue.js实现大屏数字滚动翻转效果
大屏数字滚动翻转效果来源于最近工作中element后台管理页面一张大屏的UI图,该UI图上有一个模块需要有数字往上翻动的效果,以下是最终实现的效果:
整体思路:
在实现此效果之前,我们先来捋一下思路,用思维导图来设计一下我们的实现步骤,如下:
你可以审查元素,下载数字背景图片,复制图片地址,或者使用其他背景图片、背景颜色
有了以上的设计流程,我们先来简单实现一下:
//CSS代码 //htm代码1
实现以上代码后,它的效果将是下面这样的:
思考:
背景框中有了数字以后,我们现在来思考一下,背景框中的文字,一定是0-9之前的数字,要在不打乱以上html结构的前提下,如何让数字滚动起来呢?这个时候我们的魔爪就伸向了一个CSS属性:writing-mode,下面是它属性的介绍:
- horizontal-tb:默认值,表示水平排版,从上到下。
- vertical-lr:表示垂直排版,从左到右。
- vertical-rl:表示垂直排版,从右到左。
它的实时效果是像下面这样:
根据以上的灵感,我们可以实现下面这样的效果:
代码如下:
//html部分0123456789 //style部分 .box-item{ display:inline-block; width:54px; height:82px; background:url(./number-bg.png)no-repeatcentercenter; background-size:100%100%; font-size:62px; line-height:82px; text-align:center; position:relative; writing-mode:vertical-lr; text-orientation:upright; /*overflow:hidden;*/ } .box-itemspan{ position:absolute; top:10px; left:50%; transform:translateX(-50%); letter-spacing:10px; }
计算滚动
如果我们想让数字滚动到5,那么滚动的具体到底是多少?
答案是:向下滚动-50%
那么其他的数字呢?
得益于我们特殊的实现方法,每一位数字的滚动距离有一个通用的公式:
transform:`translate(-50%,-${number*10}%)
有了以上公式,我们让数字滚动到5,它的效果如下:
代码加上`transform:`translate(-50%,-${number*10}%)`,示例如下
.box-itemspan{
position:absolute;
top:10px;
left:50%;
transform:translate(-50%,-50%);
letter-spacing:10px;
}
滚动动画的实现
在知道了每一个数字具体的滚动距离后,我们来设计一下,让数字能够随机滚动起来:
一下是让数字随机滚动的JS
setInterval(()=>{
letnumber=document.getElementById('Number')
letrandom=getRandomNumber(0,10)
number.style.transform=`translate(-50%,-${random*10}%)`
},2000)
functiongetRandomNumber(min,max){
returnMath.floor(Math.random()*(max-min+1)+min)
}
至此,我们数字滚动效果已经初步实现了,在下一节中我们将会逐步完善此效果,以满足业务需求。
完善
在上一节中,我们初步完成了滚动的效果,这一节我们将根据最开始的思维导图来设计一个通用的Vue业务组件
因为我们的业务需要,我们最大的位数是8位数字,所以对不足八位进行补位:
假如传递的位数不足8位,我们需要对它进行补0的操作,补0完成以后,我们也需要把它转换成金额的格式
toOrderNum(num){
num=num.toString()
//把订单数变成字符串
if(num.length<8){
num='0'+num//如未满八位数,添加"0"补位
this.toOrderNum(num)//递归添加"0"补位
}elseif(num.length===8){
//订单数中加入逗号
num=num.slice(0,2)+','+num.slice(2,5)+','+num.slice(5,8)
this.orderNum=num.split('')//将其便变成数据,渲染至滚动数组
}else{
//订单总量数字超过八位显示异常
this.$message.warning('订单总量数字过大,显示异常,请联系客服')
}
},
渲染
我们根据上面补位字符串,分隔成字符数组,在页面中进行渲染:
computeNumber:为字符数组,例如:['0','0',',','0','0','0',',','9','1','7']
//html代码
-
0123456789 {{item}}
页面渲染效果:
数字随机增长,模拟轮询效果
页面渲染完毕后,我们来让数字滚动起来,设计如下两个方法,其中increaseNumber需要在Vue生命周期mounted函数中调用
//定时增长数字
increaseNumber(){
letself=this
this.timer=setInterval(()=>{
self.newNumber=self.newNumber+getRandomNumber(1,100)
self.setNumberTransform()
},3000)
},
//设置每一位数字的偏移
setNumberTransform(){
letnumberItems=this.$refs.numberItem
letnumberArr=this.computeNumber.filter(item=>!isNaN(item))
for(letindex=0;index
最终实现效果:
完整代码如下:
订单总量
0123456789
{{item}}