hexo网页相册页面的制作

有些时候希望在网页中嵌入一些生活中的照片,需要我们自己制作一个照片显示的页面,该文章基于matery主题添加照片显示的页面,支持相册以及照片显示,和相册内容加密等。

该相册页面是基于matery主题完成的,不同的主题可以方式不一样,但是原理是一样的,根据自己的实际情况进行修改即可。

具体显示效果请到我的个人blog进行查看:https://hehung.top
点我进行跳转

创建相册显示页面与照片显示页面

新建相册页面

首先需要在hexo的source文件夹下面新建一个相册显示的页面,可以使用下面的语法语法进行新建一个页面。

hexo new page gallery

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bhto7IpE-1576384415025)(https://hehung-blog-respurces.oss-cn-beijing.aliyuncs.com/add_album_paper/1.jpg “gallery文件夹”)]

然后打开hexo文件夹下面的source文件夹,可以看到里面有一个index.md文件,打开该文件,输入如下的内容:

---
title: gallery
date: 2019-11-30 16:00:17
type: "gallery"
layout: "gallery"
---

PS:gallery就是等会需要进行编辑的ejs文件的名字,标题改成你期望在网页中显示的名字,可以改成“相册”

新建相片显示页面

上面的步骤只是创建了一个相册的显示页面,我们期望通过这个相册页面点进去查看我们的照片,所以还需要创建一个相片的显示页面,创建步骤如下所示:

这个与上面创建新的页面的时候有一点区别。

打开hexo的source文件下的gallery文件夹(也就是刚才创建的那个相册的页面),在里面新建几个文件夹,你虚妄有几个相册就创建几个文件夹,我这里创建了三个。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nN5UcyvQ-1576384415026)(https://hehung-blog-respurces.oss-cn-beijing.aliyuncs.com/add_album_paper/2.jpg “创建相片页面文件夹”)]

然后打开每个新建的文件夹,在每个文件夹里面新建文件index.md,在这个里面加入新的内容,如下所示,具体细节根据实际情况修改:

---
title: 韩国之行
date: 2019-12-7 23:00:17
type: "galleries"
layout: "galleries"
password: 
---

PS:galleries是显示相册的主题页面,等会需要进行编辑,显示相片的页面都是用这个type和layout,title是相册名,password是加密,乳沟你有私密相片不希望陌生人看到可以进行加密,之后只有输入了密码才能看到,后面会讲到如何实现

现在前期的准备工作都做完了,看是进行相册主题的编写了。

新建json文件

打开hexo下面的source的_data文件夹,新建一个文件名字叫做:gallery.json,这个在后面会用到。

现在可以现在网上找一些照片进行测试,比如百度图片。在网上找的照片电机右键,复制图片链接即可使用了。

打开新建的文件,输入如下内容:


[
	{
	    "name": "",
	    "cover": "",
	    "description": "",
	    "url_name": "",
	    "album": [
	    	{
		    	"img_url": "",
		    	"title": "",
		    	"describe": ""
	    	},
	   		{
		    	"img_url": "",
		    	"title": "",
		    	"describe": ""
	    	}
	    ]	
	},
	{
		"name": "",
	    "cover": "",
	    "description": "",
	    "url_name": "",
	    "album": [
			{
			    "img_url": "",
			    "title": "",
			    "describe": ""
			},
			{
			    "img_url": "",
			    "title": "",
			    "describe": ""
			}
	    ]
	},
	{
		"name": "",
	    "cover": "",
	    "description": "",
	    "url_name": "",
	    "album": [
			{
			    "img_url": "",
			    "title": "",
			    "describe": ""
			},
			{
			    "img_url": "",
			    "title": "",
			    "describe": ""
			}
		]
	}
]

json文件内容解析

- "name":相册名字 - "cover":相册封面 - "description":相册的描述 - "url_name":相册名字,这个名字需要与你的网页名字一样,便于后面编程的时候进行判断 - "album":照片的数组,数组里面的内容根据你的相片的数量决定,不一定是两个,可以任意多个 - "img_url":照片的链接 - "title":照片标题,没有使用,留作备用 - "describe":照片描述,没有使用,留作备用

PS: 你们在测试的时候可以在百度找一些照片的链接使用

创建照片的json

因为我们的网站是存放在github上面的,同时是轻量级的静态网站,空间有限,所以像照片这个大内存的文件一般都是存在云平台的,使用将相应的链接放在json文件里面,通过解析json文件就可以访问了。

我的照片都是存在网阿里云的OSS里面的,

编辑相册和照片显示页面

在主题的source的layout文件夹下新建一个文件 gallery.ejs 和 galleries.ejs。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ln9GGcOQ-1576384415027)(https://hehung-blog-respurces.oss-cn-beijing.aliyuncs.com/add_album_paper/3.jpg “新建ejs文件”)]

PS:

  • gallery.ejs: 相册页面
  • galleries.ejs:照片内容页面

编辑相册页面

打开gallery.ejs

输入一下内容:


<%- partial('_partial/bg-cover') %>

<!-- Created by hehung on 20191208 -- >
<!-- 增加相册显示的特效样式 -->
<style>
    .text_des{
        position: absolute;
        width: 92%;
        height: 100%;
        top: 0;
        color: #000;
    /*    opacity: 0;     */
        overflow: hidden;
    }
    .text_des h3{
        margin: 5px 0 8px 0px;
        right: 40px;
        font-size: 1.5rem;
        font-weight: bold;
        line-height: 1.7rem;
        position: absolute;
        top: 10%;
        font-style: italic;
        text-shadow: 2px 2px 10px rgba(0, 0, 0, 0.3);
    /*    transform: translateX(200px);  */
    }
    .text_des p{
        left: 15px;
        position: absolute;
        top: 50%;
    /*    transform: translateX(-200px); 
        transition-delay: 0.2s;    */
    }
    .my-gallery .photo img {
        border-radius: 1px;
    }

     /*大屏幕下(桌面类)的样式*/
    @media only screen and (min-width: 993px) {
        .text_des h3{
            transform: translateX(200px);
        }
        .text_des p{
            transform: translateX(-200px); 
            transition-delay: 0.2s;
        }
        .animate-text {
            opacity: 0;
            transition: all 0.6s ease-in-out; 
        }
        .img-item {
            transition: all 0.4s ease-out;
        }
        .img-item a img{
            opacity: 1;
            transition: all 0.4s ease-out;
        }
        .img-item a:hover img{
            opacity: 0.5;
            transform: scale(1.05);
        }
        .img-item a:hover .text_des{
        /*    opacity: 1;   */
            transform: scale(1.05); 
        }
        .img-item a:hover .animate-text{
            transform: translateX(0);
            opacity: 1; 
        }
    }


    /*小屏幕下(桌面类)的样式*/
    @media only screen and (max-width: 992px) {
        .img-item a img{
            opacity: 0.75;
        }
        .animate-text {
            opacity: 1;
        }
    }

</style>

<main class="content">
    <div class="container chip-container">
        <div class="card">
            <div class="card-content">
                <div class="tag-title center-align">
                    <i class="<%- theme.gallery.icon %>"></i>
                    &nbsp;&nbsp;<%- theme.gallery.title %>
                </div>
                <div class="my-gallery">
                    <div class="row">
                    <!-- <li class="grid-sizer"></li> --><!-- for Masonry column width -->
                    <% if (site.data && site.data.gallery) { %>
                        <% var gallery = site.data.gallery; %>
                        <% for (var i = 0, len = gallery.length; i < len; i++) { %>
                            <% var photo = gallery[i]; %>
                            <% if (photo.cover){ %>
                            <div class="photo col s12 m6 l4" data-aos="zoom-in-up">
                                <div class="img-item">
                                    <a href="./<%- photo.url_name %>">
                                        <img src="/medias/loading.gif" data-src="<%- photo.cover %>" class="responsive-img" alt="img"+<%- i %> />
                                        <div class="text_des">
                                            <% if (photo.name || photo.description){ %>
                                                <h3 class="animate-text"><%- photo.name %></h3>
                                                <p class="animate-text"><%- photo.description %></p>
                                            <% } %>
                                            
                                        </div>
                                    </a>
                                </div>
                            </div>
                            <% } %>
                        <% } %>
                    <% } %>
                </div>
            </div>
        </div>
    </div>

    <script>
        start()
            $(window).on('scroll', function(){
             start();
        })

        function start(){
              //.not('[data-isLoaded]')选中已加载的图片不需要重新加载
            $('.container img').not('[data-isLoaded]').each(function(){
                var $node = $(this)
                if( isShow($node) ){
                    loadImg($node);
                }
            });
         }

        //判断一个元素是不是出现在窗口(视野)
        function isShow($node){
            return $node.offset().top <= $(window).height() + $(window).scrollTop();
        }
        //加载图片
        function loadImg($img){
        //.attr(值)
        //.attr(属性名称,值)
            $img.attr('src', $img.attr('data-src')); //把data-src的值 赋值给src
            $img.attr('data-isLoaded', 1);//已加载的图片做标记
        }

    </script>
    
</main>

代码分析

CSS代码就不用分析了吧,这里面是对相册页面的装饰。
后面的script里面的内容是为了实现懒加载,在这里需要在你们的medias文件夹下面放入一个用于懒加载的图片loading.gif。
可以实现懒加载功能。

上面的代码中使用了_config.yml里面的内容,这个里面的内容也是我新加的。


# 增加了图片页面
gallery: 
  title: 我的相册   #标题
  icon: fa fa-images            #这个显示相册页面的图标
  icon2: fa fa-image            #这个显示自己的具体相册里面的相册的图标

PhotoVerifyPassword:
  enable: true
  promptMessage: 该相册已加密,请输入密码访问
  errorMessage: 密码错误,将返回主页!


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hP7hA6sI-1576384415027)(https://hehung-blog-respurces.oss-cn-beijing.aliyuncs.com/add_album_paper/4.jpg “添加内容”)]

其实这个代码没有多少解释的很简单,都能看懂。

照片显示页面代码编辑

打开新建的文件galleries.ejs,输入如下内容:


<!-- 加密功能 -->
<% if (theme.PhotoVerifyPassword.enable) { %>
    <script src="<%- theme.libs.js.crypto %>"></script>
    <script>
        (function() {
            let pwd = '<%- page.password %>';

            if (pwd && pwd.length > 0) {
                if (pwd !== CryptoJS.SHA256(prompt('<%- theme.PhotoVerifyPassword.promptMessage %>')).toString(CryptoJS.enc.Hex)) {
                    alert('<%- theme.PhotoVerifyPassword.errorMessage %>');
                    location.href = '<%- url_for("/")  %>';
                }
            }
        })();
    </script>
<% } %>

<%- partial('_partial/bg-cover') %>

<link rel="stylesheet" href="<%- theme.libs.css.baguetteBoxCss %>">
<!-- 该主题自带的lightGallery.js在图片多的时候会很卡,所以弃用,使用了一个我在网上找的baguetteBox,很轻量级,就是功能少了点 -->
<script src="<%- theme.libs.js.baguetteBoxJs %>"></script> 
<style>    
    .my-gallery .photo img {
        transition: all 0.3s ease-in-out; 
    }     
    .my-gallery .photo:hover img {
        opacity: 0.6;
        transform: scale(1.05);
    }                
</style>

<main class="content">
    <div class="container chip-container">
        <div class="card">
            <div class="card-content">
                <div class="tag-title center-align">
                    <i class="<%- theme.gallery.icon2 %>"></i>
                    &nbsp;&nbsp;<%- page.title %>
                </div>

                <!-- 相册 -->
                <section class="gallery">
                    <div id="myGallery" class="my-gallery">
                        <div class="row">
                            <% if (site.data && site.data.gallery) { %>
                                <% var galleries = site.data.gallery; 
                                    var pageTitle = page.title;
                                    function getCurrentGallery(galleries, pageTitle) {
                                        for (let i = 0; i < galleries.length; i++) {
                                            if (galleries[i]['name'] == pageTitle) {
                                                return galleries[i];
                                            }
                                        }
                                    }
                                    var currentGallery = getCurrentGallery(galleries, pageTitle);
                                    var photos = currentGallery.album;
                                %>
                                <% for (var i = 0, len = photos.length; i < len; i++) { %>
                                    <% var my_album = photos[i]; %>
                                    <div class="photo col s12 m6 l4" data-aos="fade-up">
                                        <a href="<%- my_album.img_url %>" data-caption="<%- my_album.title %>">
                                            <img class="mat" src="/medias/loading.gif" data-src="<%- my_album.img_url %>" alt="img"+<%- i %> >
                                        </a>
                                    </div>
                                <% } %>
                            <% } %>
                        </div>
                    </div>
                </section>
            </div>
        </div>
    </div>

<script>
    baguetteBox.run('.gallery', {
        // 配置参数
        buttons:Boolean,//是否显示导航按钮。
        noScrollbars:true,//是否在显示时隐藏滚动条。
        titleTag:true,//是否使用图片上的title属性作为图片标题
        async:false,//是否异步加载文件。
        /*
        afterShow:function(){//显示遮罩层之后的回调函数。   
           $(".pressing").fadeIn();
        },
        afterHide:function(){//隐藏遮罩层之后的回调函数。 
           $(".pressing").fadeOut(); 
        }
        //preload:5 预加载多少个文件。
        // onChange: function(currentIndex, imagesCount){} 图片改变时的回调函数 
        // overlayBackgroundColor:'rgba(0,0,0,0.8)' 遮罩层的背景颜色
        */
    });

    start()
        $(window).on('scroll', function(){
         start();
    })

    function start(){
          //.not('[data-isLoaded]')选中已加载的图片不需要重新加载
        $('.container img').not('[data-isLoaded]').each(function(){
            var $node = $(this)
            if( isShow($node) ){
                loadImg($node);
            }
        });
     }

    //判断一个元素是不是出现在窗口(视野)
    function isShow($node){
        return $node.offset().top <= $(window).height() + $(window).scrollTop();
    }
    //加载图片
    function loadImg($img){
    //.attr(值)
    //.attr(属性名称,值)
        $img.attr('src', $img.attr('data-src')); //把data-src的值 赋值给src
        $img.attr('data-isLoaded', 1);//已加载的图片做标记
    }

</script>

</main>

代码解析

最上面的代码时加密代码,可以实现加密功能,但是加密是进行SHA256加密的,所以在加密前需要先将你的密码转换成SHA256格式然后输入到最上面的创建相片页面的index.md的password里面。
至于SHA256加密,在网上一搜就有了。

PS:在相片显示的页面有放大功能,就是点击图片,可以放大显示,本来想直接使用该主题知道的 lightgallery.js 来实现的,但是由于图片比较多,每张图片比较大,使用lightgallery打开的时候会很卡,所以我在网站找到了另外一个js文件,可以进行放大显示,而且不卡。

可以点击此处下载:点我下载

我将这两个文件放在了主题的如下的路径:source\libs\MyGallery

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-74mmrZOD-1576384415027)(https://hehung-blog-respurces.oss-cn-beijing.aliyuncs.com/add_album_paper/6.jpg “MyGallery”)]

同时在_config.yml文件里面加入js和css的路径。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VZrvLzaP-1576384415027)(https://hehung-blog-respurces.oss-cn-beijing.aliyuncs.com/add_album_paper/7.jpg “加载路径”)]

在主题导航栏加入相册按钮

我将相册按钮加载了about下面,这个位置根据实际情况进行添加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cvk753Lw-1576384415028)(https://hehung-blog-respurces.oss-cn-beijing.aliyuncs.com/add_album_paper/8.jpg “相册按钮”)]

显示效果

只有加密效果可以自己去试一下,我已经测试过了,可以正常使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZK2K4M8u-1576384415028)(https://hehung-blog-respurces.oss-cn-beijing.aliyuncs.com/add_album_paper/9.jpg “相册页面效果”)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMlAaQTG-1576384415028)(https://hehung-blog-respurces.oss-cn-beijing.aliyuncs.com/add_album_paper/99.jpg “相片页面的效果”)]

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值