?我的第一個開源項目:躍動的心

? ? ? ? 還是一個編程初學者時,我懷著激動的心情完成了人生第一個開源項目——一個用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
英文地址,請注明出處:http://en.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 等),并伴隨對根路徑 / 的正常訪問。這種行為的可能性包括惡意掃描、自動化工…