vue3封装数字滚动组件的实现示例

 更新时间:2024年08月02日 10:14:11   作者:月伤59  
本文主要介绍了vue3封装数字滚动组件的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

效果展示:

代码:

<template>
	<div class="counter-container">
		<div v-for="(item, index) in numArr" :key="index" :class="item === ',' || item === '.' ? 'mark-item' : 'num-item'">
			<span class="pointer" v-if="item == ',' || item == '.'">{{ item }}</span>
			<span ref="numberItem" v-else class="num">
				{{ flipNum }}
			</span>
		</div>
	</div>
</template>

<script setup lang="ts">
import { ref, watch, nextTick, onMounted } from "vue";

const props = defineProps({
	num: {
		type: Number,
		default: 0
	},
	duration: {
		type: Number,
		default: 1
	}
});
let numArr = ref(["0", "0", ",", "0", "0", "0", ",", "0", "0", "0"]);
const flipNum = "0123456789";
// let timer = null;
const numberItem = ref<Array<HTMLSpanElement> | null>(null);

// 处理传递过来的数字,转化为数组
function numToArr() {
	const str = props.num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
	numArr.value = str.split("");
}

function rollNum() {
	const numItems = numberItem.value;
	const numberArr = numArr.value.filter(item => item !== "," && item !== ".");
	numberArr.forEach((item, index) => {
		const num = parseInt(item);
		if (numItems) {
			const numItem = numItems[index];
			numItem.style.transform = `translate(-50%, -${num * 10}%)`;
		}
	});
}

// 监听数字变化,更新数字
const initNumber = () => {
	numToArr();
	nextTick(() => {
		setTimeout(() => {
			rollNum();
		}, props.duration * 1000);
	});
};

watch(
	() => props.num,
	() => {
		initNumber();
	}
);

onMounted(() => {
	initNumber();
});
</script>

<style lang="scss" scoped>
.counter-container {
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: center;
}
.counter-container .num-item {
	position: relative;
	box-sizing: border-box;
	width: 22px;
	height: 34px;
	padding: 8px;
	margin-left: 4px;
	overflow: hidden;
	font-size: 20px;
	font-weight: bold;
	color: #ffffff;
	text-align: center;
	background-image: url("@/assets/images/dataBoard/num_wrap.png");
	background-repeat: no-repeat;
	background-size: 100% 100%;
}
.counter-container .mark-item {
	height: 34px;
	margin-left: 4px;
	font-size: 24px;
	font-weight: 800;
	line-height: 38px;
	color: #ffffff;
	text-align: center;
}
.counter-container .num {
	position: absolute;
	top: 6px;
	left: 50%;
	letter-spacing: 8px;
	writing-mode: vertical-lr;
	transition: all 1s ease-in-out;
	transform: translate(-50%, 0);
	text-orientation: upright;
}
</style>

到此这篇关于vue3封装数字滚动组件的实现示例的文章就介绍到这了,更多相关vue3 数字滚动组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Element实现登录+注册的示例代码

    Element实现登录+注册的示例代码

    登录注册是最常用的网站功能,本文主要介绍了Element实现登录+注册的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 深入了解Vue中单向数据流的原理与管理

    深入了解Vue中单向数据流的原理与管理

    在Vue中,数据流是指数据的传递和管理方式,而Vue采用的是单向数据流,所以这篇文章就来就来和大家讲讲什么是Vue的数据流以及如何进行数据流管理,感兴趣的可以了解一下
    2023-06-06
  • 一个因@click.stop引发的bug的解决

    一个因@click.stop引发的bug的解决

    这篇文章主要介绍了一个因@click.stop引发的bug的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Vue数据劫持详情介绍

    Vue数据劫持详情介绍

    这篇文章主要介绍了Vue数据劫持详情介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-08-08
  • Vue项目部署到jenkins的实现

    Vue项目部署到jenkins的实现

    本文主要介绍了Vue项目部署到jenkins的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • vue调用本地摄像头实现拍照功能

    vue调用本地摄像头实现拍照功能

    这篇文章主要介绍了vue调用本地摄像头实现拍照功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 简单了解vue中的v-if和v-show的区别

    简单了解vue中的v-if和v-show的区别

    这篇文章主要介绍了简单了解vue中的v-if和v-show的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • vue3.0搭配.net core实现文件上传组件

    vue3.0搭配.net core实现文件上传组件

    这篇文章主要介绍了vue3.0搭配.net core实现文件上传组件,帮助大家开发Web应用程序,完成需求,感兴趣的朋友可以了解下
    2020-10-10
  • vue.js实现一个瀑布流的组件

    vue.js实现一个瀑布流的组件

    这篇文章主要为大家介绍了vue.js实现一个瀑布流的组件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Vue Router的三种历史模式应用与对比详解

    Vue Router的三种历史模式应用与对比详解

    在 Vue.js 单页应用(SPA)中,vue-router 提供了三种不同的 历史模式 来管理路由导航和 URL 显示方式,每种模式适用于不同场景,下面小编就和大家简单介绍一下吧
    2025-10-10

最新评论