前言:

本文记录我从matery主题转butterfly主题的记录(matery还是很优秀的,感谢它能成为我的入门主题)

其实换主题已经有一段时间了,由于期末一下没太多时间整理,一耽搁,有些修改可能忘了,我就把能想起来的先记录下来,以备不时之需(所以,后续不定时更新)

由于想要增添一些新东西,原来使用的matery主题现有的布局,我认为再增添上东西后会影响布局的美观。在寻找解决方案的过程中,我发现了butterfly这个主题。该主题不但内容丰富、布局美观,并且自带了昼夜切换以及其侧边栏有较高的可拓展性。经过深思熟虑后,觉得将主题更换为butterfly主题。

建议自己新建一个CSS文件,然后在主题配置文件的head中引入、


【转载说明】本文优先发布于我的个人博客www.226yzy.com ,转载请注明出处并注明作者:星空下的YZY。

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0许可协议。

更好的阅读体验欢迎访问原文更换Butterfly主题记录 | 星空下的YZY (226yzy.com)

butterfly主题基础

该主题的样板网站上有主题作者的详细的基础教程

传送门🚪 Butterfly - A Simple and Card UI Design theme for Hexo

不得不说作者大大非常用心,这几篇教程不止基础修改配置,还有一些进阶魔改的内容,跟着做下来可DIY的地方非常多

添加访客地图

这里不推荐使用主题作者提到的那个地图,至少可以很明显看出来藏南地区有问题

这里推荐使用https://www.revolvermaps.com/?target=gallery

这里需要注意使用无国旗标注的版本,不然台湾省那还是会有问题。维护国家主权和领土完整、坚持一个中国的原则是每个公民应尽的责任和义务。

将评论更换为waline

更详细的操作请阅览官方文档Waline | Waline

需要用到这个网站https://vercel.com/

将评论更换为Twikoo

完整教程参考Twikoo 中文文档

同样需要用到这个网站https://vercel.com/

Aplayer 音乐播放器

在主题配置文件的bottom中添加如下(当然把相关信息填成你自己的),如果添加后没效果,可能是插件没安装,其他相关的可以查看其中文文档首页 - APlayer

1
- <div class="aplayer no-destroy" data-id="6804316983" data-server="netease" data-type="playlist" data-fixed="true" data-mini="true" data-listFolded="true" data-order="random" data-preload="auto" data-autoplay="false" muted></div>
  • 对于想将Aplayer音乐播放器缩的更小,可以在主题目录下在自己建的CSS中添加如下代码
1
2
3
4
5
6
7
.aplayer.aplayer-fixed.aplayer-narrow .aplayer-body {
left: -66px !important;
}

.aplayer.aplayer-fixed.aplayer-narrow .aplayer-body:hover {
left: 0 !important;
}

对于Aplayer音乐默认不显示歌词设置后,无法再切换成显示歌词的问题(我貌似记得有这样的问题),可以在主题目录下在自己建的CSS中添加如下代码尝试

1
2
3
4
5
6
7
.aplayer-lrc{
display: none !important;
}

.aplayer-lrc-hide{
display: block !important;
}

看板娘

这个我在matery主题的时候就弄过了,你直接将这三行添加至主题配置文件的bottom

1
2
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome/css/font-awesome.min.css" />
- <script src="https://cdn.jsdelivr.net/gh/stevenjoezhang/live2d-widget/autoload.min.js"></script>

滚动条

美化滚动条嘛,我比较喜欢蓝白相间的。将下面的代码加入到你自己的CSS中即可

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
/* 滚动条 */
::-webkit-scrollbar-thumb {
background-color: #2ab1ff;
background-image: -webkit-linear-gradient(
45deg,
rgba(255, 255, 255, 0.4) 25%,
transparent 25%,
transparent 50%,
rgba(255, 255, 255, 0.4) 50%,
rgba(255, 255, 255, 0.4) 75%,
transparent 75%,
transparent
);
border-radius: 3em;
}

::-webkit-scrollbar-track {
background-color: #ffffff;
border-radius: 3em;
}

::-webkit-scrollbar {
width: 8px;
height: 15px;
}

修改字体

在你的CSS文件中按这个格式添加你的字体,然后在主题配置文件的相关配置中引用

1
2
3
4
5
@font-face{
font-family:'DIYJH' ;
src:url('/fonts/FZZJ-JHTJW.TTF');
font-display : swap;
}

如果你的字体文件过大又舍不得不用,可以参考我另一篇文章,将字体进行精简字体精简及其相关资源 | 星空下的YZY (226yzy.com)

自动提交网站至百度

具体参考自自动提交网址给百度 | 小康博客 (antmoe.com)

不过小康大佬给的代码库地址似乎没法用了

如果不嫌弃可以用我这个代码库地址

1
https://github.com/226yzy/Hexo-BaiduPush.git

为底部栏添加跳动的鱼背景

底部栏些许单调,有一次看到了底部跳动的鱼的效果还不错(效果可参考本站底部栏)

引用自jQuery 插件 养鱼 | Ln’s Blog (weilining.github.io)

在主题文件下的js文件中新建一个fishes.js的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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
fish();
function fish() {
return (
$("footer").append(
'<div class="container" id="jsi-flying-fish-container"></div>'
),
$(".container").css({
width: "100%",
height: "160px",
margin: 0,
padding: 0,
}),
$("#footer-wrap").css({
position: "absolute",
"text-align": "center",
top: 0,
right: 0,
left: 0,
bottom: 0,
}),
this
);
}
var RENDERER = {
POINT_INTERVAL: 5,
FISH_COUNT: 2,
MAX_INTERVAL_COUNT: 50,
INIT_HEIGHT_RATE: 0.5,
THRESHOLD: 50,

init: function () {
this.setParameters();
this.reconstructMethods();
this.setup();
this.bindEvent();
this.render();
},
setParameters: function () {
this.$window = $(window);
this.$container = $("#jsi-flying-fish-container");
this.$canvas = $("<canvas />");
this.context = this.$canvas
.appendTo(this.$container)
.get(0)
.getContext("2d");
this.points = [];
this.fishes = [];
this.watchIds = [];
},
createSurfacePoints: function () {
var count = Math.round(this.width / this.POINT_INTERVAL);
this.pointInterval = this.width / (count - 1);
this.points.push(new SURFACE_POINT(this, 0));

for (var i = 1; i < count; i++) {
var point = new SURFACE_POINT(this, i * this.pointInterval),
previous = this.points[i - 1];

point.setPreviousPoint(previous);
previous.setNextPoint(point);
this.points.push(point);
}
},
reconstructMethods: function () {
this.watchWindowSize = this.watchWindowSize.bind(this);
this.jdugeToStopResize = this.jdugeToStopResize.bind(this);
this.startEpicenter = this.startEpicenter.bind(this);
this.moveEpicenter = this.moveEpicenter.bind(this);
this.render = this.render.bind(this);
},
setup: function () {
this.points.length = 0;
this.fishes.length = 0;
this.watchIds.length = 0;
this.intervalCount = this.MAX_INTERVAL_COUNT;
this.width = this.$container.width();
this.height = this.$container.height();
this.fishCount =
(((this.FISH_COUNT * this.width) / 500) * this.height) / 500;
this.$canvas.attr({ width: this.width, height: this.height });

this.skyGradient = this.context.createLinearGradient(0, 0, 0, this.height);
this.skyGradient.addColorStop(0, "hsl(180, 80%, 70%)");
this.skyGradient.addColorStop(1, "hsl(180, 80%, 90%)");

this.seaGradient = this.context.createLinearGradient(0, 0, 0, this.height);
this.seaGradient.addColorStop(0, "hsl(180, 80%, 60%)");
this.seaGradient.addColorStop(0.5, "hsl(180, 80%, 50%)");
this.seaGradient.addColorStop(1, "hsl(210, 80%, 50%)");

this.fishes.push(new FISH(this));
this.createSurfacePoints();
},
watchWindowSize: function () {
this.clearTimer();
this.tmpWidth = this.$window.width();
this.tmpHeight = this.$window.height();
this.watchIds.push(setTimeout(this.jdugeToStopResize, this.WATCH_INTERVAL));
},
clearTimer: function () {
while (this.watchIds.length > 0) {
clearTimeout(this.watchIds.pop());
}
},
jdugeToStopResize: function () {
var width = this.$window.width(),
height = this.$window.height(),
stopped = width == this.tmpWidth && height == this.tmpHeight;

this.tmpWidth = width;
this.tmpHeight = height;

if (stopped) {
this.setup();
}
},
bindEvent: function () {
this.$window.on("resize", this.watchWindowSize);
this.$container.on("mouseenter", this.startEpicenter);
this.$container.on("mousemove", this.moveEpicenter);
},
getAxis: function (event) {
var offset = this.$container.offset();

return {
x: event.clientX - offset.left + this.$window.scrollLeft(),
y: event.clientY - offset.top + this.$window.scrollTop(),
};
},
startEpicenter: function (event) {
this.axis = this.getAxis(event);
},
moveEpicenter: function (event) {
var axis = this.getAxis(event);

if (!this.axis) {
this.axis = axis;
}
this.generateEpicenter(axis.x, axis.y, axis.y - this.axis.y);
this.axis = axis;
},
generateEpicenter: function (x, y, velocity) {
if (
y < this.height / 2 - this.THRESHOLD ||
y > this.height / 2 + this.THRESHOLD
) {
return;
}
var index = Math.round(x / this.pointInterval);

if (index < 0 || index >= this.points.length) {
return;
}
this.points[index].interfere(y, velocity);
},
controlStatus: function () {
for (var i = 0, count = this.points.length; i < count; i++) {
this.points[i].updateSelf();
}
for (var i = 0, count = this.points.length; i < count; i++) {
this.points[i].updateNeighbors();
}
if (this.fishes.length < this.fishCount) {
if (--this.intervalCount == 0) {
this.intervalCount = this.MAX_INTERVAL_COUNT;
this.fishes.push(new FISH(this));
}
}
},
render: function () {
requestAnimationFrame(this.render);
this.controlStatus();

this.context.fillStyle = this.skyGradient;
this.context.fillRect(0, 0, this.width, this.height);
this.context.fillStyle = this.seaGradient;
this.context.beginPath();
this.context.moveTo(0, this.height);

for (var i = 0, count = this.points.length; i < count; i++) {
this.points[i].render(this.context);
}
this.context.lineTo(this.width, this.height);
this.context.closePath();
this.context.fill();

for (var i = 0, count = this.fishes.length; i < count; i++) {
this.fishes[i].render(this.context);
}
},
};
var SURFACE_POINT = function (renderer, x) {
this.renderer = renderer;
this.x = x;
this.init();
};
SURFACE_POINT.prototype = {
SPRING_CONSTANT: 0.03,
SPRING_FRICTION: 0.9,
WAVE_SPREAD: 0.3,
ACCELARATION_RATE: 0.01,

init: function () {
this.initHeight = this.renderer.height * this.renderer.INIT_HEIGHT_RATE;
this.height = this.initHeight;
this.fy = 0;
this.force = { previous: 0, next: 0 };
},
setPreviousPoint: function (previous) {
this.previous = previous;
},
setNextPoint: function (next) {
this.next = next;
},
interfere: function (y, velocity) {
this.fy =
this.renderer.height *
this.ACCELARATION_RATE *
(this.renderer.height - this.height - y >= 0 ? -1 : 1) *
Math.abs(velocity);
},
updateSelf: function () {
this.fy += this.SPRING_CONSTANT * (this.initHeight - this.height);
this.fy *= this.SPRING_FRICTION;
this.height += this.fy;
},
updateNeighbors: function () {
if (this.previous) {
this.force.previous =
this.WAVE_SPREAD * (this.height - this.previous.height);
}
if (this.next) {
this.force.next = this.WAVE_SPREAD * (this.height - this.next.height);
}
},
render: function (context) {
if (this.previous) {
this.previous.height += this.force.previous;
this.previous.fy += this.force.previous;
}
if (this.next) {
this.next.height += this.force.next;
this.next.fy += this.force.next;
}
context.lineTo(this.x, this.renderer.height - this.height);
},
};
var FISH = function (renderer) {
this.renderer = renderer;
this.init();
};
FISH.prototype = {
GRAVITY: 0.4,

init: function () {
this.direction = Math.random() < 0.5;
this.x = this.direction
? this.renderer.width + this.renderer.THRESHOLD
: -this.renderer.THRESHOLD;
this.y = this.getRandomValue(
(this.renderer.height * 6) / 10,
(this.renderer.height * 9) / 10
);
this.previousY = this.y;
this.vx = this.getRandomValue(4, 10) * (this.direction ? -1 : 1);
this.vy = this.getRandomValue(-5, -2);
this.ay = this.getRandomValue(-0.2, -0.05);
this.theta = 0;
this.phi = 0;
this.isOut = false;
},
getRandomValue: function (min, max) {
return min + (max - min) * Math.random();
},
controlStatus: function (context) {
this.previousY = this.y;
this.x += this.vx;
this.y += this.vy;
this.vy += this.ay;

if (this.y < this.renderer.height * this.renderer.INIT_HEIGHT_RATE) {
this.vy += this.GRAVITY;
this.isOut = true;
} else {
if (this.isOut) {
this.ay = this.getRandomValue(-0.2, -0.05);
}
this.isOut = false;
}
if (!this.isOut) {
this.theta += Math.PI / 20;
this.theta %= Math.PI * 2;
this.phi += Math.PI / 30;
this.phi %= Math.PI * 2;
}
this.renderer.generateEpicenter(
this.x + (this.direction ? -1 : 1) * this.renderer.THRESHOLD,
this.y,
this.y - this.previousY
);

if (
(this.vx > 0 && this.x > this.renderer.width + this.renderer.THRESHOLD) ||
(this.vx < 0 && this.x < -this.renderer.THRESHOLD)
) {
this.init();
}
},
render: function (context) {
context.save();
context.translate(this.x, this.y);
context.rotate(Math.PI + Math.atan2(this.vy, this.vx));
context.scale(1, this.direction ? 1 : -1);

context.fillStyle = "hsl(180, 30%, 80%)";
context.beginPath();
context.moveTo(-30, 0);
context.bezierCurveTo(-20, 15, 15, 10, 40, 0);
context.bezierCurveTo(15, -10, -20, -15, -30, 0);
context.fill();

context.save();
context.translate(40, 0);
context.scale(0.9 + 0.2 * Math.sin(this.theta), 1);
context.fillStyle = "hsl(180, 30%, 80%)";
context.beginPath();
context.moveTo(0, 0);
context.quadraticCurveTo(5, 10, 20, 8);
context.quadraticCurveTo(12, 5, 10, 0);
context.quadraticCurveTo(12, -5, 20, -8);
context.quadraticCurveTo(5, -10, 0, 0);
context.fill();
context.restore();

context.save();
context.translate(-3, 0);
context.rotate(Math.PI / 3 + (Math.PI / 10) * Math.sin(this.phi));
context.fillStyle = "hsl(220, 80%, 40%)";
context.beginPath();
context.moveTo(-5, 0);
context.bezierCurveTo(-10, -10, -10, -30, 0, -40);
context.bezierCurveTo(12, -25, 8, -10, 0, 0);
context.closePath();
context.fill();
context.restore();

context.strokeStyle = "hsl(220, 80%, 40%)";
context.beginPath();
context.arc(-15, -3, 5, 0, Math.PI * 2, false);
context.stroke();

context.fillStyle = "hsl(220, 80%, 40%)";
context.beginPath();
context.arc(-15, -3, 3, 0, Math.PI * 2, false);
context.fill();
context.restore();

this.controlStatus(context);
},
};
$(function () {
RENDERER.init();
});

主题配置文件的bottom中引入

如果没有引入过jquery的话也需要引入一下

其他参考:flying fishes (codepen.io)

鼠标光标

美化鼠标光标,这个我在matery主题时简单弄过,后来看到Akilar大佬整理过,我用的如下

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
/*光标*/

/* 全局默认鼠标指针 */
body,
html {
cursor: url('../coursor/guangbiao.ico'), auto !important;
}

/* 悬停图片时的鼠标指针 */
img {
cursor: url('../coursor/Comix_White_Link.cur'), auto !important;
}

/* 选择链接标签时的鼠标指针 */
a:hover {
cursor: url('../coursor/Comix_White_Link.cur'), auto;
}

/* 选中输入框时的鼠标指针 */
/* input:hover {
cursor: url('../coursor/Comix_White_Text.cur'), auto;
} */

/* 悬停按钮时的鼠标指针 */
button:hover {
cursor: url('../coursor/Comix_White_Link.cur'), auto;
}

/* 悬停列表标签时的鼠标指针 */
i:hover {
cursor: url('../coursor/Comix_White_Link.cur'), auto;
}

/* 悬停页脚链接标签(例如页脚徽标)时的鼠标指针 */
#footer-wrap a:hover {
cursor: url('../coursor/Comix_White_Link.cur'), auto;
}

/* 悬停页码时的鼠标指针 */
#pagination .page-number:hover {
cursor: url('../coursor/Comix_White_Link.cur'), auto;
}

/* 悬停菜单栏时的鼠标指针 */
#nav .site-page:hover {
cursor: url('../coursor/Comix_White_Link.cur'), auto;
}

文章加密

matery主题中自带了文章加密功能

这个虽然一般情况用不到,但有些供自己参考的试验性内容,还是有可能使用的

注该文章加密后,代码块一键复制的效果将会没有

  • 安装文章加密插件
1
npm install --save hexo-blog-encrypt

然后文章头部信息中加入password属性

如果对原版配置内容不满意,可以在主题配置文件中自定义

1
2
3
4
encrypt:
enable: true
default_abstract: 这是一篇加密文章,内容可能是个人试验内容水平有限暂不公开。如果你确实想看,请与我联系。
default_message: 输入密码,查看文章。

如果想特定的文章做特殊处理,可在文章头部信息中添加abstract来写提示内容

页面加载

matery主题时参考过Matery 添加加载动画 | 斯莫笔记 (zhangxiaocai.cn)

现在Butterfly主题参考的是Akilarの糖果屋 - Akilar.top

浮动动画

这个还是参考Akilar大佬的Akilarの糖果屋 - Akilar.top

大佬还是强啊,懂的多

小冰插件包

大佬的插件包:小冰插件包 butterfly-orchid 1.0 | 小冰博客 (zfe.space)

有六个插件,可按需使用

友链朋友圈

你还在为看这么多大佬的博客烦恼吗,那友链朋友圈就非常适合你了

该项目文档GitHub上的源码

页面效果参考https://226yzy.com/fcircle/index.html

不过这个流程较长,建议参考制作这个项目的大佬们的教程

比如小冰大佬的

基于hexo的友链朋友圈 Beta1.5 | 小冰博客 (zfe.space)

【2022-02-12记】最近大佬们的友链朋友圈项目有大版本更新,冰老师的方案似乎有受到影响,没法继续更新最新内容,前端方案目前推荐林木木大佬的f方案

或者贰猹大佬的

友链朋友圈食用说明书 | 贰猹の小窝 (noionion.top)

上面两篇参考的部署的API不同,前端页面效果也不同,按自己喜好取用

另外matery主题的朋友也可以参考另一位大佬的教程

hexo-matery添加友链朋友圈 | FanHeart (hesifan.top)

随机文章

参考自标签: Butterfly美化 | Guo Le’s Blog

在博客根目录/scripts(没有请自行创建) 下新建 random.js 文件,通过路径/random/就会随机跳转一篇文章。

random.js 内容如下

1
2
3
4
5
6
7
8
9
10
11
hexo.extend.generator.register('random', function (locals) {
const config = hexo.config.random || {}
const posts = []
for (const post of locals.posts.data) {
if (post.random !== false) posts.push(post.path)
}
return {
path: config.path || 'random/index.html',
data: `<html><head><script>var posts=${JSON.stringify(posts)};window.open('/'+posts[Math.floor(Math.random() * posts.length)],"_self")</script></head></html>`
}
})

可以在博客配置文件_config.yml添加以下配置:

1
2
random:
path: # 随机链接路径,默认"random/index.html"

如果不想随机跳转到某篇文章,可以在这篇文章 md 文件头部,添加:

1
random: false

星空和流星背景特效

暗夜模式下星空和流星背景特效

采用大佬的方案Hexo博客 | 如何让你的博客拥有星空背景和流星特效 | Justlovesmile’s BLOG

  • 插入Canvas标签
    首先打开Butterfly主题配置文件_config.yml文件或者使用HTML直接插入,找到配置文件对应的inject部分,插入<canvas id="universe"></canvas>

  • 创建JS文件
    在butterfly/source/js/创建一个universe.js文件,或者添加到自己的js文件中

1
2
function dark() {window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame;var n,e,i,h,t=.05,s=document.getElementById("universe"),o=!0,a="180,184,240",r="226,225,142",d="226,225,224",c=[];function f(){n=window.innerWidth,e=window.innerHeight,i=.216*n,s.setAttribute("width",n),s.setAttribute("height",e)}function u(){h.clearRect(0,0,n,e);for(var t=c.length,i=0;i<t;i++){var s=c[i];s.move(),s.fadeIn(),s.fadeOut(),s.draw()}}function y(){this.reset=function(){this.giant=m(3),this.comet=!this.giant&&!o&&m(10),this.x=l(0,n-10),this.y=l(0,e),this.r=l(1.1,2.6),this.dx=l(t,6*t)+(this.comet+1-1)*t*l(50,120)+2*t,this.dy=-l(t,6*t)-(this.comet+1-1)*t*l(50,120),this.fadingOut=null,this.fadingIn=!0,this.opacity=0,this.opacityTresh=l(.2,1-.4*(this.comet+1-1)),this.do=l(5e-4,.002)+.001*(this.comet+1-1)},this.fadeIn=function(){this.fadingIn&&(this.fadingIn=!(this.opacity>this.opacityTresh),this.opacity+=this.do)},this.fadeOut=function(){this.fadingOut&&(this.fadingOut=!(this.opacity<0),this.opacity-=this.do/2,(this.x>n||this.y<0)&&(this.fadingOut=!1,this.reset()))},this.draw=function(){if(h.beginPath(),this.giant)h.fillStyle="rgba("+a+","+this.opacity+")",h.arc(this.x,this.y,2,0,2*Math.PI,!1);else if(this.comet){h.fillStyle="rgba("+d+","+this.opacity+")",h.arc(this.x,this.y,1.5,0,2*Math.PI,!1);for(var t=0;t<30;t++)h.fillStyle="rgba("+d+","+(this.opacity-this.opacity/20*t)+")",h.rect(this.x-this.dx/4*t,this.y-this.dy/4*t-2,2,2),h.fill()}else h.fillStyle="rgba("+r+","+this.opacity+")",h.rect(this.x,this.y,this.r,this.r);h.closePath(),h.fill()},this.move=function(){this.x+=this.dx,this.y+=this.dy,!1===this.fadingOut&&this.reset(),(this.x>n-n/4||this.y<0)&&(this.fadingOut=!0)},setTimeout(function(){o=!1},50)}function m(t){return Math.floor(1e3*Math.random())+1<10*t}function l(t,i){return Math.random()*(i-t)+t}f(),window.addEventListener("resize",f,!1),function(){h=s.getContext("2d");for(var t=0;t<i;t++)c[t]=new y,c[t].reset();u()}(),function t(){document.getElementsByTagName('html')[0].getAttribute('data-theme')=='dark'&&u(),window.requestAnimationFrame(t)}()};
dark()
  • CSS样式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* 背景宇宙星光  */
#universe{
display: block;
position: fixed;
margin: 0;
padding: 0;
border: 0;
outline: 0;
left: 0;
top: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: -1;
}

引入阿里图标库的彩色图标

首先要注意的是彩色图标一个项目最多40个,同时要在对应的项目设置中的字体格式勾选彩色

(如果在使用过程中发现图标加载不出,只有一个/样的东西,那有可能是对应的位置的CSS设置了字体加粗)

封面节日挂件效果

参考自糖果屋微调合集 | Akilarの糖果屋

归档页面时间轴添加十二生肖图标

参考自Archive Beautify | Akilarの糖果屋

主页的分类磁贴

参考自Akilarの糖果屋 - Akilar.top

侧栏悬浮卡片控制按钮

参考自Butterfly主题美化日记 | Akilarの糖果屋

思维导图插件

该插件的GitHub链接HunterXuan/hexo-simple-mindmap: Hexo Plugin: Display mindmap in post (github.com)

1
npm install hexo-simple-mindmap

mindmap 是思维导图渲染的标志,画板尺寸有三种规格:

  • mindmap-sm 小号尺寸的画板
  • mindmap-md 中号尺寸的画板
  • mindmap-lg 大号尺寸的画板

思维导图的内容和层级关系通过无序列表表示,支持基本的文字和超链接

示例代码如下

1
2
3
4
5
6
7
8
9
10
{% pullquote mindmap mindmap-md %}

- [在 Hexo 中使用思维导图](https://hunterx.xyz/use-mindmap-in-hexo.html)
- 前言
- 操作指南
- 准备需要的文件
- 为主题添加 CSS/JS 文件
- 使用方法

{% endpullquote %}

效果如下