满天星之canvas实现【canvas】

news2025/7/21 22:53:57

展示

在这里插入图片描述

文章目录

    • 展示
    • 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 + jb
        item.a = true
        if (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 + jb
        item.a = true
        if (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.coloradmin.cn/o/2391705.html

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

相关文章

【开源解析】基于PyQt5+Folium的谷歌地图应用开发:从入门到实战

&#x1f310;【开源解析】基于PyQt5Folium的谷歌地图应用开发&#xff1a;从入门到实战 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热情源自每…

在 Ubuntu 22.04 LTS 上离线安装 Docker

在 Ubuntu 22.04 LTS 上离线安装 Docker 一、准备工作 1.1 获取目标系统信息 在目标 Ubuntu 22.04 LTS 系统上&#xff0c;先执行以下命令确认架构信息&#xff1a; uname -m lsb_release -a一般返回如下信息&#xff1a; 1.2 需要一台可联网的机器 准备一台可以连接互联网…

python调用langchain实现RAG

一、安装langchain 安装依赖 python -m venv env.\env\Scripts\activatepip3 install langchainpip3 install langchain-corepip3 install langchain-openaipip3 install langchain-communitypip3 install dashscopepip3 install langchain_postgrespip3 install "psyc…

触控精灵 ADB运行模式填写电脑端IP教程

•ADB模式&#xff0c;如果你手机已经root则可以直接运行&#xff0c;无需安装电脑端。 •ADB模式&#xff0c;如果你手机没有root&#xff0c;那你可以windows电脑下载【极限投屏】软件&#xff0c;然后你的手机和电脑的网络要同一个wifi&#xff0c;然后把你电脑的ip地址填写…

uniapp|实现多端图片上传、拍照上传自定义插入水印内容及拖拽自定义水印位置,实现水印相机、图片下载保存等功能

本文以基础视角,详细讲解如何在uni-app中实现图片上传→水印动态编辑→图片下载的全流程功能。 目录 引言应用场景分析(社交媒体、内容保护、企业素材管理等)uniapp跨平台开发优势核心功能实现​图片上传模块多来源支持:相册选择(`uni.chooseImage`)与拍照(`sourceType:…

linux有效裁剪视频的方式(基于ffmpeg,不改变分辨率,帧率,视频质量,不需要三方软件)

就是在Linux上使用OBS Studio录制一个讲座或者其他视频&#xff0c;可能总有些时候会多录制一段时间&#xff0c;但是如果使用剪映或者PR这样的工具在导出的时候总需要烦恼导出的格式和参数&#xff0c;比如剪映就不支持mkv格式的导出&#xff0c;导出成mp4格式的视频就会变得很…

服务器密码安全运维解决新思路:凭据管理SMS+双因素SLA认证结合的方案

引言&#xff1a;云服务器安全成本困局 在云计算渗透率突破60%的今天&#xff0c;中小企业正面临严峻的安全悖论&#xff1a;某权威机构数据显示&#xff0c;72%的云上数据泄露事件源于凭据管理不当&#xff0c;而传统安全解决方案的采购成本往往超过中小企业年利润的8%。这种…

论文阅读笔记——In-Context Edit

ICEdit 论文阅读笔记 指令图像编辑现有方法的局限&#xff1a; 微调类方法&#xff08;InstructPix2Pix、Emu Edit、 Ultra Edit&#xff09;&#xff1a;需要大规模数据和算力、精度高但效率低且泛化性低&#xff1b;免训练方法&#xff08;Prompt-to-Prompt、 StableFlow&am…

【后端高阶面经:MongoDB篇】41、MongoDB 是怎么做到高可用的?

一、MongoDB高可用核心架构&#xff1a;副本集&#xff08;Replica Set&#xff09;设计 &#xff08;一&#xff09;副本集角色与拓扑结构 1. 三大核心角色 角色职责描述资源占用选举权重数据存储Primary唯一接收写请求的节点&#xff0c;将操作日志&#xff08;Oplog&…

DMBOK对比知识点整理(4)

1.常见数据质量维度 常见数据质量维度(DMBOK-P353)质量维度

day12 leetcode-hot100-21(矩阵4)

240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; 1.暴力法O(m*n) 思路&#xff1a;两层for循环即可。 2.二分查找O(m*logn) 思路&#xff1a;每行都用二分查找,因为每行都是排好序的 class Solution {public boolean searchMatrix(int[][] matrix, int targe…

提问:鲜羊奶是解决育儿Bug的补丁吗?

在育儿这个"系统工程"中&#xff0c;过度提醒就像冗余代码&#xff1a;"快写作业"&#xff08;重复调用&#xff09;、"多穿衣服"&#xff08;异常捕获&#xff09;、"别玩手机"&#xff08;进程阻断&#xff09;。羊大师技术育儿实验…

关于数据仓库、数据湖、数据平台、数据中台和湖仓一体的概念和区别

我们谈论数据中台之前&#xff0c; 我们也听到过数据平台、数据仓库、数据湖、湖仓一体的相关概念&#xff0c;它们都与数据有关系&#xff0c;但他们和数据中台有什么样的区别&#xff0c; 下面我们将围绕数据平台、数据仓库、数据湖和数据中台的区别进行介绍。 一、相关概念…

什么是可重组机器人?

可重组机器人是一种具有高度灵活性和适应性的新型机器人系统&#xff0c;能够根据不同任务需求&#xff0c;快速改变自身结构和功能。下面我从概念、结构、特点、应用领域、发展趋势等方面&#xff0c;为你详细介绍&#xff1a; 概念&#xff1a;可重组机器人是由多个标准化、模…

4、docker compose

1、介绍 Docker Compose 是 Docker 官方提供的容器编排工具&#xff0c;用于简化多容器应用的开发、部署和管理。它通过声明式配置文件&#xff08;YAML格式&#xff09;定义容器化应用的服务、网络、存储等组件及其依赖关系&#xff0c;使用户能够通过单一命令快速启动、停止…

SQL里几种JOIN连接

数据信息&#xff1a; 员工表EMP 部门表DEPT 一、INNER JOIN&#xff08;内连接&#xff09; 作用&#xff1a;只返回两个表中完全匹配的行&#xff0c;相当于取交集。 场景&#xff1a;查询「有部门的员工信息」。 示例&#xff1a; SELECT 员工.姓名, 部门.部门名称 FR…

基于通义千问的儿童陪伴学习和成长的智能应用架构。

1.整体架构概览 我们的儿童聊天助手将采用典型的语音交互系统架构,结合大模型能力和外部知识库: 2. 技术方案分解 2.1. 前端应用/设备 选择: 移动App(iOS/Android)、Web应用,或者集成到智能音箱/平板等硬件设备中。技术栈: 移动App: React Native / Flutter (跨平台…

LVS-DR 负载均衡群集

目录 一、LVS-DR集群 1、LVS-DR 工作原理 2、数据包流向分析 3、LVS-DR 模式特点 二、直接路由模式&#xff08;LVS-DR&#xff09; 1、准备案例环境 2、配置负载调度器&#xff08;101&#xff09; &#xff08;1&#xff09;配置虚拟IP 地址&#xff08;VIP&#xff…

[Dify] 如何应对明道云API数据过长带来的Token超限问题

在集成明道云与大型语言模型(LLM)如ChatGPT或本地部署的Dify时,开发者经常会面临一个核心问题:API获取的数据太长,超出LLM支持的Token数限制,导致无法直接处理。本文将深入探讨这个问题的成因,并提供几种可行的解决方案,包括分段处理、外部知识库构建等策略。 明道云AP…

eNSP企业综合网络设计拓扑图

1.拓扑图 2.拓扑配置 此拓扑还有一些瑕疵&#xff0c;仅做参考和技术提升使用。 想要配置的可以关注下载 大型网络综合实验拓扑图&#xff08;eNSP&#xff09;资源-CSDN文库