当前位置: 首页 > news >正文

Svelte -用户点击屏幕时生成一系列飞出的粒子

示例:粒子系统

    创建一个简单的粒子系统,这个系统会在用户点击屏幕时生成一系列飞出的粒子。使用 Svelte 的响应式声明($:)和状态管理来保持系统的简洁高效。

1. 创建一个新的 Svelte 组件 ParticleSystem.svelte
<script>import { onMount } from 'svelte';// 定义粒子数组let particles = [];// 粒子对象function createParticle(x, y) {return {x,y,velocity: { x: (Math.random() - 0.5) * 2, y: (Math.random() - 0.5) * 2 },life: 1.0};}// 更新函数function updateParticles() {particles = particles.map(particle => {particle.x += particle.velocity.x;particle.y += particle.velocity.y;particle.life -= 0.01; // 每帧减少生命值return particle;}).filter(particle => particle.life > 0); // 移除已经死亡的粒子}// 添加新的粒子function addParticles(event) {const rect = event.target.getBoundingClientRect();for (let i = 0; i < 10; i++) {particles.push(createParticle(event.clientX - rect.left,event.clientY - rect.top));}}// 设置更新循环onMount(() => {const animationFrame = () => {requestAnimationFrame(animationFrame);updateParticles();};animationFrame(); // 启动动画});
</script><style>.particle {position: absolute;width: 5px;height: 5px;background: rgba(255, 255, 255, 0.8);border-radius: 50%;pointer-events: none; /* 防止粒子干扰鼠标事件 */}
</style><div on:click={addParticles} style="position: relative; width: 100%; height: 300px; background: #000;">{#each particles as particle (particle)}<divclass="particle"style={`left: ${particle.x}px; top: ${particle.y}px; opacity: ${particle.life};`}></div>{/each}
</div>

在这个例子中:

  • 定义particles数组来存储所有活动的粒子。
  • createParticle函数用于根据给定的位置创建一个新的粒子。
  • updateParticles函数每帧都会被调用,会更新每个粒子的位置,并降低它们的生命值。如果粒子的生命值降到0以下,则从数组中移除该粒子。
  • 当用户点击画布时,addParticles函数会在点击位置附近生成一组新的粒子。
  • 使用onMount生命周期钩子来设置一个连续的动画循环,这样即使在没有用户输入的情况下,粒子也会持续更新。
  • 在样式部分,为粒子设置了基础的CSS样式,包括绝对定位、大小、背景色以及圆形边界。
  • {#each}指令用于遍历particles数组,并为每个粒子渲染一个<div>元素,其位置和透明度基于粒子的状态。

http://www.mrgr.cn/news/37233.html

相关文章:

  • Study Plan For Algorithms - Part41
  • Win10 Chrome浏览器被强制绑定主页的解决办法
  • 欢聚时代(BIGO)大数据面试题及参考答案(4万字长文)
  • 阳光能源嵌入式面试及参考答案(2万字长文)
  • AI学习指南深度学习篇-丢弃法在深度学习中的应用
  • Spring RestTemplate 升级 WebClient 导致 OutOfMemoryError
  • 【漏洞复现】天融信 运维安全审计系统 synRequest.do 远程命令执行漏洞
  • 问:聊聊JAVA中的共享锁和独占锁?
  • 【HarmonyOS】鸿蒙仿iOS线性渐变实现
  • 程序员如何提升核心竞争力以应对技术变革与挑战
  • 实战OpenCV之色彩空间转换
  • LabVIEW提高开发效率技巧----并行处理
  • 使用PyTorch进行自然语言处理:实现一个文本分类函数
  • Redis实战--Redis应用过程中出现的热门问题及其解决方案
  • XSS | DOM 型 XSS 攻击
  • MySQL基础知识(三)
  • 定时任务上云改造方案
  • HI3521DV200 22AP10/SS524V100 芯片及开发板
  • GNU链接器(LD):PHDRS 命令用法及实例详解
  • 解决图片放大模糊