photoswipe是一款非常优秀的移动端图片查看插件,但是在使用的时候,有一个令人头疼的问题(data-size)!这个属性必须填写,且值需固定。这对我们来说是一个非常麻烦的问题,为了解决这个问题,上网搜了很多解决方案,最后还是解决了,其实主要还是图片尺寸的获取问题!代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="node_modules/photoswipe/dist/photoswipe.css">
<link rel="stylesheet" href="node_modules/photoswipe/dist/default-skin/default-skin.css">
<style>
* {
margin: 0;
padding: 0;
}
.clearfix::before,
.clearfix::after {
display: block;
content: '';
visibility: hidden;
height: 100%;
clear: both;
}
body {
padding-top: 2%;
}
.my-gallery {
width: 90%;
margin: 0 auto;
}
.my-gallery .img-dv {
width: 100%;
margin-bottom: 1%;
}
.my-gallery .img-dv a {
display: block;
width: 100%;
text-align: center
}
.my-gallery .img-dv a img {
width: 50%;
}
</style>
</head>
<body>
<!--如果有多个data-pswp-uid 它的值是不能重复的-->
<div class="my-gallery" data-pswp-uid="1">
<figure>
<div class="img-dv"><a href="img/img1-big.jpg" data-size="1920x1080"><img src="img/img1.jpg"></a></div>
<figcaption style="display:none;">在这里可增加图片描述</figcaption>
</figure>
<figure>
<div class="img-dv"><a href="img/img2-big.jpg" data-size="1920x1080"><img src="img/img2.jpg"></a></div>
<figcaption style="display:none;">在这里可增加图片描述2</figcaption>
</figure>
<figure>
<div class="img-dv"><a href="img/img3-big.jpg" data-size="1920x1080"><img src="img/img3.jpg"></a></div>
<figcaption style="display:none;">在这里可增加图片描述3</figcaption>
</figure>
<figure>
<div class="img-dv"><a href="img/img4-big.jpg" data-size="1920x1080"><img src="img/img4.jpg"></a></div>
<figcaption style="display:none;">在这里可增加图片描述4</figcaption>
</figure>
<figure>
<div class="img-dv"><a href="img/img5-big.jpg" data-size="1920x1080"><img src="img/img5.jpg"></a></div>
<figcaption style="display:none;">在这里可增加图片描述5在这里可增加图片描述5在这里可增加图片描述5</figcaption>
</figure>
</div>
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
<div class="pswp__bg"></div>
<div class="pswp__scroll-wrap">
<div class="pswp__container">
<div class="pswp__item"></div>
<div class="pswp__item"></div>
<div class="pswp__item"></div>
</div>
<div class="pswp__ui pswp__ui--hidden">
<div class="pswp__top-bar">
<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>
<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>
<script src="node_modules/photoswipe/dist/photoswipe.min.js?"></script>
<script src="node_modules/photoswipe/dist/photoswipe-ui-default.min.js"></script>
<script>
var ParseThumbnailElements = function (gallerySelector) {
this.items=[];
var slef=this;
var domelement = document.querySelectorAll(gallerySelector)[0];
var figuredoms = domelement.children;
for (var i = 0; i < figuredoms.length; i++) {
var figureEl=figuredoms[i];
var linkEl=figuredoms[i].children[0].children[0]; //a标签
var title;
var el;
var msrc;
if (figureEl.children.length > 1) {
title = figureEl.children[1].innerHTML||'';
}
if (linkEl.children.length > 0) {
msrc = linkEl.children[0].getAttribute('src')||'';
}
this.items.push({
src: linkEl.getAttribute('href'),
title:title,
el:figureEl,
msrc:msrc,
w: 0,
h: 0
})
}
var j = 0;
this.items.forEach(function (item) {
var img = new Image();
img.src = item.src;
img.onload = function () {
item.w = img.naturalWidth;
item.h = img.naturalHeight;
j++;
// console.log(j == slef.items.length); 当图片信息全部加载完再调用initPhotoSwipeFromDOM
if (j == slef.items.length) {
initPhotoSwipeFromDOM(gallerySelector, slef.items)
}
}
})
var initPhotoSwipeFromDOM = function (gallerySelector) {
// 查找最近的父节点
var closest = function closest(el, fn) {
return el && (fn(el) ? el : closest(el.parentNode, fn));
};
// 当用户点击缩略图触发
var onThumbnailsClick = function (e) {
e = e || window.event;
e.preventDefault ? e.preventDefault() : e.returnValue = false;
var eTarget = e.target || e.srcElement;
var clickedListItem = closest(eTarget, function (el) {
return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
});
if (!clickedListItem) {
return;
}
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) {
openPhotoSwipe(index, clickedGallery);
}
return false;
};
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 = slef.items;
// 这里可以定义参数
options = {
barsSize: {
top: 100,
bottom: 100
},
fullscreenEl: false,
shareButtons: [
{ id: 'wechat', label: '分享微信', url: '#' },
{ id: 'weibo', label: '新浪微博', url: '#' },
{ id: 'download', label: '保存图片', url: '{{raw_image_url}}', download: true }
],
galleryUID: galleryElement.getAttribute('data-pswp-uid'),
getThumbBoundsFn: function (index) {
var thumbnail = slef.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 };
}
};
if (fromURL) {
if (options.galleryPIDs) {
for (var j = 0; j < items.length; j++) {
if (items[j].pid == index) {
options.index = j;
break;
}
}
} else {
options.index = parseInt(index, 10) - 1;
}
} else {
options.index = parseInt(index, 10);
}
if (isNaN(options.index)) {
return;
}
if (disableAnimation) {
options.showAnimationDuration = 0;
}
gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, slef.items, options);
gallery.init();
};
var galleryElements = document.querySelectorAll(gallerySelector);
for (var i = 0; i < galleryElements.length; i++) {
galleryElements[i].setAttribute('data-pswp-uid', i + 1);
galleryElements[i].onclick = onThumbnailsClick;
}
var hashData = photoswipeParseHash();
if (hashData.pid && hashData.gid) {
openPhotoSwipe(hashData.pid, galleryElements[hashData.gid - 1], true, true);
}
}
}
new ParseThumbnailElements('.my-gallery')
</script>
</body>
</html>