吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3188|回复: 23
收起左侧

[其他转载] html页面粒子动画背景

  [复制链接]
rundreamer 发表于 2022-4-7 16:32
HTML+CSS实现页面粒子动画背景效果



[HTML] 纯文本查看 复制代码
<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus&#174;">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>粒子</title>
  <style>
	html,body,canvas{margin: 0px;padding: 0px;}
	html,body{
		width: 100%;
		height: 100%;
		overflow: hidden;
	}
  </style>
 </head>
 <body>
  <canvas id="canvas" style="width: 100%;height: 100%;background: #000;"></canvas>
 </body>
 <script>
	window.requestAnimationFrame=(function(){
		return window.requestAnimationFrame||
		window.webkitRequestAnimationFrame||
		window.mozRequestAnimationFrame||
		function (callback){
			window.setTimeout(callback,1000/60);
		};
	})();//兼容setTimeout
	
	var can=document.getElementById("canvas");
	var cxt=can.getContext("2d");//画布为2D
	//画布大小
	can.width=window.innerWidth;
	can.height=window.innerHeight;
	//圆形粒子统计
	var attr={
		num:300,//粒子个数
		array:[]//保存N个粒子对象
	}
	//创建粒子存入数组
	function cerateCircle(){
		for(let i=0;i<attr.num;i++){
			attr.array.push(new Circle());
		}
	}
	//绘制一个圆,确定位置大小,速度
	function Circle(){
		this.x=Math.floor(Math.random()*can.width);
		this.y=Math.floor(Math.random()*can.height);
		this.r=Math.floor(Math.random()*5)<3?3:Math.floor(Math.random()*5);
		this.vx=-0.5+Math.random();
		this.vy=-0.5+Math.random();
		this.color=createColor();
	}
	//绑定绘制粒子函数方法
	Circle.prototype.draw=function(){
		cxt.beginPath();
		cxt.fillStyle=this.color;
		cxt.arc(this.x,this.y,this.r,0,Math.PI*2);
		cxt.fill();
		cxt.closePath();
	}
	//颜色生成函数
	function createColor(){
		let r=Math.floor(Math.random()*255);
		let g=Math.floor(Math.random()*255);
		let b=Math.floor(Math.random()*255);
		return "rgb(" + r + "," + g + "," + b + ")";
	}
	//页面开始绘制
	function drawCircle(){
		for(let i=0;i<attr.num;i++){
			var dot=attr.array[i];
			dot.draw();
		}
	}
	
	//以上内容实现粒子静态绘制
	//粒子运动
	function moveCircle(){
		for(let i=0;i<attr.num;i++){
			var dot=attr.array[i];
			if(dot.y<0||dot.y>can.height){
				dot.vx=dot.vx
				dot.vy=-dot.vy
			}else if(dot.x<0||dot.x>can.width){
				dot.vx=-dot.vx;
				dot.vy=dot.vy;
			}
			dot.x+=dot.vx;
			dot.y+=dot.vy;
		}
	}
	//粒子之间连线
	function connectCircle(){
		for(let i=0;i<attr.num;i++){
			for(let j=0;j<attr.num;j++){
				iCircle=attr.array[i];//两个圆
				jCircle=attr.array[j];//两个园
				if(Math.sqrt((Math.pow((iCircle.x-jCircle.x),2))+(Math.pow((iCircle.y-jCircle.y),2)))<=20){
					drawLine(iCircle.x,iCircle.y,jCircle.x,jCircle.y);
				}
			}
		}
	}
	//画线函数
	function drawLine(x1,y1,x2,y2){
		cxt.beginPath();
		cxt.moveTo(x1,y1);
		cxt.lineTo(x2,y2);
		cxt.strokeStyle=createColor();
		cxt.stroke();
		cxt.closePath();
	}
	//动起来,递归
	function loop(){
		requestAnimationFrame(loop);//递归
		cxt.clearRect(0,0,can.width,can.height);
		cerateCircle();//创建
		drawCircle();//绘制
		connectCircle();//连线
		moveCircle();//移动
		drawMouse();//鼠标连线
		
	}
	//鼠标添加事件,连线
	can.addEventListener('mousemove',function(e){
		e=e||event;
		mx=e.pageX-can.offsetLeft;
		my=e.pageY-can.offsetTop;
	});
	function drawMouse(){
			for(let i=0;i<attr.num;i++)
			{
				if (Math.sqrt((Math.pow((attr.array[i].x-mx),2))+(Math.pow((attr.array[i].y-my),2)))<=20){
					drawLine(attr.array[i].x,attr.array[i].y,mx,my);
				}
			}
		}
	loop();
	cerateCircle();//创建
	drawCircle();//绘制
	connectCircle();//连线
 </script>
</html>
QQ录屏20220407160054_20220407162852.gif

免费评分

参与人数 4吾爱币 +2 热心值 +2 收起 理由
傲天越 + 1 谢谢@Thanks!
wxl103010 + 1 用心讨论,共获提升!
观鱼 + 1 用心讨论,共获提升!
落木萧萧 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

灵剑丹心 发表于 2022-4-7 22:44
肯定是那个前端教程对把,我看过的,康康我改造的
[JavaScript] 纯文本查看 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>粒子连线特效</title>
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			html,body{
				width: 100%;
				height: 100%;
			}
			#myCanvas{
				display: block;
				background: black;
			}
		</style>
		<script type="text/javascript">
			var  w,//页面宽
					h,//页面高
					c,//canvas dom对象
					cxt,//2d绘图对象
					particles,//粒子对象实例数组
					n,//粒子个数
					handle,//事件处理程序句柄
//					distance,//任意两个粒子允许连线的最大距离
					mouse,//代表鼠标位置的粒子对象
			onload=function(){
				c=document.getElementById("myCanvas");
				cxt=c.getContext("2d");//获取h5内建的2d绘图对象
				function init(){
					w=c.width=window.innerWidth;
					h=c.height=window.innerHeight;//顺便保存页面宽高
					n=Math.floor(w*h/10000);//粒子的数量由浏览器窗口大小决定
					particles=[];//初始化:清空
					mouse=new Particle();
					mouse.r=0;
					particles.push(mouse);//代表鼠标的粒子放在数组首位
					for(var i=0;i<n;i++){
						particles.push(new Particle());//创建Particle对象实例并保存在数组中
					}
					cancelAnimationFrame(handle);//这里不取消,每次窗口大小改变粒子运动就会加快
					randomMove();
				}
				init();
				function randomMove(){
					drawParticle();
					handle=requestAnimationFrame(randomMove);
				}
//				addEventListener("resize",init);
				onresize=init;
				
				c.onmousemove=function(e){//为代表鼠标的粒子更新坐标
					mouse.x=e.pageX || e.clientX;
					mouse.y=e.pageY || e.clientY;
//					console.log(particles[0]==mouse)
//					console.log("当前粒子个数"+particles.length)
				}
				c.onclick=function(e){//点击添加一个粒子
					var particle=new Particle();
					particle.x=e.pageX || e.clientX;
					particle.y=e.pageY || e.clientY;
					particles.push(particle);
					console.log("当前粒子个数"+particles.length)
				}
				function drawParticle(){
					cxt.clearRect(0,0,w,h);
					for(var i=0,l=particles.length;i<l;i++){
						particles[i].draw();//注释此句将只能看到线条
						for(var j=0;j<l;j++){
							if(i!=j)//不算自己跟自己的距离
								isDrawLine(particles[i],particles[j]);
						}
						if(particles[i]!=mouse)//代表鼠标位置的粒子不自动运动
							particles[i].move();
					}
				};
				function isDrawLine(x,y){//距离小于distance的粒子连线
					var distance= x===mouse || y===mouse ? 200 : Math.min(x.distance,y.distance);
					//鼠标所在的粒子连接距离可以设远一点
					//连线距离要满足两个粒子中要求最短的
					if(Math.sqrt(Math.pow((x.x-y.x),2)+Math.pow((x.y-y.y),2))<distance){
						cxt.beginPath();
						cxt.strokeStyle=mixRGBColor(x.color,y.color);//没事干,连线的颜色取两个粒子的颜色中间值
						cxt.moveTo(x.x,x.y);//从起点开始
						cxt.lineTo(y.x,y.y);
						cxt.stroke();
					}
				}//isDrawLine结束
				
				function mixRGBColor(x,y){//俩粒子连线的颜色为它们颜色的中间值
					var c1=x.split(","),
						  c2=y.split(","),
						  r=Math.round((parseInt(c1[0].match(/\d+/)[0])+parseInt(c2[0].match(/\d+/)[0]))/2),
						  g=Math.round((parseInt(c1[1].match(/\d+/)[0])+parseInt(c2[1].match(/\d+/)[0]))/2),
						  b=Math.round((parseInt(c1[2].match(/\d+/)[0])+parseInt(c2[2].match(/\d+/)[0]))/2);
						return `rgb(${r},${g},${b})`//es6新特性字符串拼凑${变量}
				}

			}
			function Particle(){//构造粒子对象
				this.r=randomRange(3,6);//半径
				this.x=randomRange(this.r,w-this.r);
				this.y=randomRange(this.r,h-this.r);//生成随机不可越界粒子圆心坐标
				this.moveX=randomSpeed();
				this.moveY=randomSpeed();
				this.color=randomColor();
				this.distance=randomRange(50,100);//每个粒子有自己的随机连接距离
				
			}
			Particle.prototype.draw = function(){
				cxt.beginPath();//不开始路径有彩蛋
				cxt.arc(this.x,this.y,this.r,0,Math.PI*2);
//				cxt.closePath();//不结束路径有彩蛋
				cxt.fillStyle=this.color;
				cxt.fill();
			}
			Particle.prototype.move = function(){
				if(this.x<this.r || this.x>w-this.r){
					this.moveX=-this.moveX;//取反反弹
				}else if(this.y<this.r || this.y>h-this.r){
					this.moveY=-this.moveY;
				}
				this.x+=this.moveX;
				this.y+=this.moveY;

//				this.moveX=randomSpeed();
//				this.moveY=randomSpeed();//加上这两行粒子就会原地抖动,因为每次都随机了位移不是-1就是1
			}
			function randomColor(){
				var r=randomRange(0,255);
				var g=randomRange(0,255);
				var b=randomRange(0,255);
//				return "rgb("+r+","+g+","+b+")"
				return `rgb(${r},${g},${b})`
			}
			function randomRange(Min,Max){//Min<=返回值<=Max,随机范围内的整数
		        var Range = Max - Min;
		        var Rand = Math.random();
		        return Min + Math.round(Rand * Range); //四舍五入
			}
			function randomSpeed(){
				return Math.random()<0.5 ? -1 : 1//返回-1或1
//				return (Math.random()<0.5 ? -1 : 1)*randomRange(1,3)//返回-3到3不包括0,当做粒子坐标更新的增量
			}

			if (!Date.now)
			    Date.now = function() { return new Date().getTime(); };
			(function() {
			    'use strict';
			    
			    var vendors = ['webkit', 'moz'];
			    for (var i = 0,l=vendors.length; i<l && !window.requestAnimationFrame; ++i) {
			        var vp = vendors[i];
			        window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];
			        window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']
			                                   							|| window[vp+'CancelRequestAnimationFrame']);
			    }
			    if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy
			        || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
			        var lastTime = 0;
			        window.requestAnimationFrame = function(callback) {
			            var now = Date.now();
			            var nextTime = Math.max(lastTime + 16, now);
			            return setTimeout(function() { callback(lastTime = nextTime); },
			                              nextTime - now);
			        };
			        window.cancelAnimationFrame = clearTimeout;
			    }
			}());
		</script>
	</head>
	<body>
		<canvas id="myCanvas">您的浏览器不支持canvas</canvas>
	</body>
</html>
mouyjy 发表于 2022-4-7 16:44

新建一个文本文档,把代码粘贴进去,改文件拓展名html就行了
JunInJapen 发表于 2022-4-7 16:39
mouyjy 发表于 2022-4-7 16:45
背景颜色是透明的我觉得不错,代码改成transparent
puz_zle 发表于 2022-4-7 16:57
我想了想 这适配了很久的浏览器版本啊
 楼主| rundreamer 发表于 2022-4-7 16:58

代码复制就行了,已经是全部代码了
 楼主| rundreamer 发表于 2022-4-7 16:59
mouyjy 发表于 2022-4-7 16:45
背景颜色是透明的我觉得不错,代码改成transparent

可以,可以
希望大家多自己玩玩
yxn4065 发表于 2022-4-7 17:13
可以的老哥,我刚试了挺不错
头像被屏蔽
mokson 发表于 2022-4-7 17:27
提示: 作者被禁止或删除 内容自动屏蔽
小鹏鹏 发表于 2022-4-7 18:19
num:30000,//粒子个数  效果意想不到
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 05:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表