Vue插件之数字翻牌器

标签: 无 分类: 未分类 创建时间:2022-10-27 07:39:06 更新时间:2024-12-03 13:01:37

前言

数字翻牌器,又叫数字看板,就是一个进入系统之后,然后滚动的面板。

参考文章:
1.数字看板 (这是一个大屏的数字滚动效果)
2.发光的圆环 (这是用echarts写的一个发光的圆环效果)
3.大屏展示模板 (开源的一些大屏展示效果)
4.项目心得:大屏数据可视化设计 (这是一个设计思路)
5.基于data-v 构建的大屏 (一个基于data-V构建的大屏展示系统,其实可以拿来进行修改后,去接项目)
6.Vue实现数字翻牌器效果 (使用vue实现的数字翻牌器,还有一个插件vue-count-to)
7.03-数字翻牌器组件 直接用,不用改 这个是单独为每一个数字框写了一些css动画样式,不用代码去实现的话,css还是有点多的。
8.基于vue3 + ts 开发的数字翻牌器组件 这里分成了两个组件,我觉得有点繁琐了。
9.封装vue版数字翻牌器 这里是使用的高度进行变换的。

1.实现

根据 数字动态翻牌器 这个也是一个vue2.0的示例,我通过修改,改成了vue3.0的版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<template>
<div class="chart-number">
<div :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" class="numberItem">0123456789</i>
</span>
<span class="comma" v-else>{{ item }}</span>
</div>
</div>
</template>
<script>
import { onMounted,watch,getCurrentInstance} from 'vue';

export default {
props: {
// 显示的数字
number: {
type: Number,
},
// 显示的长度
length: {
type: Number,
},
},
setup(props){

let numberN=props.number||0; // 显示数字
let numberNLength=props.length||7; // 数字长度
let orderNum=['0', '0', '0', '0', '0', '0', '0']; // 默认总数
// 获取当前组件
const { proxy } = getCurrentInstance();

// 设置文字滚动
function setNumberTransform() {
const numberItems=proxy.$el.querySelectorAll(".numberItem"); // 拿到数字的ref,计算元素数量
// eslint-disable-next-line no-restricted-globals
const numberArr = orderNum.filter(item => !isNaN(item));
// 结合CSS 对数字字符进行滚动,显示数量
for (let index = 0; index < numberItems.length; index += 1) {
const elem = numberItems[index];
elem.style.transform = `translate(-50%, -${numberArr[index] * 10}%)`;
}
}
// 处理总数字
function toOrderNum(num) {
const numtext = num.toString();
if (numberNLength) {
if (numtext.length < numberNLength) {
const numlist = `0${numtext}`; // 如未满固定数,添加"0"补位
toOrderNum(numlist); // 递归添加"0"补位
} else if (numtext.length === num.length) {
orderNum = numtext.split(''); // 将其便变成数据,渲染至滚动数组
}
} else {
orderNum = numtext.split('');
}
// 执行数字动画
setNumberTransform();
}

/**
* 生命周期
*/
watch(()=>props.number,(newNumber)=>{
toOrderNum(newNumber); // 这里输入数字即可调用
});
onMounted(()=>{
setTimeout(() => {
toOrderNum(numberN); // 这里输入数字即可调用
}, 500);
})

return {
orderNum
}
}
}
</script>
<style scoped lang="scss">
/*总量滚动数字设置*/
.chart-number {
position: relative;
font-size: 20px;
font-family: AzonixRegular;
display: flex;
width: 100%;
justify-content: space-around;
/*滚动数字设置*/
.number-item {
width:30px;
height: 30px;
/* 背景图片 */
background: url("../assets/img/number_box.png") no-repeat center center;
background-size: 100% 100%;
// background: #ccc;
list-style: none;
margin-right: 1px;

& > span {
position: relative;
display: inline-block;
margin-right: 10px;
width: 100%;
height: 100%;
writing-mode: vertical-rl;
text-orientation: upright;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
& > i {
font-style: normal;
position: absolute;
top: 6px;
left: 50%;
transform: translate(-50%, 0);
transition: transform 1s ease-in-out;
letter-spacing: 10px;
}
}
}
.number-item:last-child {
margin-right: 0;
}
}

</style>

参考文章:
1.(十四)Vue3.x核心之getCurrentInstance 一个很重要的方法,获取当前组件的实例、上下文来操作router和vuex等。人呀,在对应的年纪做对应的事情,放下过去,放下执念,放下不必要的社交,让自己活的像个样子!
2.vue3 同一组件多次引用
3.Vue3 watch 侦听 props 的变化

2.使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<template>
<div class="number-wrap">
<NumberCount :number="123" :length="7"/>
</div>
</template>
<script>
import { onMounted } from 'vue';

export default {
components:{
NumberCount:defineAsyncComponent(()=>import("@/components/NumberCount.vue")), // 数字翻牌器
},
setup(){
return {
}
}
}
</script>
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。