Spaces:
Running
Running
// ------------------------------------------------ | |
// Author: dimsemenov | |
// Author URI: https://github.com/dimsemenov | |
// File name: gallery-init.js | |
// https://codepen.io/dimsemenov/pen/ZYbPJM | |
// ------------------------------------------------ | |
var initPhotoSwipeFromDOM = function(gallerySelector) { | |
// parse slide data (url, title, size ...) from DOM elements | |
// (children of gallerySelector) | |
var parseThumbnailElements = function(el) { | |
var thumbElements = el.childNodes, | |
numNodes = thumbElements.length, | |
items = [], | |
figureEl, | |
linkEl, | |
size, | |
item; | |
for (var i = 0; i < numNodes; i++) { | |
figureEl = thumbElements[i]; // <figure> element | |
// include only element nodes | |
if (figureEl.nodeType !== 1) { | |
continue; | |
} | |
linkEl = figureEl.children[0]; // <a> element | |
size = linkEl.getAttribute('data-size').split('x'); | |
// create slide object | |
item = { | |
src: linkEl.getAttribute('href'), | |
w: parseInt(size[0], 10), | |
h: parseInt(size[1], 10) | |
}; | |
if (figureEl.children.length > 1) { | |
// <figcaption> content | |
item.title = figureEl.children[1].innerHTML; | |
} | |
if (linkEl.children.length > 0) { | |
// <img> thumbnail element, retrieving thumbnail url | |
item.msrc = linkEl.children[0].getAttribute('src'); | |
} | |
item.el = figureEl; // save link to element for getThumbBoundsFn | |
items.push(item); | |
} | |
return items; | |
}; | |
// find nearest parent element | |
var closest = function closest(el, fn) { | |
return el && (fn(el) ? el : closest(el.parentNode, fn)); | |
}; | |
// triggers when user clicks on thumbnail | |
var onThumbnailsClick = function(e) { | |
e = e || window.event; | |
e.preventDefault ? e.preventDefault() : e.returnValue = false; | |
var eTarget = e.target || e.srcElement; | |
// find root element of slide | |
var clickedListItem = closest(eTarget, function(el) { | |
return (el.tagName && el.tagName.toUpperCase() === 'FIGURE'); | |
}); | |
if (!clickedListItem) { | |
return; | |
} | |
// find index of clicked item by looping through all child nodes | |
// alternatively, you may define index via data- attribute | |
var clickedGallery = clickedListItem.parentNode, | |
childNodes = clickedListItem.parentNode.childNodes, | |
numChildNodes = childNodes.length, | |
nodeIndex = 0, | |
index; | |
for (var i = 0; i < numChildNodes; i++) { | |
if (childNodes[i].nodeType !== 1) { | |
continue; | |
} | |
if (childNodes[i] === clickedListItem) { | |
index = nodeIndex; | |
break; | |
} | |
nodeIndex++; | |
} | |
if (index >= 0) { | |
// open PhotoSwipe if valid index found | |
openPhotoSwipe(index, clickedGallery); | |
} | |
return false; | |
}; | |
// parse picture index and gallery index from URL (#&pid=1&gid=2) | |
var photoswipeParseHash = function() { | |
var hash = window.location.hash.substring(1), | |
params = {}; | |
if (hash.length < 5) { | |
return params; | |
} | |
var vars = hash.split('&'); | |
for (var i = 0; i < vars.length; i++) { | |
if (!vars[i]) { | |
continue; | |
} | |
var pair = vars[i].split('='); | |
if (pair.length < 2) { | |
continue; | |
} | |
params[pair[0]] = pair[1]; | |
} | |
if (params.gid) { | |
params.gid = parseInt(params.gid, 10); | |
} | |
return params; | |
}; | |
var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) { | |
var pswpElement = document.querySelectorAll('.pswp')[0], | |
gallery, | |
options, | |
items; | |
items = parseThumbnailElements(galleryElement); | |
// define options (if needed) | |
options = { | |
showHideOpacity: true, | |
// define gallery index (for URL) | |
galleryUID: galleryElement.getAttribute('data-pswp-uid'), | |
getThumbBoundsFn: function(index) { | |
// See Options -> getThumbBoundsFn section of documentation for more info | |
var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail | |
pageYScroll = window.pageYOffset || document.documentElement.scrollTop, | |
rect = thumbnail.getBoundingClientRect(); | |
return { | |
x: rect.left, | |
y: rect.top + pageYScroll, | |
w: rect.width | |
}; | |
} | |
}; | |
// PhotoSwipe opened from URL | |
if (fromURL) { | |
if (options.galleryPIDs) { | |
// parse real index when custom PIDs are used | |
// http://photoswipe.com/documentation/faq.html#custom-pid-in-url | |
for (var j = 0; j < items.length; j++) { | |
if (items[j].pid == index) { | |
options.index = j; | |
break; | |
} | |
} | |
} else { | |
// in URL indexes start from 1 | |
options.index = parseInt(index, 10) - 1; | |
} | |
} else { | |
options.index = parseInt(index, 10); | |
} | |
// exit if index not found | |
if (isNaN(options.index)) { | |
return; | |
} | |
if (disableAnimation) { | |
options.showAnimationDuration = 0; | |
} | |
// Pass data to PhotoSwipe and initialize it | |
gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options); | |
gallery.init(); | |
}; | |
// loop through all gallery elements and bind events | |
var galleryElements = document.querySelectorAll(gallerySelector); | |
for (var i = 0, l = galleryElements.length; i < l; i++) { | |
galleryElements[i].setAttribute('data-pswp-uid', i + 1); | |
galleryElements[i].onclick = onThumbnailsClick; | |
} | |
// Parse URL and open gallery if it contains #&pid=3&gid=1 | |
var hashData = photoswipeParseHash(); | |
if (hashData.pid && hashData.gid) { | |
openPhotoSwipe(hashData.pid, galleryElements[hashData.gid - 1], true, true); | |
} | |
}; | |
// execute above function | |
initPhotoSwipeFromDOM('.my-gallery'); |