【JS+H5+CSS實現煙花特效】

話不多說直接上代碼

注意:背景圖路徑是picture/star.jpg,自己在同級目錄先創鍵picture目錄再下載一張圖片命名為star.jpg

HTML:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Fireworks Animation</title><link rel="stylesheet" href="style.css" /></head><body><canvas id="fireworksCanvas"></canvas><script src="script.js"></script></body>
</html>

JS:

    // 獲取canvas元素const canvas = document.getElementById('fireworksCanvas');const ctx = canvas.getContext('2d');// 設置canvas寬度和高度為窗口寬度和高度canvas.width = window.innerWidth;canvas.height = window.innerHeight;let fireworks = [];// 創建煙花類class Firework {constructor() {this.x = Math.random() * canvas.width; // 隨機生成煙花的起始x坐標this.y = canvas.height; // 煙花起始y坐標為畫布底部this.radius = 2; // 煙花半徑this.speed = 7; // 煙花上升速度this.color = 'white'; // 煙花顏色this.exploded = false; // 煙花是否已經爆炸this.particles = []; // 煙花爆炸后的粒子數組this.explosionHeight = Math.random() * (canvas.height * 0.4) + (canvas.height * 0.1); // 生成隨機的爆炸高度this.initialAlpha = 1; // 初始透明度this.currentAlpha = this.initialAlpha; // 當前透明度}update() {if (!this.exploded) {this.y -= this.speed; // 煙花向上運動// 逐漸減少煙花的透明度this.currentAlpha -= 0.005;if (this.currentAlpha < 0) {this.currentAlpha = 0;}if (this.y <= this.explosionHeight) {this.explode();}} else {this.particles.forEach((particle, index) => {particle.update(); // 更新粒子的運動狀態if (particle.alpha <= 0) {this.particles.splice(index, 1);}});}}draw() {ctx.beginPath(); // 開始繪制路徑ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2); // 繪制一個以(x, y)為中心,半徑為radius的圓ctx.fillStyle = this.color; // 設置填充顏色為煙花的顏色ctx.globalAlpha = this.currentAlpha; // 使用當前透明度ctx.fill(); // 填充圓ctx.closePath(); // 結束繪制路徑if (this.exploded) {this.particles.forEach(particle => {particle.draw(); // 繪制每個粒子});}}explode() {this.exploded = true; // 設置煙花為已經爆炸狀態for (let i = 0; i < 100; i++) {let particle = new Particle(this.x, this.y); // 創建一個新的粒子,位置為煙花的位置this.particles.push(particle); // 將新創建的粒子添加到煙花的粒子數組中}}}// 創建粒子類class Particle {constructor(x, y) { // 粒子類的構造函數,接收x和y坐標作為參數this.x = x; // 設置粒子的x坐標this.y = y; // 設置粒子的y坐標this.radius = 2; // 設置粒子的半徑this.speedX = Math.random() * 5 - 2; // 隨機生成粒子在x軸上的速度this.speedY = Math.random() * 5 - 2; // 隨機生成粒子在y軸上的速度this.color = `hsl(${Math.random() * 360}, 100%, 50%)`; // 隨機生成粒子的顏色this.alpha = 1.2; // 設置粒子的透明度為1.2this.fade = Math.random() * 0.02 + 0.01; // 隨機生成粒子透明度的減少速度}update() { // 更新粒子的位置和透明度this.x += this.speedX; // 更新粒子的x坐標this.y += this.speedY; // 更新粒子的y坐標this.alpha -= this.fade; // 減少粒子的透明度}draw() { // 繪制粒子ctx.beginPath(); // 開始繪制路徑ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2); // 繪制一個以(x, y)為中心,半徑為radius的圓ctx.fillStyle = this.color; // 設置填充顏色為粒子的顏色ctx.globalAlpha = this.alpha; // 設置全局透明度為粒子的透明度ctx.fill(); // 填充圓ctx.closePath(); // 結束繪制路徑}}function animate() { // 動畫函數,更新畫布內容并繪制煙花和粒子ctx.fillStyle = 'rgba(0, 0, 0, 0.1)'; // 設置畫布背景顏色及透明度ctx.fillRect(0, 0, canvas.width, canvas.height); // 填充矩形覆蓋畫布fireworks.forEach((firework, index) => { // 遍歷煙花數組firework.update(); // 更新煙花的位置和狀態firework.draw(); // 繪制煙花及其粒子if (firework.exploded && firework.particles.length === 0) { // 如果煙花已經爆炸且沒有粒子了fireworks.splice(index, 1); // 從煙花數組中移除該煙花}});requestAnimationFrame(animate); // 遞歸調用自身,實現連續動畫效果}function init() { // 初始化函數setInterval(() => { // 每隔2秒執行一次let firework = new Firework(); // 創建一個新的煙花對象fireworks.push(firework); // 將新創建的煙花對象添加到煙花數組中}, 100);//每次循環的時間不能太長animate(); // 調用動畫函數開始動畫}init();

CSS:

body {margin: 0;padding: 0;overflow: hidden;background: url('picture/star.jpg') no-repeat center center fixed;background-size: cover;
}
canvas {display: block;margin: auto;position: absolute;top: 0;left: 0;right: 0;bottom: 0;opacity: 0.5; /* 設置畫布的透明度為0.5 */
}

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

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

相關文章

【LLM】三、open-webui+ollama搭建自己的聊天機器人

系列文章目錄 往期文章回顧&#xff1a; 【LLM】二、python調用本地的ollama部署的大模型 【LLM】一、利用ollama本地部署大模型 目錄 前言 一、open-webui是什么 二、安裝 1.docker安裝 2.源碼安裝 三、使用 四、問題匯總 總結 前言 前面的文章&#xff0c;我們已經…

探索Qt的QVariant:靈活的數據交換機制

&#x1f60e; 作者介紹&#xff1a;歡迎來到我的主頁&#x1f448;&#xff0c;我是程序員行者孫&#xff0c;一個熱愛分享技術的制能工人。計算機本碩&#xff0c;人工制能研究生。公眾號&#xff1a;AI Sun&#xff08;領取大廠面經等資料&#xff09;&#xff0c;歡迎加我的…

VMware使用技巧

目錄 1. 系統快照 1.1 拍攝快照 1.2 查看快照 1.3 應用/刪除快照 2. 克隆虛擬機 3. 刪除虛擬機 1. 系統快照 1.1 拍攝快照 將當前系統的狀態保存下來&#xff0c;如果將來系統出現不可修復的故障&#xff0c;使用快照可以恢復操作系統&#xff1b; CentOS7——拍照—…

【開源】基于RMBG的一鍵摳圖與證件照制作系統【含一鍵啟動包】

《博主簡介》 小伙伴們好&#xff0c;我是阿旭。專注于人工智能、AIGC、python、計算機視覺相關分享研究。 ?更多學習資源&#xff0c;可關注公-仲-hao:【阿旭算法與機器學習】&#xff0c;共同學習交流~ &#x1f44d;感謝小伙伴們點贊、關注&#xff01; 《------往期經典推…

【Linux】System V信號量詳解以及semget()、semctl()和semop()函數講解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;個人主頁 &#xff1a;阿然成長日記 …

Kotlin構造函數

目錄 構造函數類型 主構造函數 成員變量設置 私有化操作 次級構造函數 構造函數類型 主構造函數&#xff08;主構造器&#xff09;——只能有一個次構造函數&#xff08;次構造器&#xff09;——可以是多個 主構造函數 構造器 constructor關鍵字前 無注解或修飾符作用&…

性能監控的革命:Eureka引領分布式服務監控新紀元

性能監控的革命&#xff1a;Eureka引領分布式服務監控新紀元 引言 在微服務架構中&#xff0c;服務的分布式性能監控對于維護系統健康和優化用戶體驗至關重要。Eureka作為Netflix開源的服務發現框架&#xff0c;為服務的注冊與發現提供了強大支持&#xff0c;而結合其他工具&…

數字化轉型:企業法務管理的未來發展 ???

在數字化浪潮的推動下&#xff0c;企業法務管理正經歷著前所未有的變革。傳統的法務工作模式在數據處理、合同審查、風險評估等方面逐漸顯得力不從心。面對這一挑戰&#xff0c;企業法務管理的數字化轉型成為提升效率、保障合規、優化法律服務的必然選擇。 數字化轉型涉及到法…

HTML(30)——動畫

動畫 實現步驟 定義動畫 keyframes 動畫名稱{ from{} to{} } keyframes 動畫名稱{ 0%{} 10%{} .... 100%{} } 2.使用動畫 animation:動畫名稱 動畫花費時間; 示例&#xff1a;盒子的寬度從200變到400px&#xff0c;兩個狀態一般用from to的形式 <style>.box {width: …

解析Xml文件并修改QDomDocument的值

背景&#xff1a; 我需要解決一個bug&#xff0c;需要我從xml中讀取數據到QDomDocument&#xff0c;然后獲取到我想要的目標信息&#xff0c;然后修改該信息。 ---------------------------------------------------------------------------------------------------------…

各大常用代碼編輯器的快捷鍵集合

visualstudio2017 快捷鍵 多行注釋 crtl / 取消多行注釋crtl Q 代碼跳轉返回 crtl /- visualcode快捷鍵 代碼跳轉返回 crtl 左鍵/右鍵 androidstudio快捷鍵 代碼跳轉返回 crtl alt 左鍵/右鍵

VUE中ECharts提示框tooltip自動切換

目錄 前言1導入插件2定義參數3 插件API 前言 使用VUE開發的數據大屏統計&#xff0c;又需要將 echarts的提示框 tooltip 實現自動切換&#xff0c;網上有個很簡單的插件&#xff08;echarts-tooltip-auto-show&#xff09;&#xff0c;使用教程簡單分享給大家。 自動每隔幾秒切…

哦華為倉頡語言

本來我不太想說的&#xff0c;奈何有不少粉絲提問提到了這語言&#xff0c;目前的情況我不透露太多&#xff0c;看過這課程C實現一門計算機編程語言到手擼虛擬機實戰的懂的自然懂。 在互聯網領域幾乎大部分應用軟件運行在X86 LINUX上居多&#xff0c;如果你有問題可以先學習這…

多版本python環境中,讓python3固定指向其中一個python可執行文件

如果你只安裝一個python環境&#xff0c;那么一般可執行文件名就叫python.exe和pythonw.exe 但是如果你有多個python環境時&#xff0c;可執行文件名是需要進行修改的&#xff0c;使得在安裝庫和調用時能夠分辨python環境&#xff0c;比如我的電腦中裝有python3.10和python2.x …

Transformer模型論文解讀、源碼分析和項目實踐

本文是ChatGPT系列的開篇之作&#xff0c;為什么吧Transformer放到這里呢&#xff0c;因為不管是chatgpt-1&#xff0c; chatgpt-2&#xff0c; chatgpt-3都是以Transformer作為底層基礎來實現&#xff0c;相當于chatgpt系列的老祖先了。如果想要深入的了解清楚chatgpt的來龍去…

AcWing 4173. 線段 (貪心)

數軸上有 n 條線段&#xff0c;選取其中 k 條線段使得這 k&#x1d458; 條線段兩兩沒有重合部分&#xff0c;問 k 最大為多少。 輸入格式 第一行為一個正整數 n&#xff1b; 在接下來的 n 行中&#xff0c;每行有 2 個數 ai,bi&#xff0c;描述每條線段的左右端點坐標。 輸…

BUUCTF[堆][of_by_one]

堆中of_by_one 介紹&#xff1a; 嚴格來說 off-by-one 漏洞是一種特殊的溢出漏洞&#xff0c;off-by-one 指程序向緩沖區中寫入時&#xff0c;寫入的字節數超過了這個緩沖區本身所申請的字節數并且只越界了一個字節。溢出字節為可控制任意字節 &#xff1a;通過修改大小(size…

token無感刷新方法

1.這里推薦去看這個老師的視頻,我的方案都是根據他的視頻來的視頻地址 2.這邊使用的工具是axios import axios from axios const service axios.create({baseURL: ,headers: {Authorization: token 你自己的token,},timeout: 1000 * 60, })// 攔截響應 service.interceptors…

Spring AOP源碼篇四之 數據庫事務

了解了Spring AOP執行過程&#xff0c;再看Spring事務源碼其實非常簡單。 首先從簡單使用開始, 演示Spring事務使用過程 Xml配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema…

【北京迅為】《i.MX8MM嵌入式Linux開發指南》-第一篇 嵌入式Linux入門篇-第十六章 Linux 第一個程序 HelloWorld

i.MX8MM處理器采用了先進的14LPCFinFET工藝&#xff0c;提供更快的速度和更高的電源效率;四核Cortex-A53&#xff0c;單核Cortex-M4&#xff0c;多達五個內核 &#xff0c;主頻高達1.8GHz&#xff0c;2G DDR4內存、8G EMMC存儲。千兆工業級以太網、MIPI-DSI、USB HOST、WIFI/BT…