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

系列文章
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>
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个基于 HTML5 Canvas 的全屏酷星光闪烁 3D 视差背景动画特效的 HTML 代码: ```html <!doctype html> <html> <head> <meta charset="UTF-8"> <title>Canvas Star Field</title> <style> canvas { background-color: #000; } </style> </head> <body> <canvas id="canvas"></canvas> <script> var canvas = document.getElementById('canvas'), context = canvas.getContext('2d'), stars = [], particles = [], maxStars = 1300, maxParticles = 100; // 创建星星 for (var i = 0; i < maxStars; i++) { stars.push({ x: Math.random() * canvas.width, y: Math.random() * canvas.height, radius: Math.random() * 1.5, depth: Math.random() * 2000 + 500 }); } // 创建粒子 function emitParticle() { if (particles.length < maxParticles) { var particle = { x: canvas.width / 2, y: canvas.height / 2, vx: Math.random() * 2 - 1, vy: Math.random() * 2 - 1, radius: Math.random() * 2 + 2, alpha: Math.random() * 0.5 + 0.5, life: Math.random() * 200 + 100 }; particles.push(particle); } } // 更新粒子 function updateParticles() { particles.forEach(function(particle, index) { particle.x += particle.vx; particle.y += particle.vy; particle.life--; particle.alpha -= 0.01; if (particle.life <= 0 || particle.alpha <= 0) { particles.splice(index, 1); } }); } // 绘制星星 function drawStar(star) { var x = (star.x - canvas.width / 2) * (star.depth / canvas.width), y = (star.y - canvas.height / 2) * (star.depth / canvas.width), radius = star.radius * (star.depth / canvas.width); context.beginPath(); context.arc(x + canvas.width / 2, y + canvas.height / 2, radius, 0, Math.PI * 2); context.fillStyle = '#fff'; context.fill(); } // 绘制粒子 function drawParticle(particle) { context.beginPath(); context.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2); context.fillStyle = 'rgba(255, 255, 255, ' + particle.alpha + ')'; context.fill(); } // 绘制 function draw() { context.clearRect(0, 0, canvas.width, canvas.height); // 绘制星星 stars.forEach(function(star) { drawStar(star); }); // 绘制粒子 particles.forEach(function(particle) { drawParticle(particle); }); } // 循环 function loop() { emitParticle(); updateParticles(); draw(); requestAnimationFrame(loop); } // 初始化画布 function initCanvas() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; window.addEventListener('resize', function() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; }); } // 初始化 function init() { initCanvas(); loop(); } // 执行初始化 init(); </script> </body> </html> ``` 这段代码创建了一个全屏的 Canvas 画布,并在其中绘制了星星和粒子。通过调整粒子的数量和大小,以及星星的深度和大小,可以得到不同的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风舞红枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值