Vue3 + Ts + Vite —— 项目封装使用交互式 彩屑纷飞 示例 (亲测可用、复制即展示)

news2024/11/24 11:25:32

目录

🪂 演示

🛹 目录树 

🐔 安装

 🤖 global.d.ts

 😷 zkConfettiCanvas.vue  

 🌍 confetti.ts

🎋 confettiIndex.ts

😷 index.vue

 🥰😉  谢谢观看


🤺🤺🤺前期回顾f8e3cc1a0f694ac2b665ca2ad14c49d7.png

前端:UI 交互式特效 —— Css、Js_彩色之外的博客-CSDN博客css 使用示例,及源码https://blog.csdn.net/m0_57904695/article/details/131677759?spm=1001.2014.3001.5501  

🪂 演示

彩屑飘落 特效一键直达https://www.kirilv.com/canvas-confetti/

🛹 目录树 

1:封装canvas

2:封装彩屑 Ts

3:抽离逻辑判断 Ts

4:页面调用


src

|--- types

        |--- global.d.ts

|--- components

          |--- zkConfettiCanvas.vue

|--- utils

          |--- confetti.ts

          |--- confettiIndex.ts

|--- views

         |---- home.vue

🐔 安装

pnpm install --save canvas-confetti

 🤖 global.d.ts

// 申明外部 npm 插件模块
declare module 'canvas-confetti';

 😷 zkConfettiCanvas.vue  

<template>
	<canvas
		id="confetti"
		style="
			position: absolute;
			top: 0;
			left: 0;
			width: 100%;
			height: 100%;
			z-index: -1;
		"
	></canvas>
</template>

 🌍 confetti.ts

interface Origin {
	x?: number;
	y?: number;
}
/**
 * 显示彩屑效果
 * @param { number } type - 彩屑效果类型
 *   1: 默认屏幕中间喷射
 *   2: 满屏随机炸裂
 *   3: 屏幕中间随机位置喷射
 *   4: 屏幕两端向内喷射
 * @param { Origin } origin - 彩屑的原点坐标
 *   x: x轴位置,默认值为0.5
 *   y: y轴位置,默认值为0.7
 * @url https://www.kirilv.com/canvas-confetti/
 * @returns { Promise<void> } - Promise对象
 */
export async function showConfetti(
	type: number = 1,
	origin: Origin = { x: 0.5, y: 0.7 }
): Promise<void> {
	await import('canvas-confetti').then((confetti) => {
		const canvasEle: HTMLCanvasElement | null =
			document.querySelector('#confetti');
		if (!canvasEle) return;
		canvasEle.style.zIndex = '9999';
		const myConfetti = confetti.create(canvasEle, {
			resize: true,
			useWorker: true,
			disableForReducedMotion: true,
		});
		import('./confettiIndex').then((confettiIndex) => {
			confettiIndex.getUserDescribe(type, myConfetti, origin);
		});
		setTimeout(() => {
			canvasEle.style.zIndex = '-1';
			myConfetti.reset();
		}, 3000);
	});
}

🎋 confettiIndex.ts

interface Origin {
	x?: number;
	y?: number;
}
export function getUserDescribe(type: number, myConfetti: any, origin: Origin) {
	const describeForNameMap = [
		[
			() => type === 1, // 判断条件
			() =>
				myConfetti({
					particleCount: 100,
					spread: 70,
					// 默认屏幕中间喷射,可以在引入的时候传入参数,如 showConfetti({x:0.1,y:0.5})
					origin: origin,
				}), // 执行函数
		],
		[
			() => type === 2,
			() => {
				let duration = 3 * 1000;
				let animationEnd = Date.now() + duration;
				let defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 0 };

				function randomInRange(min: number, max: number) {
					return Math.random() * (max - min) + min;
				}

				let interval = setInterval(function () {
					let timeLeft = animationEnd - Date.now();

					if (timeLeft <= 0) {
						return clearInterval(interval);
					}

					let particleCount = 50 * (timeLeft / duration);
					myConfetti(
						Object.assign({}, defaults, {
							particleCount,
							origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 },
						})
					);
					myConfetti(
						Object.assign({}, defaults, {
							particleCount,
							origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 },
						})
					);
				}, 250);
			},
		],
		[
			() => type === 3,
			() => {
				function randomInRange(min: number, max: number) {
					return Math.random() * (max - min) + min;
				}

				myConfetti({
					angle: randomInRange(55, 125),
					spread: randomInRange(50, 70),
					particleCount: randomInRange(50, 100),
					origin: origin,
				});
			},
		],
		[
			() => type === 4,
			() => {
				const duration = performance.now() + 1 * 1000;
				const confettiColors = ['#6967fe', '#85e9f4', '#e16984'];
				void (function frame() {
					myConfetti({
						particleCount: confettiColors.length,
						angle: 60,
						spread: 55,
						origin: { x: 0 },
						colors: confettiColors,
					});
					myConfetti({
						particleCount: confettiColors.length,
						angle: 120,
						spread: 55,
						origin: { x: 1 },
						colors: confettiColors,
					});

					if (performance.now() < duration) {
						requestAnimationFrame(frame);
					}
				})();
			},
		],
	];
	function myError() {
		throw new Error('没有找到对应的效果');
	}
	// 通过find方法找到子数组中的第一个函数(判断条件)为true的子数组
	let getDescribe = describeForNameMap.find((item) => item[0]());
	// 子数组存在则运行子数组中的第二个元素(执行函数)
	getDescribe ? getDescribe[1]() : myError();
}

😷 index.vue

<template>
	<div>
		<zw-confetti-canvas />
		<el-button type="success" @click="onTrigger">发射彩屑</el-button>
	</div>
</template>

<script setup lang="ts">
import { showConfetti } from '/@/utils/confetti';

const onTrigger = () => {
	showConfetti();
};
</script>

完毕!以上为全部代码,复制即用,默认封装四种特效、可以按照需求自定义奥~

 🥰😉  谢谢观看

7730e2bd39d64179909767e1967da702.jpeg

 _______________________________  期待再见  _______________________________

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪款蓝牙耳机通话清楚,几款拥有通话降噪技术的骨传导耳机分享

嘿&#xff0c;你是音乐爱好者吗&#xff1f;还是热衷于锻炼身体&#xff1f;那么你一定不能错过骨传导耳机&#xff01;这种神奇的耳机通过骨头的振动来传递声音&#xff0c;绝不同于传统的耳道或鼓膜传播方式。你可保持对周围环境的警觉&#xff0c;同时避免对你的听力造成任…

【雕爷学编程】Arduino动手做(149)---MAX9814咪头传感器模块5

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【unity实战】手搓一个网格放置功能,及装修建造种植功能(2d3d通用,附源码)

文章目录 前言开始项目和素材1. 素材来源2. 开始项目包&#xff08;两种选择一种下载导入即可&#xff09; 开始1. 修改鼠标指针显示2. 给鼠标对应的平面位置绑定对应的指示器3. 使用Shader Graph创建网格可视化3. 网格的大小缩放和颜色控制4. 优化5. 扩展说明5.1 我们就可以通…

总结:WEB流量劫持

一、背景 在整理WEB鉴权与登陆等技术的时候&#xff0c;会涉及到安全&#xff0c;而鉴权登陆不安全有个很大的可能就是流量被劫持了。 本篇文章主要是想弄明白黑客是怎么劫持的。 二、WEB流量劫持是如何做到的&#xff1f; WEB流量劫持是指黑客将受害者的网页请求重定向到攻…

python appium UI 自动化测试框架讨论

目录 前言&#xff1a; 框架共性总结 Auto_Analysis 权限弹窗识别 前言&#xff1a; Python Appium UI自动化测试框架是一种用于测试移动应用程序的工具&#xff0c;它结合了Python编程语言和Appium测试框架的功能。 框架共性总结 1 自动找设备 连接设备 2 自动启 appium …

Java设计模式之行为型-状态模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 一、基础概念 状态模式允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类&#xff0c;状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况&a…

有必要买apple pencil吗?ipad pencil替代品

苹果的电容笔与一般的电容笔有什么不同&#xff1f;事实上&#xff0c;从外观上来看&#xff0c;两者并没有太大的区别。唯一不同的是&#xff0c;苹果电容笔的重量更大&#xff0c;笔尖内部有专门的重力感应器&#xff0c;可以感应到重力压感对线条的影响。因此苹果的这个产品…

MongoDB复制集

文章目录 一、介绍1、存在的意义和作用&#xff1f;2、需要实现啥功能&#xff1f;3、典型案例4、注意事项 二、搭建1、安装MongoDB&#xff0c;配置环境变量2、创建数据目录3、配置文件4、启动 MongoDB 进程5、配置复制集6、验证 三、写策略writeConcern1、w参数2、j参数2.1 介…

《如何使用思维导图进行知识结构的建立和扩展》

I.思维导图作为知识管理工具的重要性 思维导图是一款强大的效率工具&#xff0c;可以帮助有效的管理知识。”一图胜千言“它用图形的方式&#xff0c;将各个主题连接起来。我们可以清晰的了解到各主题之间的关系。 在知识管理中&#xff0c;通过创建一个知识主题的中心&#xf…

PVE虚拟化平台之安装Ubuntu-server系统

PVE虚拟化平台之安装Ubuntu-server系统 一、Ubuntu介绍1.1 Ubuntu简介1.2 Ubuntu版本1.3 ubuntu命名规则 二、上传镜像到PVE存储2.1 检查PVE环境2.2 上传镜像 三、创建虚拟机3.1 设置虚拟机名称3.2 操作系统设置3.3 系统设置3.4 磁盘设置3.5 cpu设置3.6 内存设置3.7 网络设置3.…

libvirt 热迁移流程及参数介绍

01 热迁移基本原理 1.1 热迁移概念 热迁移也叫在线迁移&#xff0c;是指虚拟机在开机状态下&#xff0c;且不影响虚拟机内部业务正常运行的情况下&#xff0c;从一台宿主机迁移到另外一台宿主机上的过程。 1.2 虚拟机数据传输预拷贝和后拷贝 预拷贝(pre-copy)&#xff1a; …

3、wampserver中查看各项当前版本及简单配置PHP

wampserver点击左键&#xff0c;即可查看Apache&#xff0c;PHP&#xff0c;MySQL&#xff0c;MariaDB的当前版本 在wampserver的安装目录中&#xff0c;在相应的D:\wamp64\bin\php\php8.0.26 php.ini文件中&#xff0c;short_open_tag On&#xff08;是否允许使用 PHP代码开…

在新建环境下配置低版本opencv

我这边是要解决 python报错&#xff1a;AttributeError: ‘module’ object has no attribute xfeatures2d’的问题&#xff0c; xfeatures2d在新版本已经被取消&#xff0c;但是需要使用老版本的一个函数 确定opencv与python的版本对应关系 一般来说可以对照这个表 具体来说…

Mac下安装python使用TensorFlow训练自己的模型

程序猿日常 Mac下安装python使用TensorFlow训练自己的模型目标 https://www.tensorflow.org/lite/models/modify/model_maker/image_classification?hlzh-cn 安装Python3.8版本 下载地址双击安装 安装pip curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py pyth…

ZKML:区块链世界的AI+隐私

1. 引言 本文主要参考&#xff1a; 2023年6月drCathieSo.eth 与 Ethereum Malaysia 视频 ZKML: Verifiable & Privacy-Preserving Compute in Blockchain2023年6月drCathieSo.eth 与 PSE 视频 Folding Circom circuits: a ZKML case study - Dr. Cathie So ZKML&#xf…

解决SpringMVC中@ResponseBody返回中文乱码

错误 解决方案一 Controller中的注解采用如下方式&#xff1a; GetMapping(value "/init" ,produces "application/json;charsetutf-8")这种方式仅对设置了的方法有效。 解决方案二 在applicationContext.xml中添加如下代码&#xff1a; <!-- 解…

广播与组播

目录 一、广播1. 什么是广播&#xff1f;2. 广播的实现 二、组播1. 分类的IP地址2. 多播IP地址3. 组播的实现 广播与组播和实现UDP通信的代码差不多 一、广播 1. 什么是广播&#xff1f; 数据包发送方式只有一个接受方&#xff0c;称为单播 如果同时发给局域网中的所有主机&…

解决vite+vue3打包部署到非根目录路径问题

修改vite.config.js文件&#xff0c;base为部署路径 base配置选项&#xff1a;

vue3 my-cron-vue3插件的使用

my-cron-vue3 这是一个cron表达式生成插件,基于vue3.0与element-plus实现。 npm i my-cron-vue3//前置配置 import { createApp } from vue import ElementPlus from element-plus; import element-plus/lib/theme-chalk/index.css; import App from ./App.vue //全局引入 imp…

探索华为、思科和瞻博网络的基本ACL和高级ACL配置方法

在网络安全中&#xff0c;访问控制列表&#xff08;Access Control List&#xff0c;简称ACL&#xff09;是一种重要的工具&#xff0c;用于控制数据包在网络中的流动。多家网络设备厂商提供了各自的ACL配置方法&#xff0c;其中华为、思科和瞻博网络是备受认可和使用广泛的品牌…