canvas实战之酷炫背景动画(二)

2023-11-04

系列文章
canvas实战之酷炫背景动画(一)
canvas实战之酷炫背景动画(二)
canvas实战之酷炫背景动画(三)
canvas实战之酷炫背景动画(四)
canvas实战之酷炫背景动画(五)
canvas实战之酷炫背景动画(六)
canvas实战之酷炫背景动画(七)

hello,今天赶了一天的路,刚刚闲停下来,本节带着大家梳理一下上一节的实现思路

首先分析博客背景效果,其中无非就是点与线,再加了一些运动效果,所以我们自然要从点入手,无点何以有线。
再分析每次刷新界面时点的位置是随机的,个数也应当是用户所设定的,点的大小应该也由用户设定。所以我们应该随机到一个这样的数据格式

[
	[x1,y1,r1],
	[x2.y2,r2],
	....
	[xn,yn,rn]
]

或者json格式的数据也可以,个人习惯了二维数组。

下面就是根据现有分析编写的代码

<script type="text/javascript">
class FwhfPointLine{
	constructor(pointNum,pointR){
		this.pointNum = pointNum;
		this.pointR = pointR;
		this.width = window.innerWidth;
		this.height = window.innerHeight;
		this.pointArr = [];
		this.canvas = '';
		this.context = '';
		this.init();
	}
	init(){
		document.body.innerHTML += "<canvas id='fwhfCanvas'></canvas>";
		this.canvas = document.getElementById('fwhfCanvas');
		this.canvas.width = this.width;
		this.canvas.height = this.height;
		this.canvas.style.position = "fixed";
		this.canvas.style.top = 0;
		this.canvas.style.left = 0;
		this.canvas.style.pointerEvents = 'none';
		this.context = this.canvas.getContext('2d');
		for(var i = 0 ; i < this.pointNum ; i++){
			this.pointArr[i] = [this.rand(this.pointR[1],this.width-this.pointR[1]),this.rand(this.pointR[1],this.height-this.pointR[1]),this.rand(this.pointR[0],this.pointR[1])];
		}
		for(var i = 0 ; i < this.pointNum ; i++){
			this.context.beginPath();
			this.context.arc(this.pointArr[i][0],this.pointArr[i][1],this.pointArr[i][2],0,2*Math.PI);
			this.context.fill();
			this.context.closePath();
		}
	}
	rand(min,max){
		var c = max - min + 1;
		return Math.floor(Math.random() * c + min);
	}
}
/*
*pointeNum 随机的点的个数 number 
*pointR 点的半径 array [minR,maxR] 推荐[0.5,1] 
*/
new FwhfPointLine(50,[0.5,1]); 
</script>

init()中首先创建canvas画布,并配置canvas画布的基本样式(this.canvas.style.pointerEvents = ‘none’;实现点击穿透,防止canvas遮挡其他页面元素造成事件失效),及获取canvas绘图环境。 最后就是循环遍历生成需要的数据格式并绘制在canvas上。
rand函数是随机数的封装,不做过多解释。

ok,接下来就是实现给点添加颜色。并让点动起来。
需求数据格式

[
	[x1,y1,r1,colorIndex1,speedX1,speedY1],
	[x2.y2,r2,colorIndex2,speedX2,speedY2],
	....
	[xn,yn,rn,colorIndexn,speedXn,speedYn]
]
<script type="text/javascript">
class FwhfPointLine{
	constructor(pointNum,pointR,pointColor,pointSpeed){
		this.pointNum = pointNum;
		this.pointR = pointR;
		this.pointColor = pointColor;
		this.pointColorLength = pointColor.length;
		this.pointSpeed = pointSpeed;
		this.width = window.innerWidth;
		this.height = window.innerHeight;
		this.pointArr = [];
		this.timer = null;
		this.canvas = '';
		this.context = '';
		this.init();
	}
	init(){
		document.body.innerHTML += "<canvas id='fwhfCanvas'></canvas>";
		this.canvas = document.getElementById('fwhfCanvas');
		this.canvas.width = this.width;
		this.canvas.height = this.height;
		this.canvas.style.position = "fixed";
		this.canvas.style.top = 0;
		this.canvas.style.left = 0;
		this.canvas.style.pointerEvents = 'none';
		this.context = this.canvas.getContext('2d');
		for(var i = 0 ; i < this.pointNum ; i++){
			this.pointArr[i] = [this.rand(this.pointR[1],this.width-this.pointR[1]),this.rand(this.pointR[1],this.height-this.pointR[1]),this.rand(this.pointR[0],this.pointR[1]),this.rand(0,this.pointColorLength-1),this.rand(this.pointSpeed[0],this.pointSpeed[1]),this.rand(this.pointSpeed[0],this.pointSpeed[1])];
		}
		this.Repaint();
	}
	draw(){
		for(var i = 0 ; i < this.pointNum ; i++){
			this.context.beginPath();
			this.context.fillStyle = this.pointColor[this.pointArr[i][3]];
			this.context.arc(this.pointArr[i][0],this.pointArr[i][1],this.pointArr[i][2],0,2*Math.PI);
			this.context.fill();
			this.context.closePath();
			
			if(this.pointArr[i][0] + this.pointArr[i][4] >= this.canvas.width){
				this.pointArr[i][0] = this.canvas.width;
				this.pointArr[i][4] *= -1;
			}else if(this.pointArr[i][0] + this.pointArr[i][4] <= 0){
				this.pointArr[i][0] = 0;
				this.pointArr[i][4] *= -1;
			}else{
				this.pointArr[i][0] += this.pointArr[i][4];
			}

			if(this.pointArr[i][1] + this.pointArr[i][5] >= this.canvas.height){
				this.pointArr[i][1] = this.canvas.height;
				this.pointArr[i][5] *= -1;
			}else if(this.pointArr[i][1] + this.pointArr[i][5] <= 0){
				this.pointArr[i][1] = 0;
				this.pointArr[i][5] *= -1;
			}else{
				this.pointArr[i][1] += this.pointArr[i][5];
			}
		}
	}
	Repaint(){
		this.timer = setInterval(()=>{
			this.context.clearRect(0,0,this.width,this.height);
			this.draw();
		},20)
	}
	rand(min,max){
		var c = max - min + 1;
		return Math.floor(Math.random() * c + min);
	}
}
/*
*pointeNum 随机的点的个数 number 
*pointR 点的半径 array [minR,maxR] 推荐[0.5,1] 
*pointColor 点的颜色 array [color1,color2,...] 
*pointSpeed 点的速度 array [speedX,speedY] 
*/
new FwhfPointLine(50,[0.5,1],['rgb(200,0,0)','rgb(0,200,0)','rgb(0,0,200)'],[-3,3]); 
</script>

主要利用定时器定时清空画布并重新绘制来实现远点运动效果
this.context.clearRect(0,0,this.width,this.height);
this.draw();

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

canvas实战之酷炫背景动画(二) 的相关文章

  • 如何将多个画布元素放入一个画布元素中?

    我有多个由 JavaScript 创建的画布元素 我的问题是 如何将多个画布元素放入一个画布元素 干得好 JSfiddle http jsfiddle net Allendar UqxCY 它会抓取每个画布并将它们做成 PNG 的 访问缓冲
  • 我将 X Y Z 坐标转换为屏幕 X Y 坐标有什么问题吗?

    我正在制作 3D 空间中弹跳的球体的 HTML5 Canvas 演示 这非常简单 每个球都有 X Y 和 Z 坐标 然后 这些坐标将转换为我在此处阅读的屏幕 X 和 Y 坐标 http answers google com answers
  • 如何使用 HTML5 Javascript Canvas 获取三个碰撞形状的交集并删除不碰撞的部分?

    我最近专门针对 KonvaJs 发布了类似的问题here https stackoverflow com questions 64603077 how can i get the intersection of three shapes c
  • Chartjs + Angular6 未显示图表或任何错误

    我正在尝试以角度实现chart js 编写了一个简单的代码来在html上显示图表 但是页面上没有输出 也没有错误 我不明白问题出在哪里以及为什么显示图表失败 堆栈闪电战 https stackblitz com edit angularch
  • 导出具有高质量图像的画布的最佳实践是什么?

    我需要你的帮助 我解释一下我的情况 我正在使用 Fabric js 库在我的应用程序中放置形状 文本等 我的画布尺寸为 1000x1000 像素 约 26 45x26 45 厘米 我有一个图像上传脚本 仅用于上传高质量图像 例如 300 d
  • jsPlumb:如何使流程图连接器避免元素相交?

    是否可以使 jsPlumb Flowchart 连接器不交叉可连接的项目或指定元素 在示例中 具有 item 类的元素 默认流程图行为 想要的结果 这是我尝试过的 http jsfiddle net CcfTD 1 http jsfiddl
  • 窗口调整大小事件上的响应式画布

    我是画布概念的新手 我正在尝试使用 D3 js 绘制画布 我想让画布根据窗口屏幕大小进行响应 function onResize var element document getElementsByTagName canvas 0 var
  • 如何计算android中位图擦除区域的百分比?

    我是安卓新手 我正在制作一个可以使用手指擦除画布上的位图的应用程序 像手指画橡皮擦之类的东西 我想计算擦除区域的百分比 例如 60 已从完整图像中擦除 请帮助我做到这一点 提前致谢 我尝试了一些方法 它总是给我 0 它不起作用 请参阅该方法
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • 在 HTML5 中堆叠多个画布

    我试图使用相互堆叠的四块画布 但除了顶部画布的内容外 它们的内容不会显示 我按照我希望它们显示的顺序将 z index 值放入其中 但只有最上面的一个显示内容 它们的位置是绝对的 z 索引是 1 2 3 和 4 是否还有其他原因导致它们不显
  • canvas.getContext('2D') 返回空值

    我创建了一个画布并将其命名为getContext 方法 但它返回null为上下文 这是我使用的代码 我在控制台中得到了这个
  • Chrome 扩展屏幕截图部分图像裁剪适用于 Retina 显示屏

    我制作了一个 chrome 扩展 它捕获网站的单个元素 div 我使用 chrome tabs gt captureVisibleTab 来制作屏幕截图 然后 使用元素 div 的坐标 x y 和大小 宽度 高度 裁剪屏幕截图 这对我来说在
  • WPF:如何避免图像超出 Canvas 的边界?

    我有一个画布作为图像查看器 它的背景用于放置图像 我想在其上面放置另一个图像 所以 场景是这样的
  • Canvas GetImageData() / PutImageData() 在移动设备上的性能很糟糕

    我正在做一个小型 HTML5 游戏 在地图开头加载精灵时 我使用 GetImageData 循环遍历所有图像 PutImageData 进行一些处理 这在我的电脑上运行得非常好 但是在我的手机上却慢得可怕 PC 5 6 ms iPhone
  • 鼠标位置到等距图块(包括高度)

    努力将鼠标的位置转换为网格中图块的位置 当一切平坦时 数学看起来像这样 this position x Math floor pos y 240 24 pos x 320 48 this position y Math floor pos
  • JavaFX 块 GUI 中的繁重渲染任务(在画布中)

    我想创建一个在画布中执行许多渲染的应用程序 正常的 JavaFX 方式会阻止 GUI 在下面的应用程序代码中按下按钮确实很困难 使用 Java 8 运行 我在网上搜索了一下 但JavaFX不支持后台渲染 所有渲染操作 如中风线 都存储在缓冲
  • 将事件绑定到画布上的形状

    如何将事件绑定到画布上绘制的形状 我以为这会起作用 但我收到错误
  • 如何将画布转换为图像以上传到烧瓶?

    好吧 我正在尝试将调整大小的画布图像作为文件上传到 Flask 首先我尝试使用canvas toDataURL 将其转换为 base64 字符串 然后尝试使用以下命令将其作为图像上传formdata使用AJAX 就没那么幸运了 然后我尝试使
  • HTML5 中填充笔划的透明度

    我正在 HTML5 中开发一个涂鸦应用程序 我想做一种桶功能 这个想法是绘制一条路径 它将被关闭并用选定的颜色 描边的颜色 填充 它对于纯色效果很好 但如果我想要透明的描边和填充 我会遇到这个问题 所发生的情况是填充完成到笔划的中间 路径的

随机推荐

  • 信息安全建设之安全平台搭建

    我们在进行网络安全层面体系建设的时候 需要涉及到很多安全产品 UTM 统一威胁管理 称为集成威胁管理 是安全措施之一 我们的目标是通过整合从而实现高效运营 而不是威胁组织网络的各种风险和管理设备 它不仅仅是针对外部组织的病毒防护和各种不断演
  • 【排序算法】插入排序(C语言)

    排序算法 插入排序 目录 一 插入排序的基本思想 二 插入排序的单趟排序 1 直接插入排序 2 二分法插入排序 三 插入排序的特点和效率 1 插入排序的特点 2 插入排序的效率 一 插入排序的基本思想 直接插入排序是一种简单的插入排序法 对
  • MAGMA

    LAPACK GPU MAGMA 使用gotoblas2 CUDA安装magma1 1 0 227 准备阶段 1 安装CUDA 2安装cpu BLAS 3安装LAPACK 安装过程 1 按照README文档进行安装 2 在make inc
  • 一份超详细的SpringMVC4常用知识清单!

    文章目录 1 SpringMVC 概述 2 使用 RequestMapping 映射请求 2 1 映射请求参数 请求方法或请求头 2 2 Maping支持通配符 3 PathVariable 映射 URL 绑定的占位符 4 REST 5 请
  • SVN查看文件的修改记录

    命令查看某个文件的修改历史 修改完某个文件后 要看改动的话使用如下命令 svn diff xxx xxx xx m svn diff 文件路径 如果要查看某次历史的提交的所有修改记录的话使用如下命令 svn diff c r12347
  • 基本类型题小结

    1 java基本数据类型 答 byte short int long float double char boolean 2 java数组声明方式 答 第一种方式 int a1 new int 1 2 3 直接声明并赋值 直接声明赋值数组是
  • python读取excel文件的单元格内容,去掉内容前个text

    打印的内容前有个text 对应的代码为 这个表示的是它内容的属性 加入你print的这个对象叫cell a 解决方法 可直接取中间的元素 cell a value就可以了 结果呈现
  • 【云原生之kubernetes实战】在k8s环境下部署OneNav个人书签工具

    云原生之kubernetes实战 在k8s环境下部署OneNav个人书签工具 一 OneNav介绍 1 OneNav简介 2 OneNav特点 二 检查本地k8s环境 1 检查工作节点状态 2 检查系统pod状态 三 docker部署One
  • 小朋友崇拜圈

    9 3 4 2 5 3 8 4 6 9 4 include
  • [SQL

    目录 一 环境安装 二 环境配置 三 编写程序 一 环境安装 1 PostgreSQL10 23 X64 应该哪个版本都行 1 由于使用 EXEC SQL 这种嵌入方式已经非常古老 近些年的Mysql和SQL Server都已经不支持这种嵌
  • android 5.1 非STR待机流程

    android在长按Power键 手机或pad 或按下电源键 电视 会进入待机状态 下面分析一下非STR待机流程 待机分STR和非STR待机 STR待机是为了实现快速开关机 提高开机速度 android自身支持STR OEM可以根据自身需要
  • 1g服务器跑项目,云服务器1核1g跑Java项目

    云服务器1核1g跑Java项目 内容精选 换一换 简要介绍Tomcat服务器是一个免费的开放源代码的Web应用服务器 属于轻量级应用服务器 在中小型系统和并发访问用户不多等场合下被普遍使用 是开发和调试JSP程序的首选 语言 Java一句话
  • @Transactional事务嵌套,失败情况分析

    Transactional事务失败情况分析 使用声明式注解事务 Spring扫描到带有 Transactional的方法 对其进行代理增强 AOP切面 调用方法前begin 方法结束后commit 当调用了一个未被增强的方法A 无事务注解
  • 多线程设计模式-保护性暂停模式

    利用wait和notify方法实现 有这么一个场景 我们有两个线程 其中一个线程需要等待获取另外一个线程的执行结果 之气那我们是使用join方法可以实现 现在我们不用jon来实现 package com dongmu test 多线程设计宝
  • 上半年亏损之下,卫龙第三次冲刺港股IPO

    据港交所文件显示 今年6月27日卫龙美味通过港交所上市聆听 11月24日 卫龙更新了聆听后资料集 若此次上市成功 卫龙将成为港股乃至国内辣条第一股 此前 卫龙已经两度申请了赴港IPO 但都功败垂成 对于卫龙前两次未能成功上市的原因外界众说纷
  • 自动控制原理实验四 系统频率特性测量

    实验源码已经上传CSDN了 需要的可直接下载 链接 https download csdn net download weixin 53129688 87694703 实验内容 1 模拟电路图及系统结构图分别如图4 2和图4 3 图4 2
  • 第十四届蓝桥杯模拟赛(第三期)

    目录 1 最小数 2 Excel 列名 3 年月日的和 4 取数 5 连通分块 6 星期天数 7 信号塔 8 清理水草 9 滑行 10 序列最小值 1 最小数 问题描述 请找到一个大于 2022 的最小数 这个数转换成十六进制之后 所有的数
  • ITK(Insight Tool Kit) 医疗影像数据后处理软件模块使用和算法01

    最近在研究3D 2D比如 CT和X ray透视 的配准方法 其中很重要的一个大算法就是做DRR digitally reconstruction radiography 简单的说就是用CT数据实现X ray的效果 进而和术中X ray的片子
  • 再次飙升GitHub榜首!这份“保姆级”的SpringBoot笔记,不服不行

    Spring Boot 延续了 Spring 框架的核心思想 IOC 和 AOP 简化了应用的开发和部署 通过少量的代码就能创建一个独立的 产品级别的 Spring 应用 在继承了Spring 一切优点的基础上 其最大的特色就是简化了Spr
  • canvas实战之酷炫背景动画(二)

    系列文章 canvas实战之酷炫背景动画 一 canvas实战之酷炫背景动画 二 canvas实战之酷炫背景动画 三 canvas实战之酷炫背景动画 四 canvas实战之酷炫背景动画 五 canvas实战之酷炫背景动画 六 canvas实