Hexo - 相册解决方案 - Icarus主题

Hexo - 相册解决方案 - Icarus主题

前言

为了蛋疼的执念,也为了对百度空间的缅怀,自己执意要添加一个相册模块。 不需要很复杂,简单就好 主要需求有:

  • 能够展示照片(废话)
  • 能够点击照片放大
  • 能够左右翻阅照片
  • 能够显示照片对应文件名
  • 有缩略图功能
  • 随着页面滚动分段加载
  • 自适应排列

github对比vps的主要优势在于其不限制流量、访问数等等参数,且国内外访问速度都不慢。作为一个图床比较合适。 可惜github对于单仓库貌似有1GB大小限制。由于并不需要传大文件,暂时忽略这个问题。

起手

干完以后发现网上的方案都是天才吖~

主要参考了yilia主题的两篇博文: http://luckykun.com/work/2016-05-20/hexo-advance.html#修改themes-yilia-js-photo-js: http://zlwis.me/photo/

关于fancybox: 一般博文里使用直接用以下方式即可: http://sowm.cn/aips/article/0E1C44647F2F34C99E070ACF324407E7.html

/**
* Syntax:
*  { % fancybox /path/to/image [/path/to/thumbnail] [title] % }
*/

先去看fancybox的documentation。用起来比较简单,直接调用就好

$('.fancybox').fancybox();

由于Icarus主题作者ppoffice贴心地在main.js配置好了fancybox载入相关的内容,我们只需要将需要载入的图片调整好标签的格式就行。 于是乎,就按照上面的需求开始设计这个相册。

首先建立导航栏中的相册gallery分类;其次在该分类下放indexpage。index.md配置如下:

---
title: 相册
layout: "page"
comments: false
noshare: true
---
<link type="text/css" href="/cht/vendor/fancybox/jquery.fancybox.css" rel="stylesheet">
<script src="https://7.url.cn/edu/jslib/comb/require-2.1.6,jquery-1.9.1.min.js" type="text/javascript"></script>
<div class="instagram">
    <section class="archives album">
        <ul class="img-box-ul"></ul>        
    </section>
</div>

此处加入了一个require.js。主要原因在于作者没有学过js也不想看文档,就想照猫画虎。参考的博主是这么做的,直接学习。 需要注意的是,requirejs使用时有一些限制,具体需要参考其文档。一个错误使用方法造成的报错可参考以下页面: http://luckykun.com/photos/http://requirejs.org/docs/errors.html#mismatch 报错:Uncaught Error: Mismatched anonymous define()

js的修改

由于yilia主题和icarus主题所用的js不尽相同,文件夹结构也不同,很多地方需要调整。 首先,为了区分相册页面中的图片与普通博文中的图片,上面在标签中添加了Instagram的属性。 在main.js中需要对这个标签进行处理:

//insta
if($('.instagram').length) {
    var bp = document.createElement("script");
	bp.src = "/js/photo.js";
	var s = document.getElementsByTagName("script")[0];
	s.parentNode.insertBefore(bp, s),
	require(['/js/photo.js', '/js/jquery.lazyload.js', '/vendor/fancybox/jquery.fancybox.js'], function(obj) {
        obj.init();
    });
}

接着来到require到的三个js。首先是photo.js 主要实现的功能就是从另一个repo中读取照片链接,在页面上加载并改变尺寸装到fancybox里,最后实现滚动异步加载。 为了节省空间并没有专门生成thumbnail,只得以费流量为代价了(不痛不痒) 具体实现请参考仓库中代码(偷懒)

主要难点

其实没啥难点,就是因为自己比较倔非得不看文档瞎写。

总之,实现请参考: https://yo1995.github.io/cht/gallery/

终于搞定了,最后在fancybox的css中加一项

.img-box-ul li {
	float: left;
	list-style-type:none;
	margin: 18px;
}

这样可以使图片列表横向载入

最后

网上的方案看的我尴尬都犯了,有个用一样主题的家伙直接用fancybox加载结果还是一堆叉叉…… 自己写的总还是费了点脑筋的……


8.19 更新

又重新倒腾了一下,主要解决了横向排列的适配问题。 可以考虑的方案主要有两种:

  • clearfix + float: left
  • display: inline

本文采用了后一种方案,主要为了定死相册显示的样式。 另外更新了标签中关于图片标题的展示方法。

另外,新加入了缩略图功能。由于本人js并没学过,因而用Python + PIL写了个简单的缩略图生成器,放到每次初始化的代码里运行一下。 这样载入的时候就不必等着转菊花啦哈哈!

具体样例参考:

https://yo1995.github.io/cht/awards/

  • 异步载入
  • 缩略图
  • 点击放大键盘翻页
  • 响应式设计
Chen Ting

Chen Ting

The page aimed to exhibit activities & achievements during Ting's undergraduate & graduate period. Meanwhile, other aspects such as lifestyles, literary work, travel notes, etc. would interweave in the narration.

Leave a Comment

Disqus might be GFW-ed. Excited!