Hexo next 博客添加相册功能总结

想要在自己的博客里添加一个相册功能,可以放一些照片进去展示。

参考的教程链接:
https://www.sunhome.org.cn/2018/09/29/hexophotos/
https://asdfv1929.github.io/2018/05/26/next-add-photos/

看过上面的教程后,我们总结一下:
1.在博客根目录的 /scripts/文件夹下新建一个phototool.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
"use strict";
const fs = require("fs");
const sizeOf = require('image-size');
//本地照片所在目录
const path = "source/photos/images";
//要放置生成的照片信息文件目录,建议直接放在 source/photos/ 文件夹下
const output = "source/photos/photoslist.json";
var dimensions;
fs.readdir(path, function (err, files) {
if (err) {
return;
}
let arr = [];
(function iterator(index) {
if (index == files.length) {
fs.writeFileSync(output, JSON.stringify(arr, null, "\t"));
return;
}
fs.stat(path + "/" + files[index], function (err, stats) {
if (err) {
return;
}
if (stats.isFile()) {
dimensions = sizeOf(path + "/" + files[index]);
console.log(dimensions.width, dimensions.height);
arr.push(dimensions.width + '.' + dimensions.height + ' ' + files[index]);
}
iterator(index + 1);
})
}(0));
});

2.在 /themes/next/source/js/src/ 目录下创建一个photo.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
 photo ={
page: 1,
//offset 用于设置照片数量的上限
offset: 100,
init: function () {
var that = this;
//这里设置的是刚才生成的 json 文件路径
$.getJSON("/photos/photoslist.json", function (data) {
that.render(that.page, data);
//that.scroll(data);
});
},
render: function (page, data) {
var begin = (page - 1) * this.offset;
var end = page * this.offset;
if (begin >= data.length) return;
var html, imgNameWithPattern, imgName, imageSize, imageX, imageY, li = "";
for (var i = begin; i < end && i < data.length; i++) {
imgNameWithPattern = data[i].split(' ')[1];
imgName = imgNameWithPattern.split('.')[0]
imageSize = data[i].split(' ')[0];
imageX = imageSize.split('.')[0];
imageY = imageSize.split('.')[1];
//这里 250 指的是图片的宽度,可以根据自己的需要调整相册中照片的大小
li += '<div class="card" style="width:250px">' +
'<div class="ImageInCard" style="height:'+ 250 * imageY / imageX + 'px">' +
//href 和 src 的链接地址是相册照片外部链接,也可以放博客目录里
'<a data-fancybox="gallery" href="/photos/images/' + imgNameWithPattern + '?raw=true" data-caption="' + imgName + '">' +
'<img src="/photos/images/' + imgNameWithPattern + '?raw=true"/>' +
'</a>' +
'</div>' +
// '<div class="TextInCard">' + imgName + '</div>' + //图片下显示文件名作为说明的功能
'</div>'
}
$(".ImageGrid").append(li);
$(".ImageGrid").lazyload();
this.minigrid();
},
minigrid: function() {
var grid = new Minigrid({
container: '.ImageGrid',
item: '.card',
gutter: 12
});
grid.mount();
$(window).resize(function() {
grid.mount();
});
}
}
photo.init();

minigrid.min.js 可以 下载 获得,放在同样的目录下。
然后如果指向让两个文件在相册页加载,需要修改 /themes/next/layout/_scripts/commons.swig为以下内容,这里的判断语句表示如果页面的类型是 picture就加载minigrid.min.jsphoto.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{% if page.type ==='picture' %}
{%
set js_commons = [
'src/utils.js',
'src/motion.js',
'src/minigrid.min.js',
'src/photo.js',
'src/canvasline.js'
]
%}
{% else %}
{%
set js_commons = [
'src/utils.js',
'src/motion.js',
'src/canvasline.js'
]
%}
{% endif %}

{% for common in js_commons %}
<script type="text/javascript" src="{{ url_for(theme.js) }}/{{ common }}?v={{ version }}"></script>
{% endfor %}

3.在/themes/next/source/css/_custom/custom.styl添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//相册样式
.ImageGrid {
width: 100%;
max-width: 1040px;
margin: 0 auto;
text-align: center;
}

.card {
overflow: hidden;
transition: .3s ease-in-out;
border-radius: 8px;
background-color: #ddd;
}

.ImageInCard img {
padding: 0 0 0 0;
border-radius: 8px;
}

4.开启 lazyloadfancybox
Hexo-lazy-image使用
安装步骤:
npm install hexo-lazyload-image --save

然后修改_config.yml文件

1
2
3
4
lazyload:
enable: true
onlypost: false
loadingImg: # eg. ./images/loading.png

安装fancybox

1
2
3
$ cd themes/next
$ ls
bower.json _config.yml docs gulpfile.coffee languages layout LICENSE.md package.json README.md scripts source test

输入

1
$ git clone https://github.com/theme-next/theme-next-fancybox3 source/lib/fancybox

在主题配置文件_config.yml里编辑:

1
fancybox: true

4.相册文件夹
hexo\source\下建立photos文件夹,里面新建index.md文件,添加

1
2
3
4
5
6
---
title: photos
date: xxxx-xx-xx xx:xx:xx//自己编辑
type: picture
---
<div class="ImageGrid"></div>

在博客根目录的配置文件里启用post_asset_folder

1
post_asset_folder: true

之后,添加照片,hexo d-g就能在自己的博客里看到了。
总结完毕

如果你支持我,那你可以请我喝一包雀巢咖啡。