如何在Hexo中实现自适应响应式相册功能

用最清晰简洁的方法整合一个响应式相册
示意图

效果

技术选型

  • 由于我选用的主题使用了fancyBox作为图片弹出展示的框架,查看后表示很不错,能满足需要
    http://fancyapps.com/fancybox/3/
  • 图片加载可能会太慢,所以还需要一个图片延迟加载插件 Lazyload
  • 想使用瀑布流作为展示,粗略了解了下,便使用开源的MiniGrid,原因是它很小巧也刚好满足需求(ps:它的文档让我看了很捉急,不完善的文档是个大坑)

相册文件夹

按照Hexo官方给的建议

资源(Asset)代表 source 文件夹中除了文章以外的所有文件,例如图片、CSS、JS 文件等。比方说,如果你的Hexo项目中只有少量图片,那最简单的方法就是将它们放在 source/images 文件夹中。然后通过类似于 ![](/images/image.jpg) 的方法访问它们。
对于那些想要更有规律地提供图片和其他资源以及想要将他们的资源分布在各个文章上的人来说,Hexo也提供了更组织化的方式来管理资源。这个稍微有些复杂但是管理资源非常方便的功能可以通过将 config.yml 文件中的 post_asset_folder 选项设为 true 来打开。

post_asset_folder: true

然后就可以在文件夹source下新建一个相册文件夹Images,将照片放入这个文件夹

相册页面

我们需要一个相册页面以加载所有照片

---
title: 相册
noDate: 'true'
---
<script src="https://cdn.bootcss.com/jquery_lazyload/1.9.7/jquery.lazyload.js"></script>
<script src="https://unpkg.com/minigrid@3.1.1/dist/minigrid.min.js"></script><div class="ImageGrid"></div><script src="/js/photo.js"></script>

这里使用noDate来自定义一些HTML数据,加载一些JS文件(minigrid在bootcss中还是1.*的版本,只好使用它推荐的cdn了),其中photo.js是自定义的,用来加载照片,稍后提到。
现在,我们就有一个相册页面了,接下来的问题是怎么批量加载那些照片。

脚本

大家可以集思广益,我是用的是一个教程中的脚本改的,与其思路一致。
在博客主文件夹下新建tool.js

"use strict";const fs = require("fs");const sizeOf = require('image-size');const path = "./source/Images";const outputfile = "./source/Images/output.json";var dimensions;fs.readdir(path, function (err, files) {if (err) {return;}let arr = [];(function iterator(index) {if (index == files.length) {fs.writeFile(outputfile, 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));});

每次在相册中更新照片后都要在控制台node tool.js一下,以便更新数据。
它会生成一个json文件,带有每张照片的长宽及文件名。
需要它的宽高是因为我们需要它满足瀑布流样式。
output.json样式类似于:

["3120.4160 发票.jpg","516.516 头像.jpg","402.180 录音.jpeg","720.758 截图1.jpg","720.978 截图2.jpg"
]

photo.js

photo ={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 += '<div class="card">' +'<div class="ImageInCard">' + '<a data-fancybox="gallery" href="/Images/' + data[i] + '">' +'<img src="/Images/' + data[i] + '"/>' +'</a>' +'</div>' +'<div class="TextInCard">'+data[i].split('.')[0]+'</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();

js文件也可以放在Images文件夹下,只需要将相册页面加载的<script src="/js/photo.js"></script>改成<script src="/Images/photo.js"></script>即可。

css

这个样式是我自己写的,大家可以按照自己的想法自行更改:

.ImageGrid {width: 100%;max-width: 1040px;margin: 0 auto;text-align: center;}
.card {width:160px;height:260px;overflow: hidden;}
.ImageInCard {height:185px}
.ImageInCard img {height:100%;width: auto;padding: 0 0 0 0; }
.TextInCard {height:75;background-color: #fff;}

自动构建

我是使用travis-ci自动构建的。(用过以后表示很鸡肋)
如果你也使用了这个的话,在travis.yml中的script或者before_script,添加一句node tool.js,就可以将相册脚本也加入自动构建:

script:- node tool.js- hexo g

转载于:https://www.cnblogs.com/fchange/p/8465144.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue css动画

.toggle-cart-enter-active, .toggle-cart-leave-active { transition: all .3s ease-out; } .toggle-cart-enter, .toggle-cart-leave-active { transform: translateY(100%); }

luinx php木马,Linux Bash Shell 寻找PHP(网站)挂马,后门

一php后门木马常用的函数大致上可分为四种类型&#xff1a;1. 执行系统命令: system, passthru, shell_exec, exec, popen, proc_open2. 代码执行与加密: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot133. 文件包含与生成: requir…

关于类型安全的思考

这两天一初学python的哥们频频吐槽C#这样赋值时对类型的检查,让问题变难变复杂了. 解释几次类型检查的好处,效果不明显. 我也反思了一下, 类型检查真的是额外的包袱么?答案 是忠言逆耳利于行。 你是君王&#xff0c;语言是臣子,在君王犯错的时候: 一个臣子在事后说“你让我干的…

适用于MongoDB和Mongometer的SpiderMonkey至V8

通过10gen将MongoDB 2.3 / 2.4的默认JavaScript引擎从SpiderMonkey切换到V8&#xff0c;我想我将借此机会使用mongometer比较这些发行版的相对性能。 作为安全专家&#xff0c;我真的应该首先研究“ 其他身份验证功能” ……嘿。 我将记录比较过程中所采取的步骤&#xff08;包…

vue todolist

最近初学vue&#xff0c;做最简单的todolist <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>todolist</title><style type"text/css">#container{width: 700px;height: 100px;padding: 40px;margin…

python函数-函数进阶

python函数-函数进阶 一、命名空间和作用域 1.命名空间 内置命名空间 —— python解释器     就是python解释器一启动就可以使用的名字存储在内置命名空间中     内置的名字在启动解释器的时候被加载进内存里全局命名空间 —— 我们写的代码但不是函数中的代码 …

php年龄查询表单设计,PHP 处理表单

用户评论:behnam jaza faza (2013-06-24 07:22:28)The note above says:"Also see the import_request_variables() function. "But dont:This function has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.Andy (2012-04-14 00:05:21)Just a reminde…

152. Maximum Product Subarray动态规划连乘最大子串

Find the contiguous subarray within an array (containing at least one number)which has the largest product.For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product 6. /*首先想到了和最大相加子串问题&#xff0c;但是不同的…

使用Maven Jetty插件

尽管很长一段时间以来我一直在使用Maven&#xff0c;但直到最近我才使用过Jetty插件。 为了能够测试REST客户端&#xff0c;我创建了一个Servlet&#xff0c;向我显示了所有传入的参数和带有传入请求的标头。 为了在容器中运行servlet&#xff0c;我决定尝试使用Maven Jetty插件…

百度联盟广告如何理解按父容器宽度

创建百度联盟广告位的时候&#xff0c;选择按父容器宽度展示&#xff0c;但是在加入之后&#xff0c;查看代码发现广告的宽度为页面的宽度&#xff0c;并不是希望的父级的宽度&#xff0c; 如图在这里查看&#xff1a; 解析&#xff1a;百度联盟广告自动生成的div按父级的div宽…

WPF中通过AForge实现USB摄像头拍照

最近由于某种原因呢&#xff0c;需要做一下拍照的功能&#xff0c;本来我纠结到底用AForge类库还是用WPFMediaKit.dll &#xff0c;不过后来看网上说WPFMediaKit.dll 是截图而AForge是直接通过摄像头拍照&#xff0c;于是乎&#xff0c;我就选择了AForge类库。 首先留下发帖时我…

php中文字转,PHP文字转图片功能原理与实现方法分析

本文实例讲述了PHP文字转图片功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;这项功能主要用于对邮箱地址、手机等可能被网络爬虫抓取的重要信息的处理。将文字转化为图片绝对是个好注意。验证码的基本生成原理也与此差不多&#xff0c;只是对再对文字转化为图片的…

Java接口的防御性API演进

API的发展绝对是不平凡的。 只有少数几个需要处理的事情。 我们大多数人每天都在使用内部专有API。 现代IDE附带了很棒的工具&#xff0c;可以分解&#xff0c;重命名&#xff0c;上拉&#xff0c;下推&#xff0c;间接&#xff0c;委托&#xff0c;推断&#xff0c;泛化我们的…

sql语句查询各门课程平均分的最大值

解法一&#xff1a; select courseno,stuno,avg(score) 平均分最高值--这里是求平均&#xff0c;后面的条件是过滤最大值的 from tablename group by courseno,stuno having avg(score) > all (select avg(score) sco--这里是过滤最大值 from tablename group by courseno) …

(转)用JS实现表格中隔行显示不同颜色

用JS实现表格中隔行显示不同颜色 第一种&#xff1a; <style> tr{bgColor:expression( this.bgColor((this.rowIndex)%20 )? white : yellow); } </style> <table id"oTable" width"100" border"1" style"border-colla…

Java 系列之spring学习--spring搭建(一)

一、新建maven项目 二、引入spring jar包 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0…

php简单分页,php简单实现分页查询的方法

这篇文章主要为大家详细介绍了php简单实现分页查询的方法&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下关于php,最近学了好多&#xff0c;老师跟我们说&#xff0c;现在学的都是php的核心部分&#xff0c;所以我比较注意了一下&#xff0c;也多练习…

Java Collections API怪癖

因此&#xff0c;当涉及到Java Collections API时&#xff0c;我们倾向于认为已经了解了所有内容。 我们知道我们的身边方式列表 &#xff0c; 设置 &#xff0c; 地图 &#xff0c; Iterables &#xff0c; 迭代器 。 我们已经为Java 8的Collections API增强做好了准备。 但是…

笔记 — 动画效果(Css3)

/*** animation-name: 调用 keyframes 所定义的动画* animation-duration: 动画周期所花费的时间长度* animation-timing-function: 规定动画的速度曲线* animation-delay: 延时执行动画的时间* animation-iteration-count: 动画执行的次数* animation-dircetion: 规定动画下一…

可命名元组namedtuple

import collectionsMytupleClass collections.namedtuple(MytupleClass,[x,y,z])objMytupleClass(11,22,33)print(obj.x)print(obj.y)print(obj.z)print(dir(obj))print(help(obj))转载于:https://www.cnblogs.com/POP-w/p/7412278.html