实现简单的数字滚动效果
工作中遇到的小组件分享
效果
实现原理
每个数字使用0-9竖向排列,利用transform:translateY()改变数字位置,完了加超出隐藏,再加个transition动画过度效果
computed处理传入的的数据,得到一个计算后的数字位置百分比数组。
computed: {
str() {
return this.num.toString();
},
numArr() {
let result = [];
for(let i = 0; i < this.str.length; i++){
result.push(-Number(this.str[i]) * 10)
}
return result; // [-20, -90, -50, -20]
}
}
根据传入数据长度循环渲染,用计算好的位置数组给每列translateY()动态样式
<div
class="item"
v-for="(item, itemIndex) in str.length"
:key="itemIndex"
>
<div class ="item_box" :style="'transform:translateY(' + numArr[itemIndex] + '%)'">
<div
v-for="(item, index) in 10"
:key="index"
>
{{index}}
</div>
</div>
</div>
完整代码
<template>
<div class="bff">
<div class="box">
<div
class="item"
v-for="(item, itemIndex) in str.length"
:key="itemIndex"
>
<div class ="item_box" :style="'transform:translateY(' + numArr[itemIndex] + '%)'">
<div
v-for="(item, index) in 10"
:key="index"
>
{{index}}
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Gundong",
props: {
num: {
type: Number,
default: 2952,
},
},
computed: {
str() {
return this.num.toString();
},
numArr() {
let result = [];
for(let i = 0; i < this.str.length; i++){
result.push(-Number(this.str[i]) * 10)
}
return result;
}
},
}
</script>
<style lang="scss">
.bff{
width: 100%;
height: 50px;
background: #000;
.box{
display: flex;
.item{
width: 30px;
height: 40px;
border: 1px solid #fff;
color: #ffff00;
font-family: "LetsgoDigitalRegular";
font-size: 40px;
text-align: center;
line-height: 40px;
margin: 5px;
overflow: hidden;
.item_box{
transition: all 1s;
}
}
}
}
</style>