滿天星之canvas實現【canvas】

展示

在這里插入圖片描述

文章目錄

    • 展示
    • Canvas 介紹【基礎】
      • 簡介
      • 兼容性
      • 關鍵特性
      • 注意事項
      • 應用場景:
      • 基本示例
    • 滿天星代碼實現【重點】
      • 代碼解釋
    • 全量代碼【來吧,盡情復制吧少年】
      • html引入
      • JS代碼
    • 參考資源

Canvas 介紹【基礎】

簡介

  • Canvas是一個基于HTML5的繪圖技術,允許開發者通過JavaScript動態渲染圖形、動畫和交互式內容。它廣泛用于游戲開發、數據可視化、圖像處理和網頁特效設計,提供像素級控制能力。
  • Canvas的API支持繪制路徑、形狀、文本和圖像,并結合漸變、陰影等效果。作為無狀態繪圖表面,性能高效,適合復雜視覺呈現。與SVG不同,Canvas直接操作像素,
  • 適合動態場景和實時渲染。現代瀏覽器均原生支持,是Web前端開發的核心工具之一。

兼容性

在這里插入圖片描述

關鍵特性

  • 即時繪制,無需DOM操作
  • 響應式設計適配不同屏幕尺寸
  • 可與WebGL結合實現3D圖形canvas

注意事項

  • 請確保在DOM加載完成后執行這段代碼
  • 如果需要清除畫布,可以使用ctx.clearRect(0, 0, canvas.width, canvas.height)
  • 坐標系統原點(0,0)位于畫布左上角

應用場景:

  • 創建簡單的圖形元素
  • 作為游戲中的基本圖形對象
  • 構建數據可視化圖表的基本單元

基本示例

  • HTML
<canvas id="canvas" width="300" height="300">抱歉,你的瀏覽器不支持 canvas 元素(這些內容將會在不支持&lt;canvas%gt;元素的瀏覽器或是禁用了 JavaScript的瀏覽器內渲染并展現)
</canvas>
  • JavaScript
// 示例:繪制一個紅色矩形
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
ctx.fillStyle = 'red';
ctx.fillRect(10, 10, 100, 100);
  • 實現效果
    在這里插入圖片描述

滿天星代碼實現【重點】

代碼解釋

  • 獲取畫布dom以及畫布寬高
	let canDom = document.getElementById('myCanvas')let canW = canDom.width;let canH = canDom.height;
  • 初始化生成星星的坐標點信息
    • 隨機生成星星的坐標點,半徑,填充色等信息
    • 將之保存在一個數組中
 	let arr = [];// 隨機生成坐標信息function randomP(w, y, count) {let arr = [];for (let i = 0; i < count; i++) {let obj = {x: Math.random() * w,y: Math.random() * y,r: Math.random() * 2.5,a: false,c: `rgba(${Math.random() *255},${Math.random() *255},${Math.random() *255}, ${Math.random() *1})`}arr.push(obj);}return arr}
  • 在畫布上,根據生成的星星坐標等基礎信息,在畫布上繪制出靜態的點
 function drawP(arr) {let canDom = document.getElementById('myCanvas')let ctx = canDom.getContext('2d')//清空畫布ctx.clearRect(0, 0, canW, canH);//畫星星for (let i = 0; i < arr.length; i++){let p = arr[i];ctx.beginPath();ctx.arc(p.x, p.y, p.r, 0, Math.PI * 2);ctx.closePath();ctx.fillStyle = p.c;ctx.fill();}}

此時,生成的點是靜態的。

在這里插入圖片描述

  • 確定變化以及最大值,計算下一次星星展示大小。
// 計算半徑,替換坐標function computedR(arr) {let jb = .5 * Math.random(); //隨機變化大小let ac = 3; //最大值for (let i = 0; i < arr.length; i++) {let item = arr[i];//臨界值判斷if ((item.r - jb > 0 || item.r + jb > ac) && !item.a) {item.r = item.r - jb} else {item.r = item.r + jbitem.a = trueif (item.r + jb > ac) {item.a = false}}}return arr;}
  • 最后,通過定時器,在一個合適的調用頻率下,反復執行清除–畫–清除–…的操作。讓星星動起來。
function init() {arr = randomP(canW, canH, 100)drawP(arr);let timer = setInterval(function () {arr = computedR(arr);drawP(arr);},60)}
init()

全量代碼【來吧,盡情復制吧少年】

html引入

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./reset.css"><link rel="stylesheet" href="./index.css"><style>*{padding: 0;margin: 0;}#myCanvas{background-color: black;width: 100vw;height: 100vh;}</style>
</head>
<body><canvas id="myCanvas" class="my-canvas">您的瀏覽器不支持html5標簽,請您換更高版本的瀏覽器</canvas> 
</body>
<script src="./index.js"></script>
</html>

JS代碼

((window) => {/** @type {HTMLCanvasElement} */let canDom = document.getElementById('myCanvas')let canW = canDom.width;let canH = canDom.height;let arr = [];init();function init() {arr = randomP(canW, canH, 100)drawP(arr);let timer = setInterval(function () {arr = computedR(arr);drawP(arr);},60)}// 計算半徑,替換坐標function computedR(arr) {let jb = .5 * Math.random();let ac = 3;for (let i = 0; i < arr.length; i++) {let item = arr[i];if ((item.r - jb > 0 || item.r + jb > ac) && !item.a) {item.r = item.r - jb} else {item.r = item.r + jbitem.a = trueif (item.r + jb > ac) {item.a = false}}}return arr;}// 畫點function drawP(arr) {let canDom = document.getElementById('myCanvas')let ctx = canDom.getContext('2d')ctx.clearRect(0, 0, canW, canH);for (let i = 0; i < arr.length; i++){let p = arr[i];ctx.beginPath();ctx.arc(p.x, p.y, p.r, 0, Math.PI * 2);ctx.closePath();ctx.fillStyle = p.c;ctx.fill();}}// 隨機生成坐標信息function randomP(w, y, count) {let arr = [];for (let i = 0; i < count; i++) {let obj = {x: Math.random() * w,y: Math.random() * y,r: Math.random() * 2.5,a: false,c: `rgba(${Math.random() *255},${Math.random() *255},${Math.random() *255}, ${Math.random() *1})`}arr.push(obj);}return arr}})(window)

參考資源

  1. AI助手【DeekSeek-R1(滿血版)】
  2. MDN-canvas:https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/canvas
  3. Can i use :https://caniuse.com/?search=canvas

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

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

相關文章

可視化提示詞(Prompt)在訓練過程中的優化過程:visualize_prompt_evolution

可視化提示詞(Prompt)在訓練過程中的優化過程:visualize_prompt_evolution 這個函數 visualize_prompt_evolution 的作用是可視化提示詞(Prompt)在訓練過程中的優化過程,通過對比每個訓練輪次(Epoch)的提示詞與初始提示詞的差異,直觀展示哪些Token被保留、哪些被修改…

2025 一帶一路暨金磚國家技能發展與技術創新大賽 第一屆“信創適配及安全管理賽項”樣題

2025 一帶一路暨金磚國家技能發展與技術創新大賽 第一屆“信創適配及安全管理賽項”樣題 模塊A-理論知識&#xff1a;模塊B-適配環境搭建&#xff1a;系統安裝與配置&#xff1a;DNS 服務配置&#xff1a;DNS 服務配置&#xff1a;CA 服務配置&#xff1a;Httpd 服務配置&#…

Qt Creator調用Python代碼

Qt Creator調用Python代碼 項目場景:現在我寫的Qt上位機,需要調用同事使用python寫的代碼,所以我需要一個整合,把同事的代碼融合進我的Qt工程里來。 所以,本篇記錄Qt Creator中調用Python的一種方法。 操作系統:windows 11 64位 Python使用的版本為 3.9.10,(安裝參…

【QQ音樂】sign簽名| data參數 | AES-GCM加密 | webpack(上)

1.目標 網址&#xff1a;https://y.qq.com/n/ryqq/toplist/26 切換榜單出現請求&#xff0c;可以看到sign和data是加密的 2.逆向分析 搜索sign: 可以看到sign P(n.data)&#xff0c;而n.data就是請求的加密data參數 data {"comm":{"cv":4747474,&qu…

uni-app(6):Vue3語法基礎下

1 列表渲染 1.1 在 v-for 里使用數組 v-for 指令可以實現基于一個數組來渲染一個列表。v-for 指令需要使用 item in items 形式的特殊語法&#xff0c;其中 items 是源數據數組&#xff0c;而 item 則是被迭代的數組元素的別名。 在 v-for 塊中&#xff0c;我們可以訪問所有父…

STM32之SPI——外部FLASH和RFID

一、SPI協議的原理與應用 基本概念 串行外設接口SPI&#xff08;Serial Peripheral Interface&#xff09;是由美國摩托羅拉公司最先推出的一種同步串行傳輸規范&#xff0c;也是一種單片機外設芯片串行外設擴展接口。該接口是一種高速、全雙工、同步的通信總線&#xff0c;并…

51c視覺~3D~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13954440 #SceneTracker 在4D時空中追蹤萬物&#xff01;國防科大提出首個長時場景流估計方法 本篇分享 TPAMI 2025 論文??SceneTracker: Long-term Scene Flow Estimation Network??&#xff0c;國防科大提出首…

cf2059B

原題鏈接&#xff1a;https://codeforces.com/contest/2059/problem/B 題目背景&#xff1a; 將一個長度為 n 的數組 a 劃分為 k 個數組&#xff0c;再將所有偶數索引的數組合并成 b 數組&#xff0c;定義代價為 的最小索引 i &#xff0c;可得到的最小代價為多少。 思路&am…

爬蟲到智能數據分析:Bright Data × Kimi 智能洞察亞馬遜電商產品銷售潛力

前言 電商數據分析在現代商業中具有重要的戰略價值&#xff0c;通過對消費者行為、銷售趨勢、商品價格、庫存等數據的深入分析&#xff0c;企業能夠獲得對市場動態的精準洞察&#xff0c;優化運營決策&#xff0c;預測市場趨勢、優化廣告投放、提升供應鏈效率&#xff0c;并通…

從解決一個分享圖片生成的歷史bug出發,詳解LayoutInflater和View.post的工作原理

問題背景 最近在項目中遇到一個問題&#xff1a;在檔口分享功能中&#xff0c;需要動態生成一個分享圖片。代碼是這樣寫的&#xff1a; // 項目中的代碼 val shareView LayoutInflater.from(thisStallMainActivityV1).inflate(R.layout.share_header_stall_main_layout, nul…

2.linux目錄切換命令:cd與pwd以及路徑與路徑符

cd 切換當前工作目錄 cd [linux路徑0] cd沒有選項,直接執行,只有參數.如果沒有參數,表示回到用戶的home目錄 pwd 無參,無選項,直接打印當前工作目錄的絕對路徑 路徑 相對路徑 以當前目錄為起點,路徑描述無需使用/開頭 # cd Desktop 絕對路徑 路徑描述需要以/開頭 cd…

摩爾條紋 原理以及matlab 實現

一、簡介 莫爾條紋的形成原理-CSDN博客 “莫爾”一詞源于法文“Moire”&#xff0c;其原本的含義是“波動”或者“起波紋的”。早在古代時期&#xff0c;人們便偶然發現&#xff0c;當把兩塊薄的絲綢織物相互疊加放置時&#xff0c;能夠看到一種呈現不規則形態的花紋。此后&a…

【海康USB相機被HALCON助手連接過后,MVS顯示無法連接故障。】

在Halcon里使用助手調用海康USB相機時&#xff0c;如果這個界面點擊了【是】 那么恭喜你&#xff0c;相機只能被HALCON調用使用&#xff0c;使用MVS或者海康開發庫&#xff0c;將查找不到相機 解決方式&#xff1a; 右鍵桌面【此電腦】圖標 ->選擇【管理】 ->選擇【設備…

數據治理是什么意思?數據治理平臺有哪些?

目錄 一、數據治理的概念 1. 數據治理的定義 2. 數據治理的目標 二、數據治理的實施流程 1. 規劃階段 2. 評估階段 3. 執行階段 4. 監控與評估階段 三、常見的數據治理平臺 1. FineDataLink 2. IBM InfoSphere Information Governance Catalog 四、總結 隨著企業業…

高效工具-tldr

喜歡使用命令操作的小伙伴&#xff0c;肯定會遇到一個問題&#xff0c;查看命令如何使用時&#xff0c;會列出一堆&#xff0c;特別是英文&#xff0c;看的直發懵。前段時間我也是研究git命令&#xff0c;也遇到了類似的問題。好在有大數據&#xff0c;幫我普及相關的知識。 在…

安卓添加設備節點權限和selinux訪問權限

# 1 修改設備節點權限及配置屬性設置節點值 ## 1.1 修改設備節點權限 ### 1.1.1 不會手動卸載的節點 在system/core/rootdir/init.rc中添加節點權限 在on boot下面添加 chown system system /sys/kernel/usb/host chmod 0664 /sys/kernel/usb/host ### 1.1.2 支持熱插拔的…

ssm學習筆記(尚硅谷) day1

創建新項目 maven的聚合 1. 標記父類項目 標簽<packaging>pom</packaging>表示將該項目標記為父類項目&#xff0c;必須添加。 以下是標簽<packing>的常見取值 groupId在pom.xml中&#xff0c;可以從pom.xml直接修改。 2. 通過<modules>添加子項目…

基于Java,SpringBoot,Vue,UniAPP醫院預約掛號買藥就診病例微信小程序系統設計

摘要 隨著醫療信息化的不斷推進以及“互聯網醫療”模式的廣泛普及&#xff0c;傳統醫院掛號流程中存在的排隊時間長、資源分配不均等問題日益凸顯&#xff0c;急需通過數字化手段加以解決。本研究設計并實現了一套基于Java、SpringBoot、Vue與UniAPP技術棧的醫院預約掛號微信小…

Axure項目實戰:運輸統計頁引入echarts實現高保真設計(JS代碼ctrl+c ctrl+v懂得來)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝!如有幫助請訂閱專欄! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 案例視頻: 數據統計引入echarts示例演示 課程主題:運輸統計頁引入echarts實現高保真設計 主要內容…