本文介绍如何在博客背景添加可跟随鼠标的粒子特效

效果如图:

1

教程开始

在/source/js文件夹中创建文件background.js,并添加以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
!(function () {
function o(w, v, i) {
return w.getAttribute(v) || i;
}
function j(i) {
return document.getElementsByTagName(i);
}
function l() {
var i = j("script");
var w = i.length;
var v = i[w - 1];
return {
l: w,
z: o(v, "zIndex", -1), // canvas层级(默认-1,值越大越靠上)
o: o(v, "opacity", 0.5), // canvas整体透明度(默认0.5,0-1之间)
c: o(v, "color", "0,0,0"), // 粒子/连线颜色(默认黑色,格式"r,g,b")
n: o(v, "count", 50), // 粒子总数(默认99个,值越大粒子越密集)
};
}
function k() {
r = u.width =
window.innerWidth ||
document.documentElement.clientWidth ||
document.body.clientWidth;
n = u.height =
window.innerHeight ||
document.documentElement.clientHeight ||
document.body.clientHeight;
}
function b() {
e.clearRect(0, 0, r, n);
var w = [f].concat(t);
var x, v, A, B, z, y;
t.forEach(function (i) {
i.x += i.xa;
i.y += i.ya;
i.xa *= i.x > r || i.x < 0 ? -1 : 1;
i.ya *= i.y > n || i.y < 0 ? -1 : 1;
e.fillRect(i.x - 0.5, i.y - 0.5, 1, 1);//绘制单个粒子:1px*1px的矩形
for (v = 0; v < w.length; v++) {
x = w[v];
if (i !== x && null !== x.x && null !== x.y) {
B = i.x - x.x;
z = i.y - x.y;
y = B * B + z * z;
if (y < x.max) {
if (
x === f &&
y >= x.max / 2 &&
((i.x -= 0.03 * B), (i.y -= 0.03 * z))
) {
}
A = (x.max - y) / x.max;
e.beginPath();
e.lineWidth = A / 2;
e.strokeStyle = "rgba(" + s.c + "," + (A + 0.2) + ")";
e.moveTo(i.x, i.y);
e.lineTo(x.x, x.y);
e.stroke();
}
}
}
w.splice(w.indexOf(i), 1);
});
m(b);
}
var u = document.createElement("canvas");
var s = l();
var c = "c_n" + s.l;
var e = u.getContext("2d");
var r, n;
var m =
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function (i) {
window.setTimeout(i, 1000 / 45);
};

var a = Math.random;
var f = {
x: null,
y: null,
max: 5000, // 鼠标与粒子的最大连线距离(值越大,鼠标影响范围越广)
};

u.id = c;
u.style.cssText =
"position:fixed;top:0;left:0;z-index:" + s.z + ";opacity:" + s.o;
j("body")[0].appendChild(u);

k();
window.onresize = k;

window.onmousemove = function (i) {
i = i || window.event;
f.x = i.clientX;
f.y = i.clientY;
};

window.onmouseout = function () {
f.x = null;
f.y = null;
};

var t = [];
for (var p = 0; s.n > p; p++) {
var h = a() * r;
var g = a() * n;
var q = 1 * a() - 0.5; // 粒子x方向速度(-1到1之间,负数向左、正数向右)
var d = 1 * a() - 0.5; // 粒子y方向速度(-1到1之间,负数向上、正数向下)
t.push({
x: h,
y: g,
xa: q,
ya: d,
max: 10000, // 粒子间的最大连线距离(值越大,粒子间连线越密集)
});
}

// 延迟100ms执行绘制:确保canvas已添加到页面,避免绘制异常
setTimeout(function () {
b();
}, 100);
})();

之后在_config.butterfly.yml配置文件中的 [inject.bottom] 引入以下js

1
2
3
inject:
bottom:
- <script defer src="/js/background.js?1"></script> # 动态粒子线条背景