博客已遷移至http://lwzhang.github.io。css
基本上全部的hexo
主題默認都沒有實現相冊功能,一方面相冊功能的需求較少,畢竟hexo
主要是寫博客用的;另外一方面實現相冊功能比較麻煩,好比說:html
圖片放哪裏,放在source
文件夾中,須要解析成靜態文件,圖片一旦多的話就會解析的很是慢node
怎麼批量獲取圖片url
(文件名),圖片那麼多,不可能一個一個的手動輸入圖片url
jquery
等等git
因此須要找到一個好的解決方法。github
注意:本博客使用的是yilia
主題,該主題做者litten有實現了相冊功能,但他是同步instagram
的圖片,我會用不一樣的方法實現一個相冊功能。json
hexo new page "photo"
hexo
執行上面命令,會在source
文件夾中生成photo
文件夾,打開photo
文件夾中的index.md
文件,修改內容以下:app
title: 相冊 noDate: 'true' --- <link type="text/css" href="/fancybox/jquery.fancybox.css" rel="stylesheet"> <div class="instagram"><section class="archives album"><ul class="img-box-ul"></ul></section></div>
相冊的樣式使用該主題做者的相冊樣式,若是你們使用其餘主題,樣式能夠本身實現。ui
圖片不能放在source
文件中,由於須要編譯成靜態文件,很是慢,那放在哪好呢?通常咱們會把博客備份到github
,這樣能夠在不一樣電腦上寫博客。那麼咱們也能夠把相冊一塊兒上傳到github
,因此,在博客根目錄下建一個放置圖片的文件夾photos
,這樣你上傳再多的圖片均可以。
原生js
不能很好的處理文件,因此用js
並不能獲取圖片的文件名。雖然js
不能處理文件,可是nodejs
能夠啊。在source\photo
文件夾中新建一個tool.js
文件,內容以下:
"use strict"; const fs = require("fs"); const path = "../../photos"; fs.readdir(path, function (err, files) { if (err) { return; } let arr = []; (function iterator(index) { if (index == files.length) { fs.writeFile("output.json", JSON.stringify(arr, null, "\t")); return; } fs.stat(path + "/" + files[index], function (err, stats) { if (err) { return; } if (stats.isFile()) { arr.push(files[index]); } iterator(index + 1); }) }(0)); });
tool.js
的做用是把全部的圖片名稱放在一個json
文件中。運行node tool.js
就會在source\photo
下建立一個output.json
文件。每次你要添加新圖片時,都要運行node tool.js
。
有了這個json
文件,接下來就要用到js
生成html
代碼了。
html
代碼在yourBlog\themes\yilia\source\js
(yourBlog
爲你的博客根目錄,將yilia
替換爲你使用的主題)文件夾下新建一個photo.js
的文件夾。爲何在這裏建呢?由於編譯以後會出如今public\js
文件夾中,博客使用的js
都在這。
photo.js
代碼以下:
define([], function () { return { page: 1, offset: 20, init: function () { var that = this; $.getJSON("/photo/output.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, li = ""; for (var i = begin; i < end && i < data.length; i++) { li += '<li><div class="img-box">' + '<a class="img-bg" rel="example_group" href="https://github.com/lwzhang/blog/blob/master/photos/' + data[i] + '?raw=true"></a>' + '<img lazy-src="https://github.com/lwzhang/blog/blob/master/photos/' + data[i] + '?raw=true" />' + '</li>'; } $(".img-box-ul").append(li); $(".img-box-ul").lazyload(); $("a[rel=example_group]").fancybox(); }, scroll: function (data) { var that = this; $(window).scroll(function() { var windowPageYOffset = window.pageYOffset; var windowPageYOffsetAddHeight = windowPageYOffset + window.innerHeight; var sensitivity = 0; var offsetTop = $(".instagram").offset().top + $(".instagram").height(); if (offsetTop >= windowPageYOffset && offsetTop < windowPageYOffsetAddHeight + sensitivity) { that.render(++that.page, data); } }) } } })
其中https://github.com/lwzhang/blog/blob/master/photos/' + data[i] + '?raw=true
是上傳至github
的圖片連接。
由於不可能一次性將全部的圖片都插入到頁面中,因此我作了分頁功能,一次加載20張圖片。
引入photo.js
最直接的方法是在index.md
文件中引入:
title: 相冊 noDate: 'true' --- <link type="text/css" href="/fancybox/jquery.fancybox.css" rel="stylesheet"> <div class="instagram"><section class="archives album"><ul class="img-box-ul"></ul></section></div> <script src="/js/photo.js"></script>
若是你們和我用的是同一主題,在yourBlog\themes\yilia\source\js\main.js
文件末尾增長以下代碼:
if($(".instagram").length) { require(['/js/photo.js', '/fancybox/jquery.fancybox.js', '/js/jquery.lazyload.js'], function(obj) { obj.init(); }); }
若是不是,看你們使用的主題有什麼限制了。
別忘了要在主題的配置文件_config.yml
的menu
下添加一個相冊的菜單:
menu: 首頁: / 歸檔: /archives 隨筆: /tags/隨筆 相冊: photo
最後運行hexo g
生成靜態文件。就能夠在本地查看或者上傳github
查看相冊功能了。
相冊功能就完成了。
你們能夠看一下個人我的博客相冊功能:http://lwzhang.github.io/photo/