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

2023-11-19

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

相信大家都看到了博客中的背景动画,推荐你们一款插件canvas-nest.js
npm install canvas-nest.js下载后将文件夹中的node_modules\canvas-nest.js\dist中的canvas-nest.js取出引入到html页面中,切记建议放在body标签中的最下方

示例

<script type="text/javascript" color="0,0,255" opacity='0.7' zIndex="2" count="99" src="canvas-nest.js"></script>

color: 线条颜色, 默认: ‘0,0,0’ ;三个数字分别为(R,G,B),注意用,分割
pointColor: 交点颜色, 默认: ‘0,0,0’ ;三个数字分别为(R,G,B),注意用,分割
opacity: 线条透明度(0~1), 默认: 0.5
count: 线条的总数量, 默认: 150
zIndex: 背景的z-index属性,css属性用于控制所在层的位置, 默认: -1

既然学习了canvas自然要尝试自行封装,下方是我的初步封装,后期再进行优化添加功能等,下节先进行代码解读
效果图如下:
请添加图片描述
源代码如下:

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
</body>
<script type="text/javascript">
class fwhfPointLine{
	constructor(pointNum,minR,maxR,pointColor,pointSpeed,lineColor,lineShowWidth){
		this.pointNum = pointNum;
		this.fwhfPointArr = [];
		this.minR = minR;
		this.maxR = maxR;
		this.pointColor = pointColor;
		this.pointSpeed = pointSpeed;
		this.lineColor = lineColor;
		this.lineShowWidth = lineShowWidth;
		this.x = 0;
		this.y = 0;
		this.canvas = '';
		this.context = '';
		this.timer = '';
		this.init();
	}
	init(){
		document.body.innerHTML += '<canvas id="fwhfCanvas"></canvas>';
		this.canvas = document.getElementById('fwhfCanvas');
		this.canvas.width = window.innerWidth;
		this.canvas.height = window.innerHeight;
		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.fwhfPointArr.push([this.rand(1,this.canvas.width-1),this.rand(1,this.canvas.height-1),this.rand(this.minR,this.maxR),this.pointColor[this.rand(0,this.pointColor.length-1)],this.rand(this.pointSpeed[0],this.pointSpeed[1]),this.rand(this.pointSpeed[0],this.pointSpeed[1])])
		}
		window.onmousemove = (e)=>{
			this.x = e.clientX;
			this.y = e.clientY;
		}
		this.fwhfPointTimer();
	}
	fwhfPoint(){
		for(var i = 0 ; i < this.fwhfPointArr.length ; i++){
			this.context.beginPath();
			this.context.fillStyle = this.fwhfPointArr[i][3];
			this.context.arc(this.fwhfPointArr[i][0],this.fwhfPointArr[i][1],this.fwhfPointArr[i][2],0,2*Math.PI);
			this.context.fill();
			this.context.closePath();

			if(this.fwhfPointArr[i][0] + this.fwhfPointArr[i][4] >= this.canvas.width){
				this.fwhfPointArr[i][0] = this.canvas.width;
				this.fwhfPointArr[i][4] *= -1;
			}else if(this.fwhfPointArr[i][0] + this.fwhfPointArr[i][4] <= 0){
				this.fwhfPointArr[i][0] = 0;
				this.fwhfPointArr[i][4] *= -1;
			}else{
				this.fwhfPointArr[i][0] += this.fwhfPointArr[i][4];
			}

			if(this.fwhfPointArr[i][1] + this.fwhfPointArr[i][5] >= this.canvas.height){
				this.fwhfPointArr[i][1] = this.canvas.height;
				this.fwhfPointArr[i][5] *= -1;
			}else if(this.fwhfPointArr[i][1] + this.fwhfPointArr[i][5] <= 0){
				this.fwhfPointArr[i][1] = 0;
				this.fwhfPointArr[i][5] *= -1;
			}else{
				this.fwhfPointArr[i][1] += this.fwhfPointArr[i][5];
			}
		}
		for(var i = 0 ; i < this.fwhfPointArr.length ; i++){
			for(var j = 0 ; j < this.fwhfPointArr.length ; j++){
				if(Math.abs(this.fwhfPointArr[j][0]-this.fwhfPointArr[i][0])<this.lineShowWidth && Math.abs(this.fwhfPointArr[j][1]-this.fwhfPointArr[i][1])<this.lineShowWidth){
					this.context.beginPath();
					this.context.strokeStyle = this.lineColor;
					this.context.moveTo(this.fwhfPointArr[j][0]-this.fwhfPointArr[j][2]/2,this.fwhfPointArr[j][1]-this.fwhfPointArr[j][2]/2);
					this.context.lineTo(this.fwhfPointArr[i][0]-this.fwhfPointArr[i][2]/2,this.fwhfPointArr[i][1]-this.fwhfPointArr[i][2]/2);
					this.context.stroke();
					this.context.closePath();
				}
			}
			if(Math.abs(this.fwhfPointArr[i][0]-this.x)<this.lineShowWidth && Math.abs(this.fwhfPointArr[i][1]-this.y)<this.lineShowWidth){
				this.context.beginPath();
				this.context.strokeStyle = this.lineColor;
				this.context.moveTo(this.fwhfPointArr[i][0]-this.fwhfPointArr[i][2]/2,this.fwhfPointArr[i][1]-this.fwhfPointArr[i][2]/2);
				this.context.lineTo(this.x,this.y);
				this.context.stroke();
				this.context.closePath();
			}
		}
	}
	fwhfPointTimer(){
		this.fwhfPoint();
		this.timer = setInterval(()=>{
			this.context.clearRect(0,0,this.canvas.width,this.canvas.height);
			this.fwhfPoint();
		},20);
	}
	rand(min,max){
		var c = max - min + 1;
		return Math.floor(Math.random() * c + min) == 0 ? 1 :  Math.floor(Math.random() * c + min);
	}
}
/*
*new fwhfPointLine(pointNum,minR,maxR,pointColor,pointSpeed);
*pointNum 参数一 原点个数
*minR	原点最小半径	推荐0.5
*maxR 	原点最大半径	推荐1
*pointColor 原点颜色
*pointSpeed 运动速度
*lineColor 线条颜色
*lineShowWidth 出现线条距离
*/
new fwhfPointLine(100,0.5,1,['red','green','blue'],[-2,2],'pink',100);		

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

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

  • IE 和 Edge 上绘制图像时出现 IndexSizeError

    我发现某些代码在 Internet Explorer 和 Edge 中失败 但在 Chrome 和 Firefox 中似乎可以完美运行 var image document getElementById myImage var canvas
  • 使 JavaScript 画布矩形可点击

    我正在创建一个简单的计算器 Here http startupsandfinance com online calculator html这是 我几乎完成了基本设计 但我对如何使按钮可点击感到困惑 一个技巧可能是为每个按钮创建一个 div
  • 在 ReportLab 中向画布元素添加超链接的最简单方法是什么?

    我正在使用 ReportLab 使用 Python 制作 pdf 我想向画布添加一个形状 并让该形状充当超链接 使以下示例中的矩形链接到 google com 的最简单方法是什么 from reportlab pdfgen import c
  • 在 SVG 中使用变换模拟枢轴旋转

    我在 SVG 中有一个矩形 需要从特定点绕轴旋转 我能想到的最好方法是变换到枢轴的 xy 旋转角度 然后再次变换 问题是第二个变换的 xy 我认为它会在某种程度上采用 cos 和 sin 只是不确定在哪里或为什么 会旋转 90度到 也许我以
  • 使用 PixelWriter 在 JavaFX Canvas 上进行透明绘图

    有谁知道为什么使用drawImage 在Canvas上进行透明度绘制工作得很好 但在PixelWriter上却根本不起作用 我最初认为这可能与画布 上下文上的混合或其他模式 设置有关 但还没有任何运气 我需要每个像素的可变透明度 而不是整个
  • HTML Canvas:如何绘制翻转/镜像图像?

    当我在 HTML 画布上绘制图像时 我试图翻转 镜像图像 我发现一个游戏教程显示了角色必须面对的每个方向的精灵表 但这对我来说似乎不太正确 特别是因为每个框架都有不同的尺寸 实现这一目标的最佳技术是什么 我尝试致电setScale 1 1
  • 如何检测形状是否被单击(HTML5 画布)?

    我正在使用画布绘制不同的形状 如矩形 三角形 六边形等lineTo方法如这个博客 http blog riacode in 2011 03 03 drawing regular polygons in html5 canvas 我只是想要一
  • 有什么方法可以快速确定浏览器是否支持启用 CORS 的图像而不污染浏览器?

    是否有一个快速测试来确定浏览器是否支持启用 CORS 的图像 并且在其上绘制时不会污染画布 我知道 Chrome 15 支持此功能 Firefox 9Beta 但不支持 Firefox 8 Safari 不支持 IE9 不支持 但必须有一个
  • 是否可以像 html 视频元素一样将流作为源添加到 html canvas 元素?

    根据MDN The HTMLMediaElement https developer mozilla org en US docs Web API HTMLMediaElement界面添加到HTMLElement属性 支持基本媒体相关功能所
  • SVG 在 Firefox 中渲染得很糟糕

    我正在制作带有滑动轮播的信息图表 li 我认为 尽管 FF 中 SVG 的错误已得到解决 但 SVG 在 Firefox 中显示为像素化 有人能看到这个问题的解决办法吗 URL http weaver wp weavertest com r
  • 如何在 html 5 画布上旋转单个对象?

    我试图弄清楚如何在 html 5 画布上旋转单个对象 例如 http screencast com t NTQ5M2E3Mzct http screencast com t NTQ5M2E3Mzct 我希望每一张卡都能以不同的角度旋转 到目
  • JavaScript 原型继承和 html canvas

    我是一名 Ruby 开发人员 最终决定认真学习 JavaScript 所以我买了一些书 开始深入研究 但当我试图理解原型继承时 我很快就陷入了困境 这本书的例子之一如下 给定一个 Shape 其原型有一个绘制方法 以及两个子形状 一个 Tr
  • WPF画布性能-children.add调用多次

    我在长画布上绘制了很多线条 想想条形图 并对其性能进行了相当好的调整 使用低级几何类并冻结它们等 这极大地提高了性能 但仍然需要几秒钟将几千个项目加载到画布中 我对应用程序进行了性能分析 看起来每次调用都花费了很大一部分时间canvas c
  • 即使光标位于画布之外也会调用 MouseMove 事件

    我不知道我的代码或 WPF 是否有问题 但问题是 我想创建一个小程序 您可以在其中用光标在画布上绘图 我有一个简单的 WPF 窗口
  • 如何在android中画一条曲线?

    我是 Android 新手 正在开发一个关于绘制线条的示例项目 我想画一条连接两点的曲线或高架线 x1 y1 and x2 y2 我试过canvas drawArc 方法 但是RectF内的值drawArc方法只是圆的 x y 中心点 它在
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • 以编程方式更改 StackPanel 在 Canvas 上的位置

    我在画布上有堆栈面板 堆栈面板有
  • Html5画布最热门的任意形状

    我正在尝试开发可以在画布中渲染图像和文本的程序 我尝试处理画布中图像的点击 但它适用于可矩形图像 我的问题 您是否知道处理单击画布中图像的可见部分 非透明部分 的解决方案或框架 我正在寻找 ActionScript hitTestObjec
  • 如何清除画布元素中的多边形区域?

    我使用过clearRect函数 但没有看到多边形的等效函数 我天真地尝试过 ctx fillStyle transparent ctx beginPath ctx moveTo 0 0 ctx lineTo 100 50 ctx lineT
  • 使用渐变获取颜色条中特定位置的颜色值

    我生成了一个带有 CSS3 样式的渐变颜色条 fiddle http jsfiddle net eDEWk 现在想要该颜色条中特定位置的颜色值 通过 x 和 y 坐标 据我所知 没有直接的方法可以做到这一点 我看到两个选择 在 JavaSc

随机推荐

  • Java基础之String类型详解

    目录 1 简介 2 字符串的比较 3 String的实例化方式 1 直接赋值方式 2 构造方法实例化 4 String对象 常量 池 5 字符串修改 6 String类常用方法 1 字符串查找 2 字符串替换 3 字符串拆分 4 字符串截取
  • 【ReactiveX】Observable 对象(译)

    更多内容 欢迎关注作者博客 http www china10s com blog p 475 Observable 对象 在 ReactiveX 中 一个观察者向 Observable 对象订阅消息 然后这个观察者将会响应 Observab
  • 区块链学习笔记4——BTC实现

    区块链学习笔记4 BTC实现 学习视频 北京大学肖臻老师 区块链技术与应用 笔记参考 北京大学肖臻老师 区块链技术与应用 公开课系列笔记 目录导航页 UTXO 区块链是一个去中心化的账本 比特币采用了基于交易的账本模式 然而 系统中并没有记
  • IPv4、IPv6、UDP、TCP数据报首部格式分析

    一 IPv4首部格式 图片来源 图解TCP IP 通过wireshark抓QQ的数据报 IPV4的数据报格式和上面的一致 现在进行分析 相对重要的会红色标记 1 版本 version 由4比特构成 表示标识IP首部的版本号 如上是版本号为4
  • 面试专题:Linux运维精华面试题

    下面是一名资深Linux运维求职数十家公司总结的Linux运维面试精华 助力大家跳槽找个高薪好工作 1 什么是运维 什么是游戏运维 1 运维是指大型组织已经建立好的网络软硬件的维护 就是要保证业务的上线与运作的正常 在他运转的过程中 对他进
  • java双人对弈五子棋源码_java swing 双人五子棋源代码

    import java awt Color import java awt Font import java awt Graphics import java awt Toolkit import java awt event MouseE
  • C++ 类中的static成员的初始化和特点

    C 类中的static成员的初始化和特点 在C 的类中有些成员变量初始化和一般数据类型的成员变量有所不同 以下测试编译环境为 g v Using built in specs COLLECT GCC g Target x86 64 linu
  • 删除排序数组的重复项(给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间)

    给定一个排序数组 你需要在原地删除重复出现的元素 使得每个元素只出现一次 返回移除后数组的新长度 不要使用额外的数组空间 你必须在原地修改输入数组并在使用 O 1 额外空间的条件下完成 示例 1 给定数组 nums 1 1 2 函数应该返回
  • 第八章 聊聊区块链的几个数字

    第八章 聊聊区块链的几个数字 1 概述 2 2100W 3 每个区块10分钟 4 挖矿奖励4年递减1次 5 区块确认6次永久生效 6 51 算力攻击 6 1 币安黑客事件 参考资料 1 概述 在学习区块链过程中 会发现一些数字 心里不断问自
  • 使用MVC框架简单搭建一个数据库-后台-服务器Web项目

    在对Tomcat技术基本了解之后 用MVC框架简单搭建一个数据库 后台 服务器Web项目 MVC框架简介 MVC 是一种使用 MVC Model View Controller 模型 视图 控制器 设计创建 Web 应用程序的模式 Mode
  • 安全之公开密钥基本知识

    文件加密的基本知识 1 公开密钥密码 传统密码的缺点 1 收发双方持有相同密钥 密钥分配困难 KE KD K E K D 2 不能方便的实现数字签名 应用不方便 数字签名概念下面有 历史 公开密钥密码又称为双钥密码或非对称密码 是1976年
  • 企业网站建设方案书

    一 网站建设目标 1 1背景分析 现在网络的发展已呈现商业化 全民化 全球化的趋势 目前 几乎世界上所有的公司都在利用网络传递商业信息 进行商业活动 从宣传企业 发布广告 招聘雇员 传递商业文件乃至拓展市场 网上销售等 无所不能 如今网络已
  • iPhone Safari下iframe不显示滚动条无法滚动的解决方法

    div class dataTables wrapper style height 300px div
  • Go渗透测试笔记(二)---TCP,扫描器和代理

    Go渗透测试笔记 二 TCP 扫描器和代理 0x00 前言 TCP是面向连接协议的主要标准 也是现代网络的基础 作为攻击者 我们应当了解TCP的工作原理 并且能够开发可用的TCP结构体 以便可以识别 打开 关闭 的端口 找出错误的结果 如误
  • TCP/IP协议栈及网络基础,协议栈原理及实现

    1 TCP IP协议栈及网络基础 推荐这个在B站几千观看的视频讲解 底层原理到徒手实现 TCP IP网络协议栈 tcp协议栈 如何实现 C C Linux服务器开发高级架构学习视频点击 C C Linux服务器开发高级架构师 Linux后台
  • 正则表达式工具类

    在实际开发中总会使用到正则表达式匹配数据 我也是在后面查看了一些资料 下面写一个常用的正则表达式匹配集合 正则匹配模式 表示匹配字符串的开始位置 例外 用在中括号中 时 可以理解为取反 表示不匹配括号中字符串 表示匹配字符串的结束位置 表示
  • 量化交易动了谁的奶酪

    最近关于量化交易的政策讨论频出 在内容上 主要是限制其高频交易和某些可能对市场产生负面影响的行为 具体来说 中国证券监督管理委员会和上海证券交易所等机构都出台了相关政策 对量化交易的频率 规模 风险控制等方面进行了限制 这些政策的出台主要是
  • python--模块导入

    目录 模块简介 模块导入的两种方式 方式一 import 方式二 from import 模块简介 1 什么是模块 模块就是一系列功能的结合体 可以直接使用 2 为什么要用模块 极大地提升开发效率 拿来主义 gt gt gt 站在巨人的肩膀
  • docker部署redis集群实现动态扩缩容

    目录 思考 分布式存储的解决方案 哈希取余分区 一致性哈希算法分区 哈希槽分区 采用哈希槽分区 部署三主三从 docker 准备工作 创建3主3从redis实例 进入容器中 构建主从关系 主从容错切换迁移 主从扩容 主从缩容 思考 假如现有
  • canvas实战之酷炫背景动画(一)

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