线性粒子汇聚特效
每个粒子都有独特的HSL颜色值,粒子颜色随时间渐变,形成彩虹流动效果,粒子间的连线呈现彩色,根据距离动态变化,鼠标移动会影响粒子运动(吸引和排斥),粒子在画布边界会反弹,底部版权信息,使用半透明背景增强可读性。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>七彩粒子</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: #0f2027;
min-height: 100vh;
overflow: hidden;
position: relative;
font-family: 'Arial', sans-serif;
}
canvas {
position: fixed;
top: 0;
left: 0;
width: 100%%;
height: 100%%;
z-index: 1;
}
.background-image {
position: fixed;
top: 0;
left: 0;
width: 100%%;
height: 100%%;
background: url('https://images.unsplash.com/photo-1534447677768-be436bb09401?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%%3D%%3D&auto=format&fit=crop&w=1790&q=80') no-repeat center center;
background-size: cover;
opacity: 0.2;
z-index: 0;
}
.footer {
text-align: center;
padding: 12px;
position: fixed;
bottom: 0;
width: 100%%;
z-index: 10;
font-size: 0.9rem;
color: rgba(255, 255, 255, 0.7);
background: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(3px);
letter-spacing: 1px;
font-weight: 300;
}
</style>
</head>
<body>
<div></div>
<canvas id="particleCanvas"></canvas>
<div>
七彩粒子网络效果 | 使用Canvas实现 | 背景图来自Unsplash
</div>
<script>
// 获取Canvas元素和上下文
var canvas = document.getElementById("particleCanvas");
var ctx = canvas.getContext("2d");
// 调整Canvas大小
function resize() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
resize();
window.addEventListener("resize", resize);
// 动画兼容处理
var RAF = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
// 鼠标交互区域
var warea = {x: null, y: null, max: 20000};
// 鼠标移动事件
window.onmousemove = function(e) {
warea.x = e.clientX;
warea.y = e.clientY;
};
// 鼠标离开事件
window.onmouseout = function() {
warea.x = null;
warea.y = null;
};
// 粒子数组
var dots = [];
var particleCount = 300;
var speedFactor = 1;
// 初始化粒子
function initParticles(count) {
for (var i = 0; i < count; i++) {
var x = Math.random() * canvas.width;
var y = Math.random() * canvas.height;
var xa = Math.random() * 2 - 1;
var ya = Math.random() * 2 - 1;
dots.push({
x: x,
y: y,
xa: xa,
ya: ya,
max: 6000,
color: Math.floor(Math.random() * 360) // 初始随机色相
});
}
}
// 初始化粒子
initParticles(particleCount);
// 粒子动画
function animate() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 创建包含鼠标位置的新数组
var ndots = [warea].concat(dots);
// 更新和绘制每个粒子
dots.forEach(function(dot) {
// 更新粒子位置
dot.x += dot.xa * speedFactor;
dot.y += dot.ya * speedFactor;
// 边界反弹
dot.xa *= (dot.x > canvas.width || dot.x < 0) ? -1 : 1;
dot.ya *= (dot.y > canvas.height || dot.y < 0) ? -1 : 1;
// 更新粒子颜色 (随时间变化)
dot.color = (dot.color + 0.1) %% 360;
// 绘制粒子
ctx.beginPath();
ctx.arc(dot.x, dot.y, 1.5, 0, Math.PI * 2);
ctx.fillStyle = `hsl(${dot.color}, 100%%, 65%%)`;
ctx.fill();
// 检查与其他粒子的距离
for (var i = 0; i < ndots.length; i++) {
var d2 = ndots[i];
if (dot === d2 || d2.x === null || d2.y === null) continue;
var xc = dot.x - d2.x;
var yc = dot.y - d2.y;
var dis = xc * xc + yc * yc;
if (dis < d2.max) {
// 计算距离比例
var ratio = (d2.max - dis) / d2.max;
// 鼠标互动
if (d2 === warea && dis > (d2.max / 2)) {
dot.x -= xc * 0.03 * speedFactor;
dot.y -= yc * 0.03 * speedFactor;
}
// 绘制连线
ctx.beginPath();
ctx.lineWidth = ratio / 1.5;
// 根据距离设置连线颜色
var lineHue = (dot.color + (ratio * 60)) %% 360;
ctx.strokeStyle = `hsla(${lineHue}, 90%%, 70%%, ${ratio * 0.6})`;
ctx.moveTo(dot.x, dot.y);
ctx.lineTo(d2.x, d2.y);
ctx.stroke();
}
}
// 移除已处理的粒子
ndots.splice(ndots.indexOf(dot), 1);
});
RAF(animate);
}
// 启动动画
setTimeout(animate, 100);
</script>
</body>
</html>
本文最后更新时间 2025-06-01
文章链接地址:https://xzlo.blog/index.php/archives/51/
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处