PhotoSwipe support
This commit is contained in:
parent
ee6246379b
commit
aae34f128c
@ -0,0 +1,39 @@
|
||||
---
|
||||
title: Photoswipe Gallery Sample
|
||||
subtitle: Making a Gallery
|
||||
date: 2017-03-20
|
||||
tags: ["example", "photoswipe"]
|
||||
---
|
||||
|
||||
Beautiful Hugo adds a few custom shortcodes created by [Li-Wen Yip](https://www.liwen.id.au/photoswipe/) and [Gert-Jan van den Berg](https://github.com/GjjvdBurg/HugoPhotoSwipe) for making galleries with [PhotoSwipe](photoswipe.com) .
|
||||
|
||||
{{< gallery >}}
|
||||
{{< figure thumb="-thumb" link="/img/hexagon.jpg" >}}
|
||||
{{< figure thumb="-thumb" link="/img/sphere.jpg" alt="Sphere">}}
|
||||
{{< figure thumb="-thumb" link="/img/triangle.jpg" alt="Triangle" caption="This is a long comment about a triangle">}}
|
||||
{{< /gallery >}}
|
||||
{{< pswp-init >}}
|
||||
|
||||
<!--more-->
|
||||
## Example
|
||||
The above gallery was created using the following shortcodes:
|
||||
```
|
||||
{{</* gallery */>}}
|
||||
{{</* figure thumb="-thumb" link="/img/hexagon.jpg" */>}}
|
||||
{{</* figure thumb="-thumb" link="/img/sphere.jpg" */>}}
|
||||
{{</* figure thumb="-thumb" link="/img/triangle.jpg" */>}}
|
||||
{{</* /gallery */>}}
|
||||
{{</* pswp-init */>}}
|
||||
```
|
||||
|
||||
## Usage
|
||||
As described on the [GitHub](https://github.com/liwenyip/hugo-pswp) page:
|
||||
|
||||
* Call `{{</* pswp-init */>}}` **once** anywhere you want on each page where you want to use PhotoSwipe
|
||||
* `{{</* figure src="image.jpg" */>}}` will use `image.jpg` for thumbnail and lightbox
|
||||
* `{{</* figure src="thumb.jpg" link="image.jpg" */>}}` will use `thumb.jpg` for thumbnail and `image.jpg` for lightbox
|
||||
* `{{</* figure thumb="-small" link="image.jpg" */>}}` will use `image-small.jpg` for thumbnail and `image.jpg` for lightbox
|
||||
* `{{</* figure thumb="-small" link="image.jpg" size="1024x768 "*/>}}` will avoid needing to pre-load `image.jpg` to determine its size (optional)
|
||||
* All the [features/parameters](https://gohugo.io/extras/shortcodes) of Hugo's built-in `figure` shortcode work as normal, i.e. src, link, title, caption, class, attr (attribution), attrlink, alt
|
||||
* `{{</* figure src="image.jpg" class="pswp-ignore" */>}}` will be ignored by PhotoSwipe (if that's what you really want)
|
||||
* enclose your figures in `{{</* gallery title="title of your gallery (optional)" */>}}` and `{{</* /gallery */>}}` to arrange your thumbnails inside a box
|
@ -196,8 +196,11 @@
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.7.1/katex.min.js" integrity="sha384-/y1Nn9+QQAipbNQWU65krzJralCnuOasHncUFXGkdwntGeSvQicrYkiUBwsgUqc1" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.7.1/contrib/auto-render.min.js" integrity="sha384-dq1/gEHSxPZQ7DdrM82ID4YVol9BYyU7GbWlIwnwyPzotpoc57wDw/guX8EaYGPx" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.js" integrity="sha256-UplRCs9v4KXVJvVY+p+RSo5Q4ilAUXh7kpjyIP5odyc=" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe-ui-default.min.js" integrity="sha256-PWHOlUzc96pMc8ThwRIXPn8yH4NOLu42RQ0b9SpnpFk=" crossorigin="anonymous"></script>
|
||||
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
|
||||
<script src="{{ .Site.BaseURL }}/js/pswp-init.js"></script>
|
||||
<script src="{{ .Site.BaseURL }}/js/main.js"></script>
|
||||
<script src="{{ .Site.BaseURL }}/js/highlight.min.js"></script>
|
||||
<script> hljs.initHighlightingOnLoad(); </script>
|
||||
|
@ -18,7 +18,10 @@
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" />
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" />
|
||||
<link rel="stylesheet" href="{{ .Site.BaseURL }}/css/pygment_highlights.css" />
|
||||
<link rel="stylesheet" href="{{ .Site.BaseURL }}/css/highlight.min.css">
|
||||
<link rel="stylesheet" href="{{ .Site.BaseURL }}/css/highlight.min.css" />
|
||||
<link rel="stylesheet" href="{{ .Site.BaseURL }}/css/pswp-gallery.css" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.css" integrity="sha256-sCl5PUOGMLfFYctzDW3MtRib0ctyUvI9Qsmq2wXOeBY=" crossorigin="anonymous" />
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/default-skin/default-skin.min.css" integrity="sha256-BFeI1V+Vh1Rk37wswuOYn5lsTcaU96hGaI7OUVCLjPc=" crossorigin="anonymous" />
|
||||
|
||||
<!-- Facebook OpenGraph tags -->
|
||||
{{ if .Site.Params.fb_app_id }}
|
||||
|
14
layouts/shortcodes/figure.html
Normal file
14
layouts/shortcodes/figure.html
Normal file
@ -0,0 +1,14 @@
|
||||
<figure {{ with .Get "class" }}class="{{.}}"{{ end }} itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
|
||||
<a class="rig-cell" href="{{ with .Get "link" }}{{.}}{{ else }}{{ .Get "src" }}{{ end }}" {{ with .Get "size" }}data-size="{{.}}"{{ end }} itemprop="contentUrl">
|
||||
<img class="rig-img" itemprop="thumbnail"
|
||||
src="{{ with .Get "src" }}{{.}}{{ else }}{{ printf "%s." (.Get "thumb") | replace (.Get "link") "." }}{{ end }}"
|
||||
{{ with .Get "alt" }}alt="{{.}}"{{ end }}
|
||||
{{ with .Get "width" }}width="{{.}}"{{ end }}/>
|
||||
<span class="rig-overlay"></span>
|
||||
<span class="rig-text">{{ .Get "alt"}}</span>
|
||||
</a>
|
||||
<figcaption itemprop="caption description">
|
||||
{{ .Get "caption"}}
|
||||
<!--<span itemprop="copyrightHolder">© {{ .Get "copyright"}}</span>-->
|
||||
</figcaption>
|
||||
</figure>
|
4
layouts/shortcodes/gallery.html
Normal file
4
layouts/shortcodes/gallery.html
Normal file
@ -0,0 +1,4 @@
|
||||
<div class="gallery" id="rig" itemscope itemtype="http://schema.org/ImageGallery">
|
||||
{{ .Inner }}
|
||||
<div class="title">{{ .Get "title" }}</div>
|
||||
</div>
|
47
layouts/shortcodes/pswp-init.html
Normal file
47
layouts/shortcodes/pswp-init.html
Normal file
@ -0,0 +1,47 @@
|
||||
<!-- Root element of PhotoSwipe. Must have class pswp. -->
|
||||
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
|
||||
<!-- Background of PhotoSwipe.
|
||||
It's a separate element, as animating opacity is faster than rgba(). -->
|
||||
<div class="pswp__bg"></div>
|
||||
<!-- Slides wrapper with overflow:hidden. -->
|
||||
<div class="pswp__scroll-wrap">
|
||||
<!-- Container that holds slides.
|
||||
PhotoSwipe keeps only 3 of them in DOM to save memory.
|
||||
Don't modify these 3 pswp__item elements, data is added later on. -->
|
||||
<div class="pswp__container">
|
||||
<div class="pswp__item"></div>
|
||||
<div class="pswp__item"></div>
|
||||
<div class="pswp__item"></div>
|
||||
</div>
|
||||
<!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
|
||||
<div class="pswp__ui pswp__ui--hidden">
|
||||
<div class="pswp__top-bar">
|
||||
<!-- Controls are self-explanatory. Order can be changed. -->
|
||||
<div class="pswp__counter"></div>
|
||||
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
|
||||
<button class="pswp__button pswp__button--share" title="Share"></button>
|
||||
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
|
||||
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
|
||||
<!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
|
||||
<!-- element will get class pswp__preloader--active when preloader is running -->
|
||||
<div class="pswp__preloader">
|
||||
<div class="pswp__preloader__icn">
|
||||
<div class="pswp__preloader__cut">
|
||||
<div class="pswp__preloader__donut"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
|
||||
<div class="pswp__share-tooltip"></div>
|
||||
</div>
|
||||
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
|
||||
</button>
|
||||
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
|
||||
</button>
|
||||
<div class="pswp__caption">
|
||||
<div class="pswp__caption__center"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
103
static/css/pswp-gallery.css
Normal file
103
static/css/pswp-gallery.css
Normal file
@ -0,0 +1,103 @@
|
||||
#rig {
|
||||
max-width:900px;
|
||||
margin:0 auto; /*center aligned*/
|
||||
padding:0;
|
||||
font-size:0; /* Remember to change it back to normal font size if have captions */
|
||||
list-style:none;
|
||||
}
|
||||
#rig figure {
|
||||
display: inline-block;
|
||||
*display:inline;/*for IE6 - IE7*/
|
||||
width:25%;
|
||||
vertical-align:middle;
|
||||
box-sizing:border-box;
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
|
||||
/* The wrapper for each item */
|
||||
.rig-cell {
|
||||
margin:0 12px 12px 0;
|
||||
|
||||
box-shadow:0 0 6px rgba(0,0,0,0.3);
|
||||
display:block;
|
||||
position: relative;
|
||||
overflow:hidden;
|
||||
}
|
||||
|
||||
/* If have the image layer */
|
||||
.rig-img {
|
||||
display:block;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
border:none;
|
||||
transform:scale(1);
|
||||
transition:all 1s;
|
||||
}
|
||||
|
||||
#rig figure:hover .rig-img {
|
||||
transform:scale(1.05);
|
||||
}
|
||||
|
||||
/* If have the overlay layer */
|
||||
.rig-overlay {
|
||||
position: absolute;
|
||||
display:block;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
margin: auto;
|
||||
background: #3DC0F1;
|
||||
background-size:50px 50px;
|
||||
opacity:0;
|
||||
filter:alpha(opacity=0);/*For IE6 - IE8*/
|
||||
transition:all 0.6s;
|
||||
}
|
||||
#rig figure:hover .rig-overlay {
|
||||
opacity:0.8;
|
||||
}
|
||||
|
||||
/* If have captions */
|
||||
.rig-text {
|
||||
display:block;
|
||||
padding:0 30px;
|
||||
box-sizing:border-box;
|
||||
position:absolute;
|
||||
left:0;
|
||||
width:100%;
|
||||
text-align:center;
|
||||
text-transform:capitalize;
|
||||
font-size:18px;
|
||||
font-weight:bold;
|
||||
font-family: 'Oswald', sans-serif;
|
||||
font-weight:normal!important;
|
||||
top:40%;
|
||||
color:white;
|
||||
opacity:0;
|
||||
filter:alpha(opacity=0);/*For older IE*/
|
||||
transform:translateY(-20px);
|
||||
transition:all .3s;
|
||||
}
|
||||
#rig figure:hover .rig-text {
|
||||
transform:translateY(0px);
|
||||
opacity:0.9;
|
||||
}
|
||||
|
||||
@media (max-width: 9000px) {
|
||||
#rig figure {
|
||||
width:25%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 700px) {
|
||||
#rig figure {
|
||||
width:33.33%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 550px) {
|
||||
#rig figure {
|
||||
width:50%;
|
||||
}
|
||||
}
|
BIN
static/img/hexagon-thumb.jpg
Normal file
BIN
static/img/hexagon-thumb.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
BIN
static/img/sphere-thumb.jpg
Normal file
BIN
static/img/sphere-thumb.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.0 KiB |
BIN
static/img/triangle-thumb.jpg
Normal file
BIN
static/img/triangle-thumb.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
64
static/js/pswp-init.js
Normal file
64
static/js/pswp-init.js
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
Put this file in /static/js/pswp-init.js
|
||||
*/
|
||||
$( document ).ready(function() {
|
||||
var items = []; // array of slide objects that will be passed to PhotoSwipe()
|
||||
// for every figure element on the page:
|
||||
$('figure').each( function() {
|
||||
if ($(this).attr('class') == 'pswp-ignore') return true; // ignore any figures where class="pswp-ignore"
|
||||
// get properties from child a/img/figcaption elements,
|
||||
var $figure = $(this),
|
||||
$a = $figure.find('a'),
|
||||
$src = $a.attr('href'),
|
||||
$title = $figure.find('figcaption').html(),
|
||||
$msrc = $figure.find('img').attr('src');
|
||||
// if data-size on <a> tag is set, read it and create an item
|
||||
if ($a.data('size')) {
|
||||
var $size = $a.data('size').split('x');
|
||||
var item = {
|
||||
src : $src,
|
||||
w : $size[0],
|
||||
h : $size[1],
|
||||
title : $title,
|
||||
msrc : $msrc
|
||||
};
|
||||
// if not, set temp default size then load the image to check actual size
|
||||
} else {
|
||||
var item = {
|
||||
src : $src,
|
||||
w : 800, // temp default size
|
||||
h : 600, // temp default size
|
||||
title : $title,
|
||||
msrc : $msrc
|
||||
};
|
||||
// load the image to check its dimensions
|
||||
// update the item as soon as w and h are known (check every 30ms)
|
||||
var img = new Image();
|
||||
img.src = $src;
|
||||
var wait = setInterval(function() {
|
||||
var w = img.naturalWidth,
|
||||
h = img.naturalHeight;
|
||||
if (w && h) {
|
||||
clearInterval(wait);
|
||||
item.w = w;
|
||||
item.h = h;
|
||||
}
|
||||
}, 30);
|
||||
}
|
||||
// Save the index of this image then add it to the array
|
||||
var index = items.length;
|
||||
items.push(item);
|
||||
// Event handler for click on a figure
|
||||
$figure.on('click', function(event) {
|
||||
event.preventDefault(); // prevent the normal behaviour i.e. load the <a> hyperlink
|
||||
// Get the PSWP element and initialise it with the desired options
|
||||
var $pswp = $('.pswp')[0];
|
||||
var options = {
|
||||
index: index,
|
||||
bgOpacity: 0.8,
|
||||
showHideOpacity: true
|
||||
}
|
||||
new PhotoSwipe($pswp, PhotoSwipeUI_Default, items, options).init();
|
||||
});
|
||||
});
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user