‌我的第一个开源项目:跃动的心

        还是一个编程初学者时,我怀着激动的心情完成了人生第一个开源项目——一个用HTML5 Canvas制作的动态跳动爱心效果。这个项目虽然简单,却让我深刻体会到了开源分享的快乐和技术创造的魅力。

壹、项目灵感

        这个项目的灵感来源于浏览网页时,被各种爱心动画吸引,于是决定用代码实现一个美观又简单的爱心效果。

贰、基础环境要求

  • 现代浏览器(Chrome/Firefox/Edge最新版)

  • 文本编辑器(VS Code/Sublime等)

  • 本地服务器(可用VS Code的Live Server插件)

叁、技术实现

        项目主要使用了以下技术:

  1. HTML5 Canvas‌:作为动画渲染的核心
  2. JavaScript粒子系统‌:通过500个粒子构成爱心形状
  3. CSS动画‌:添加了轻微的缩放和旋转效果

        核心代码实现了:

  • 粒子初始化和管理(Particle类)
  • 爱心数学建模(pointOnHeart函数)
  • 平滑动画渲染(requestAnimationFrame)

爱心动画实现流程

  1.  Canvas初始化 
  2.  粒子系统创建 
  3.  爱心路径数学建模 
  4.  粒子运动计算 
  5.  逐帧渲染

关键参数配置说明

// settings对象可调整参数:
particles: {length: 500,      // 粒子数量(建议300-1000)duration: 2,      // 动画周期(秒)velocity: 100,    // 粒子速度effect: -0.75,    // 运动曲线(-1~1之间调节)size: 30          // 粒子基础大小
}

JavaScript实现二维点/向量类 

        代码介绍:

  1. 构造函数:初始化点的x,y坐标,默认值为0
  2. clone()方法:创建当前点的深拷贝副本
  3. length()方法:
    • 无参数时:计算点到原点的距离(向量长度)
    • 有参数时:将向量标准化并缩放到指定长度
  4. normalize()方法:将向量标准化为单位向量(长度为1)
    var Point = (function () {function Point(x, y) {this.x = typeof x !== "undefined" ? x : 0;this.y = typeof y !== "undefined" ? y : 0;}Point.prototype.clone = function () {return new Point(this.x, this.y);};Point.prototype.length = function (length) {if (typeof length == "undefined")return Math.sqrt(this.x * this.x + this.y * this.y);this.normalize();this.x *= length;this.y *= length;return this;};Point.prototype.normalize = function () {var length = this.length();this.x /= length;this.y /= length;return this;};return Point;})();

JavaScript实现粒子系统类,用于创建和控制粒子动画效果:

构造函数‌:

  • 初始化粒子的位置(position)、速度(velocity)、加速度(acceleration)和生命周期(age)属性
  • 使用之前定义的Point类来存储向量数据

initialize方法‌:

  • 设置粒子的初始位置(x,y)和初始速度(dx,dy)
  • 根据初始速度和settings.particles.effect计算加速度
  • 重置生命周期计数器

update方法‌:

  • 根据时间增量(deltaTime)更新粒子状态
  • 使用欧拉积分计算新位置:position += velocity * deltaTime
  • 更新速度:velocity += acceleration * deltaTime
  • 增加生命周期计数器

draw方法‌:

  • 使用缓动函数ease(t)实现平滑的尺寸变化效果
  • 根据生命周期计算粒子大小和透明度
  • 在Canvas上绘制粒子图像,并自动居中
 var Particle = (function () {function Particle() {this.position = new Point();this.velocity = new Point();this.acceleration = new Point();this.age = 0;}Particle.prototype.initialize = function (x, y, dx, dy) {this.position.x = x;this.position.y = y;this.velocity.x = dx;this.velocity.y = dy;this.acceleration.x = dx * settings.particles.effect;this.acceleration.y = dy * settings.particles.effect;this.age = 0;};Particle.prototype.update = function (deltaTime) {this.position.x += this.velocity.x * deltaTime;this.position.y += this.velocity.y * deltaTime;this.velocity.x += this.acceleration.x * deltaTime;this.velocity.y += this.acceleration.y * deltaTime;this.age += deltaTime;};Particle.prototype.draw = function (context, image) {function ease(t) {return --t * t * t + 1;}var size = image.width * ease(this.age / settings.particles.duration);context.globalAlpha = 1 - this.age / settings.particles.duration;context.drawImage(image,this.position.x - size / 2,this.position.y - size / 2,size,size);};return Particle;})();

肆、项目特色

  1. 高度可定制‌:

         可修改粒子数量、大小和颜色

  1. 响应式设计‌:

    • 自动适应不同屏幕尺寸

    • 粒子速度会根据设备性能自动调整

  2. 轻量级‌:

    • 仅依赖jQuery库

    • 压缩后代码不到100KB

伍、自定义开发步骤

修改爱心颜色


修改CSS中的#dc4b61色值:

  • Canvas填充色(第246行)

  • 文字颜色(.text_box类)

陆、快速启动

        直接双击index.html在浏览器打开

柒、开源地址

        通过这个项目,我学会了:

  • 如何组织一个完整的Web项目
  • 使用Git进行版本控制
  • 编写清晰的文档说明
  • 处理来自社区的issue和PR

项目地址: GitCode - 全球开发者的开源社区,开源代码托管平台

捌、结尾

        这个小小的爱心项目是我开源之路的起点,它让我相信:再小的创意,通过开源的力量也能绽放光彩。期待未来能创造出更多有价值的开源作品!

玖、彩蛋

热力全开!今日中伏 

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

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

相关文章

技术演进中的开发沉思-53 DELPHI VCL系列:windows的消息(下):TApplication窗体

今天我们梳理下关于TApplication的窗体消息下半部分的内容。前面也说过,在 Delphi 的世界里,TApplication 就像一位经验丰富的总工程师,而主窗体则是它倾注心血打造的核心建筑。如果你第一次在实验室里敲出 Delphi 代码时,屏幕上弹…

cesium FBO(四)自定义相机渲染到Canvas(离屏渲染)

前面几节的例子是将Cesium默认的相机渲染到纹理(RTT)或Canvas,这片文章讲解如何将自定义的一个camera的画面渲染到Canvas上,有了前面几篇的基础了,也能将自定义的画面渲染纹理、也可以灰度处理,原理是一样的…

双机并联无功环流抑制虚拟阻抗VSG控制【simulink仿真模型实现】

双机并联虚拟同步发电机(VSG)系统中,因线路阻抗不匹配及参数差异,易引发无功环流。本方案在传统VSG控制基础上,引入自适应虚拟阻抗环节。其核心在于:实时检测两机间无功环流分量,据此动态调节各…

python测试总结

测试题的基础知识点总结 1.循环求和 for循环步长(range(2,101,2)) while循环条件判断(i%20) 生成器表达式(sum(i for i in range )) 所以:sum(range(1,101,2))(奇数和)和…

识别和分类恶意软件样本的工具YARA

YARA 是一个用于识别和分类恶意软件样本的工具,广泛应用于恶意软件分析、威胁情报、入侵检测等领域。它通过编写规则(YARA Rules)来匹配文件中的特定字符串、十六进制模式、正则表达式等特征。 一、YARA 的基本使用方法 1. 安装 YARA Linux(Ubuntu/Debian) sudo apt-ge…

GaussDB 约束的语法

1 约束的作用约束是作用于数据表中列上的规则,用于限制表中数据的类型。约束的存在保证了数据库中数据的精确性和可靠性。约束有列级和表级之分,列级约束作用于单一的列,而表级约束作用于整张数据表。下面是 GaussDB SQL 中常用的约束。NOT …

SecurityContextHolder 管理安全上下文的核心组件详解

SecurityContextHolder 管理安全上下文的核心组件详解在 Spring Security 中,SecurityContextHolder 是​​安全上下文(Security Context)的核心存储容器​​,其核心作用是​​在当前线程中保存当前用户的认证信息(如用…

c++详解系列(引用指针)

目录 1.什么是引用 2.引用的定义 3.引用的特性 4.引用的使用 4.1引用传参 4.2传引用返回 5.const引用(在引用的定义前用const修饰) 5.1对于引用 5.2对于指针 6.引用&指针 总结 1.什么是引用 引用就是给变量起别名,一个变量可以…

深度学习loss总结(二)

对于目前深度学习主流任务学习,loss的设置至关重要。下面就不同任务的loss设置进行如下总结: (1)目标检测 2D/3D目标检测中的 Loss(损失函数)是训练模型时优化目标的核心,通常包括位置、类别、尺寸、方向等多个方面。以下是目前 常见的 2D 和 3D 目标检测 Loss 分类与…

【Linux网络】netstat 的 -anptu 各个参数各自表示什么意思?

netstat 是一个网络统计工具,它可以显示网络连接、路由表、接口统计、伪装连接和多播成员资格。在 netstat 命令中,不同的参数可以用来定制输出的内容。 你提到的 -anptu 参数组合各自的功能如下: -a (all): 显示所有活动的连接和监听端口。它…

[硬件电路-115]:模拟电路 - 信号处理电路 - 功能放大器工作分类、工作原理、常见芯片

功能放大器是以特定功能为核心的集成化放大电路,通过将运算放大器与外围电阻、电容等元件集成在单一芯片中,实现标准化、高性能的信号放大功能。其核心优势在于简化设计流程、提升系统稳定性,并针对特定应用场景优化性能参数。以下从定义、分…

双网卡UDP广播通信机制详解

UDP广播通信机制详解 一、通信流程分析 发送阶段 通过Client.Bind(192.168.0.3, 60000)将UDP套接字绑定到指定网卡和端口设置RemoteHost "255.255.255.255"实现全网段广播数据流向:192.168.0.3:60000 → 255.255.255.255:50000 接收阶段 设备响应数据应返…

从遮挡难题到精准测量:激光频率梳技术如何实现深孔 3D 轮廓的 2um 级重复精度?

一、深孔 3D 轮廓测量的遮挡困境深孔结构(如航空发动机燃油喷嘴孔、模具冷却孔)因孔深大(常超 100mm)、深径比高(>10:1),其 3D 轮廓测量长期受限于光学遮挡难题。传统光学测量技术&a…

.NET 依赖注入(DI)全面解析

文章目录一、依赖注入核心原理1. 控制反转(IoC)与DI关系2. .NET DI核心组件二、服务生命周期1. 三种生命周期类型三、DI容器实现原理1. 服务注册流程2. 服务解析流程四、高级实现方法1. 工厂模式注册2. 泛型服务注册3. 多实现解决方案五、ASP.NET Core中的DI集成1. 控制器注入2…

K8S部署ELK(二):部署Kafka消息队列

目录 1. Kafka 简介 1.1 Kafka 核心概念 (1)消息系统 vs. 流处理平台 (2)核心组件 1.2 Kafka 核心特性 (1)高吞吐 & 低延迟 (2)持久化存储 (3)分…

Rust进阶-part1-智能指针概述-box指针

Rust进阶[part1]_智能指针概述&box指针 智能指针概述 在Rust中,智能指针是一类特殊的数据结构,它们不仅像普通指针一样可以引用数据,还带有额外的元数据和功能。与普通指针不同,智能指针通常使用结构体实现,并且会实现 Deref 和 Drop 等特定的trait,以提供更强大的…

C++扩展 --- 并发支持库(补充1)

C扩展 --- 并发支持库(下)https://blog.csdn.net/Small_entreprene/article/details/149606406?fromshareblogdetail&sharetypeblogdetail&sharerId149606406&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link atom…

在Three.js中导入和添加自定义网格的最佳实践 - 综合指南

探索在Three.js中导入和添加自定义网格的最佳实践。本指南涵盖增强 3D 项目的技术、技巧和实际示例。 添加图片注释,不超过 140 字(可选) 强烈建议使用 GLTF 格式来集成 3D 几何体,提供简化的流程,并固有地支持动画、…

Redis知识点(1)

目录 Redis Redis和MySQL的区别 Redis的高可用方案 Redis可以用来做什么 Redis的数据类型 字符串 列表 哈希 集合 有序集合 Bitmap Redis为什么快呢? I/O多路复用 说说select,poll,epoll,kqueue,IOCP的区别 Redis为什么早期选择单线程? …

使用iptables封禁恶意ip异常请求

查看后端日志发现一IP(103.76.250.29)频繁请求不存在的资源路径​​(如 /api/v1/guest/comm/config、/theme/default/assets/compoments.js 等),并伴随对根路径 / 的正常访问。这种行为的可能性包括恶意扫描、自动化工…