HTML飄落的花瓣

目錄

寫在前面

HTML???????簡介

完整代碼

代碼分析

系列推薦

寫在最后


寫在前面

本期小編給大家推薦HTML實現的飄落的花瓣,無需安裝軟件,直接下載即可打開~

HTML???????簡介

HTML(Hypertext Markup Language)是一種用于創建網頁的標記語言。它由一系列標簽組成,這些標簽描述了網頁上的內容和結構。HTML中的標簽以尖括號包圍,通常成對出現,包括起始標簽和結束標簽,它們之間包含內容。HTML文檔通常以<html>標簽開始,以</html>標簽結束。常見的標簽包括<head>用于定義文檔的頭部信息,<title>用于指定標題,<body>用于定義文檔的主體內容等。通過使用不同的標簽和屬性,開發人員可以創建出多樣化且豐富的網頁內容,包括文本、圖像、鏈接、表格等。HTML的語法相對簡單,易于學習和使用,是構建網頁的基礎。隨著技術的發展,HTML也在不斷更新,最新版本為HTML5,提供了更多功能和語義化標簽,使得網頁開發更加靈活和可靠。

完整代碼

<!DOCTYPE HTML>
<HTML><TITLE>飄落的花瓣</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<style>html,body {width: 100%;height: 100%;margin: 0;padding: 0;overflow: hidden;}.container {width: 100%;height: 100%;margin: 0;padding: 0;background-color: #000000;}
</style>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</HEAD><BODY><div id="jsi-cherry-container" class="container"></div><script>var RENDERER = {INIT_CHERRY_BLOSSOM_COUNT: 30,MAX_ADDING_INTERVAL: 10,init: function () {this.setParameters();this.reconstructMethods();this.createCherries();this.render();},setParameters: function () {this.$container = $('#jsi-cherry-container');this.width = this.$container.width();this.height = this.$container.height();this.context = $('<canvas />').attr({ width: this.width, height: this.height }).appendTo(this.$container).get(0).getContext('2d');this.cherries = [];this.maxAddingInterval = Math.round(this.MAX_ADDING_INTERVAL * 1000 / this.width);this.addingInterval = this.maxAddingInterval;},reconstructMethods: function () {this.render = this.render.bind(this);},createCherries: function () {for (var i = 0, length = Math.round(this.INIT_CHERRY_BLOSSOM_COUNT * this.width / 1000); i < length; i++) {this.cherries.push(new CHERRY_BLOSSOM(this, true));}},render: function () {requestAnimationFrame(this.render);this.context.clearRect(0, 0, this.width, this.height);this.cherries.sort(function (cherry1, cherry2) {return cherry1.z - cherry2.z;});for (var i = this.cherries.length - 1; i >= 0; i--) {if (!this.cherries[i].render(this.context)) {this.cherries.splice(i, 1);}}if (--this.addingInterval == 0) {this.addingInterval = this.maxAddingInterval;this.cherries.push(new CHERRY_BLOSSOM(this, false));}}};var CHERRY_BLOSSOM = function (renderer, isRandom) {this.renderer = renderer;this.init(isRandom);};CHERRY_BLOSSOM.prototype = {FOCUS_POSITION: 300,FAR_LIMIT: 600,MAX_RIPPLE_COUNT: 100,RIPPLE_RADIUS: 100,SURFACE_RATE: 0.5,SINK_OFFSET: 20,init: function (isRandom) {this.x = this.getRandomValue(-this.renderer.width, this.renderer.width);this.y = isRandom ? this.getRandomValue(0, this.renderer.height) : this.renderer.height * 1.5;this.z = this.getRandomValue(0, this.FAR_LIMIT);this.vx = this.getRandomValue(-2, 2);this.vy = -2;this.theta = this.getRandomValue(0, Math.PI * 2);this.phi = this.getRandomValue(0, Math.PI * 2);this.psi = 0;this.dpsi = this.getRandomValue(Math.PI / 600, Math.PI / 300);this.opacity = 0;this.endTheta = false;this.endPhi = false;this.rippleCount = 0;var axis = this.getAxis(),theta = this.theta + Math.ceil(-(this.y + this.renderer.height * this.SURFACE_RATE) / this.vy) * Math.PI / 500;theta %= Math.PI * 2;this.offsetY = 40 * ((theta <= Math.PI / 2 || theta >= Math.PI * 3 / 2) ? -1 : 1);this.thresholdY = this.renderer.height / 2 + this.renderer.height * this.SURFACE_RATE * axis.rate;this.entityColor = this.renderer.context.createRadialGradient(0, 40, 0, 0, 40, 80);this.entityColor.addColorStop(0, 'hsl(330, 70%, ' + 50 * (0.3 + axis.rate) + '%)');this.entityColor.addColorStop(0.05, 'hsl(330, 40%,' + 55 * (0.3 + axis.rate) + '%)');this.entityColor.addColorStop(1, 'hsl(330, 20%, ' + 70 * (0.3 + axis.rate) + '%)');this.shadowColor = this.renderer.context.createRadialGradient(0, 40, 0, 0, 40, 80);this.shadowColor.addColorStop(0, 'hsl(330, 40%, ' + 30 * (0.3 + axis.rate) + '%)');this.shadowColor.addColorStop(0.05, 'hsl(330, 40%,' + 30 * (0.3 + axis.rate) + '%)');this.shadowColor.addColorStop(1, 'hsl(330, 20%, ' + 40 * (0.3 + axis.rate) + '%)');},getRandomValue: function (min, max) {return min + (max - min) * Math.random();},getAxis: function () {var rate = this.FOCUS_POSITION / (this.z + this.FOCUS_POSITION),x = this.renderer.width / 2 + this.x * rate,y = this.renderer.height / 2 - this.y * rate;return { rate: rate, x: x, y: y };},renderCherry: function (context, axis) {context.beginPath();context.moveTo(0, 40);context.bezierCurveTo(-60, 20, -10, -60, 0, -20);context.bezierCurveTo(10, -60, 60, 20, 0, 40);context.fill();for (var i = -4; i < 4; i++) {context.beginPath();context.moveTo(0, 40);context.quadraticCurveTo(i * 12, 10, i * 4, -24 + Math.abs(i) * 2);context.stroke();}},render: function (context) {var axis = this.getAxis();if (axis.y == this.thresholdY && this.rippleCount < this.MAX_RIPPLE_COUNT) {context.save();context.lineWidth = 2;context.strokeStyle = 'hsla(0, 0%, 100%, ' + (this.MAX_RIPPLE_COUNT - this.rippleCount) / this.MAX_RIPPLE_COUNT + ')';context.translate(axis.x + this.offsetY * axis.rate * (this.theta <= Math.PI ? -1 : 1), axis.y);context.scale(1, 0.3);context.beginPath();context.arc(0, 0, this.rippleCount / this.MAX_RIPPLE_COUNT * this.RIPPLE_RADIUS * axis.rate, 0, Math.PI * 2, false);context.stroke();context.restore();this.rippleCount++;}if (axis.y < this.thresholdY || (!this.endTheta || !this.endPhi)) {if (this.y <= 0) {this.opacity = Math.min(this.opacity + 0.01, 1);}context.save();context.globalAlpha = this.opacity;context.fillStyle = this.shadowColor;context.strokeStyle = 'hsl(330, 30%,' + 40 * (0.3 + axis.rate) + '%)';context.translate(axis.x, Math.max(axis.y, this.thresholdY + this.thresholdY - axis.y));context.rotate(Math.PI - this.theta);context.scale(axis.rate * -Math.sin(this.phi), axis.rate);context.translate(0, this.offsetY);this.renderCherry(context, axis);context.restore();}context.save();context.fillStyle = this.entityColor;context.strokeStyle = 'hsl(330, 40%,' + 70 * (0.3 + axis.rate) + '%)';context.translate(axis.x, axis.y + Math.abs(this.SINK_OFFSET * Math.sin(this.psi) * axis.rate));context.rotate(this.theta);context.scale(axis.rate * Math.sin(this.phi), axis.rate);context.translate(0, this.offsetY);this.renderCherry(context, axis);context.restore();if (this.y <= -this.renderer.height / 4) {if (!this.endTheta) {for (var theta = Math.PI / 2, end = Math.PI * 3 / 2; theta <= end; theta += Math.PI) {if (this.theta < theta && this.theta + Math.PI / 200 > theta) {this.theta = theta;this.endTheta = true;break;}}}if (!this.endPhi) {for (var phi = Math.PI / 8, end = Math.PI * 7 / 8; phi <= end; phi += Math.PI * 3 / 4) {if (this.phi < phi && this.phi + Math.PI / 200 > phi) {this.phi = Math.PI / 8;this.endPhi = true;break;}}}}if (!this.endTheta) {if (axis.y == this.thresholdY) {this.theta += Math.PI / 200 * ((this.theta < Math.PI / 2 || (this.theta >= Math.PI && this.theta < Math.PI * 3 / 2)) ? 1 : -1);} else {this.theta += Math.PI / 500;}this.theta %= Math.PI * 2;}if (this.endPhi) {if (this.rippleCount == this.MAX_RIPPLE_COUNT) {this.psi += this.dpsi;this.psi %= Math.PI * 2;}} else {this.phi += Math.PI / ((axis.y == this.thresholdY) ? 200 : 500);this.phi %= Math.PI;}if (this.y <= -this.renderer.height * this.SURFACE_RATE) {this.x += 2;this.y = -this.renderer.height * this.SURFACE_RATE;} else {this.x += this.vx;this.y += this.vy;}return this.z > -this.FOCUS_POSITION && this.z < this.FAR_LIMIT && this.x < this.renderer.width * 1.5;}};$(function () {RENDERER.init();});</script>
</BODY></HTML>

代碼分析

這段代碼是一個HTML頁面,其中包含一個canvas元素和相關的JavaScript代碼。這個頁面創建了一個飄落花瓣的動畫效果。具體分析如下:

1. 首先定義了HTML結構,`<div id="jsi-cherry-container"></div>` 是一個用于承載花瓣動畫的容器。

2. CSS樣式部分設置了整個頁面和容器的寬高為100%,且隱藏了滾動條。

3. JavaScript部分首先引入了jQuery庫(雖然在這個示例中沒有直接使用)。

4. RENDERER對象是動畫的核心邏輯,它包含了初始化、設置參數、重構方法、創建花瓣以及渲染循環等方法。在init方法中,通過setParameters設定畫布大小、獲取容器元素、創建2D渲染上下文并初始化花瓣數組。createCherries方法用于生成初始數量的花瓣對象。render方法是動畫渲染循環,每一幀會清除畫布內容,重新排序花瓣,然后逐一渲染每個花瓣,并按照一定間隔添加新的花瓣。

5. CHERRY_BLOSSOM類代表單個花瓣,其構造函數接受一個RENDERER對象作為參數,并初始化花瓣的各種屬性,包括位置、速度、顏色漸變等。該類中的init方法用于隨機或指定方式初始化花瓣狀態,render方法則負責繪制花瓣及漣漪效果。

6. 整個動畫模擬了花瓣從畫面頂部飄落并在接觸到水面時產生漣漪的效果,通過不斷更新花瓣的位置和角度,在canvas上繪制出動態變化的花瓣圖像。

系列推薦

序號目錄直達鏈接
1HTML實現3D相冊https://want595.blog.csdn.net/article/details/138652869
2HTML元素周期表https://want595.blog.csdn.net/article/details/138653653
3HTML黑客帝國字母雨https://want595.blog.csdn.net/article/details/138654054
4HTML五彩繽紛的愛心https://want595.blog.csdn.net/article/details/138654581
5HTML飄落的花瓣https://want595.blog.csdn.net/article/details/138785324
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

寫在最后

我是一只有趣的兔子,感謝你的喜歡!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11769.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11769.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11769.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探索Playwright:Python下的Web自動化測試革命

在如今這個互聯網技術迅速發展的時代&#xff0c;web應用的質量直接關系著企業的聲譽和用戶的體驗。因此&#xff0c;自動化測試成為了保障軟件質量的重要手段之一。今天&#xff0c;我將帶大家詳細了解一款在測試領域大放異彩的神器——Playwright&#xff0c;并通過Python語言…

一覺醒來 AI科技圈發生的大小事兒 05月13日

&#x1f4f3;博弈論讓 AI 更加正確、高效&#xff0c;LLM 與自己競爭 研究團隊設計了共識博弈&#xff0c;通過讓語言模型的生成器和判別器相互博弈來提高模型的準確性和內部一致性。這種方法不需要對基礎模型進行訓練或修改&#xff0c;可以在筆記本電腦上快速執行。研究結果…

基于微信小程序+JAVA Springboot 實現的【停車場小程序】app+后臺管理系統 (內附設計LW + PPT+ 源碼+ 演示視頻 下載)

項目名稱 項目名稱&#xff1a; 停車場微信小程序的設計與實現 在當前信息技術飛速發展的背景下&#xff0c;停車場微信小程序的開發成為了一個創新的解決方案&#xff0c;旨在提高停車場管理的效率和用戶的停車體驗。本項目通過深入分析現有停車場管理系統的不足&#xff0c…

內存屏障 - LINUX KERNEL MEMORY BARRIERS 上 與 下

內存屏障&#xff08;Memory Barrier&#xff09;是在計算機體系結構中使用的一種同步機制&#xff0c;用于確保在多線程或多核處理器環境中&#xff0c;對共享內存的操作按照預期順序進行。它們通過強制在特定點執行一些指令來規定內存訪問的順序&#xff0c;并防止內存亂序執…

弱網對抗的策略有哪些?

在弱網環境下&#xff0c;數據傳輸可能會面臨丟包、延遲、抖動等問題&#xff0c;因此采取合適的弱網對抗策略對于確保數據傳輸的穩定性和可靠性至關重要。以下是一些常見的弱網對抗策略&#xff1a; 數據壓縮&#xff1a;使用壓縮算法如Gzip、Brotli等對數據進行壓縮&#xf…

Linux-vi/vim

vi是一個文本編輯器&#xff0c;用于撰寫文檔或開發程序 vim是vi的增強版&#xff0c;功能一致&#xff0c;可視化效果更好一些&#xff0c;去鼠標化&#xff0c;編輯更加方便&#xff0c;可定制化 vim編輯器是一個模式化文本編輯工具 vim有三種模式 編輯模式、插入模式和末…

使用PageHelper分頁插件,發現獲取到的total總記錄數量不對,無法獲取到正確的total數量

目錄 1.1、錯誤描述 1.2、解決方案 1.1、錯誤描述 周一在工作中&#xff0c;寫了一個列表分頁的接口&#xff0c;其中使用的是PageHelper分頁依賴&#xff0c;原本想著挺簡單的&#xff0c;也就是使用PageHelper.startPage(pageNum, pageSize);方法就可以了&#xff0c;代碼…

Linux下COOLFluiD源碼編譯安裝及使用

目錄 軟件介紹 基本依賴 其它可選依賴 一、源碼下載 二、解壓縮&#xff08;通過Github下載zip壓縮包格式&#xff09; 三、編譯安裝 3.1 依賴項-BOOST 3.2 依賴項-Parmetis 3.3 依賴項-PETSc 3.4 安裝COOLFluiD 四、算例運行 軟件介紹 COOLFluiD&#xff08;面向對象…

學術共振 美妙發聲 | 2024美沃斯大會完美收官,米蘭柏羽傾力承辦

5月10日-5月12日&#xff0c;為期3天的第十七屆美沃斯醫療美容大會在杭州國際博覽中心盛大舉辦&#xff0c;作為行業頂級學術交流平臺&#xff0c;本屆美沃斯大會不僅是醫美行業的一次學術交流盛會&#xff0c;更是一次深度探討行業未來的遠眺之窗。 5月9日&#xff0c;即美沃…

golang中switch-case及select-cas

switch a{ case b: 執行內容b case c: 執行內容c } golang中case后自帶break跳出功能&#xff0c;既&#xff1a;滿足case b 執行內容b后自動跳出&#xff0c;不會去走case c select { case <- ch1: 執行內容b case -<ch2: 執行內容c default: fmt.Println("chan…

定時備份docker-MySQL中的所有數據庫

backup_mysql.sh #!/bin/bash# 設置備份存儲目錄 backup_dir"/docker/hunqingyun-docker/mysql/backup"# 設置 MySQL 容器名稱和備份文件名 mysql_container"ruoyi-mysql" backup_file"$backup_dir/$(date %Y%m%d%H%M%S).sql"# MySQL root 用戶…

vue-router路由,帶參數的動態路由匹配(2024-05-14)

需求 需要將給定匹配模式的路由映射到同一個組件。例如&#xff0c;我們可能有一個 User 組件&#xff0c;它應該對所有用戶進行渲染&#xff0c;但用戶 ID 不同。在 Vue Router 中&#xff0c;我們可以在路徑中使用一個動態字段來實現&#xff0c;我們稱之為 路徑參數 &#…

添磚Java之路(其五)——封裝,String,StringBuilder類。

封裝&#xff1a; 封裝意義&#xff1a;更好的維護數據&#xff0c;讓使用者無需關心如何使用&#xff0c;只需要知道怎么使用。 Java Bean&#xff1a; 然后我們要知道Java Bean(實體類)標準。 1.對于這個類的成員都需要設為私有&#xff0c;而且要對外提供相應Get,Set的接…

組合商標申請如何風控提高通過率!

最近一個老客戶找到普推知產老楊&#xff0c;說要申請注冊一個新的商標&#xff0c;是一個組合商標&#xff0c;有圖形&#xff0c;兩行文字&#xff0c;一行文字的拼音&#xff0c;還有三個字母的簡稱&#xff0c;組合商標在申請時會進行拆分審查&#xff0c;圖形、文字、拼音…

【C++初階】第十一站:list的介紹及使用

目錄 list的介紹及使用 1.list的含義 2.list的介紹 3.list的使用 1.list的構造 2.list iterator的使用 3.list capacity 4.list element access 5 list modifiers 尾插尾刪 和 頭插頭刪 insert 和 erase resize swap clear 6.list sort and reverse 7.list copy vector copy li…

Java身份證識別接口集成開發示例,身份證查詢接口

人類是有情感的&#xff0c;人們所接觸到的各種事物和信息都會被身體相應器官所接收&#xff0c;然后通過神經元傳入大腦繼而被識別&#xff0c;然后大腦便會產生對該事物的認知和情緒。人們大多喜歡熱情、有趣的事物&#xff0c;對冷冰冰、枯燥、無趣的APP基本是提不起興趣的。…

16.Set、泛型、枚舉、反射、Class

Set Set集合是Collection集合的子接口&#xff0c;元素不能重復&#xff0c;只能有一個null&#xff0c;元素存放無序。 常用子類 HashSet TreeSet LinkedHashSet HashSet 其實底層就是HashMap&#xff0c;當我們構造一個HashSet對象&#xff0c;就是在 new HashSet(); …

23. 合并 K 個升序鏈表 - 力扣(LeetCode)

基礎知識要求&#xff1a; Java&#xff1a;方法、while循環、for循環、PriorityQueue類、if判斷 Python&#xff1a; 方法、while循環、for循環、heapq 模塊、if判斷 數據結構:隊列 題目&#xff1a; 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈…

11.php-fpm模板(監控頁面取值)

php-fpm模板(監控頁面取值) 開啟監控頁面配置 #修改php配置文件 vim /etc/php-fpm.d/www.conf pm.status_path /php_status#修改nginx配置文件,添加到nginx配置文件中 vim /etc/nginx/conf.d/default.conflocation /php_status {root html;fastcgi_pass 127.0.…

肥貓“也能變“型男“?揭秘福派斯牛肉高脂貓糧的神奇效果!

福貓養成指南&#xff1a;福派斯牛肉高脂貓糧的優點與考慮因素 福派斯牛肉高脂貓糧&#xff0c;這款富含蛋白質與脂肪的貓糧&#xff0c;仿佛是貓咪世界中的美味佳肴&#xff0c;讓無數貓咪為之傾倒。然而&#xff0c;這款貓糧的利與弊&#xff0c;你是否都了解呢&#xff1f;接…