通过GitHub 下载PhotoSwipe https://github.com/dimsemenov/PhotoSwipe 相关的库

<link rel="stylesheet" href="css/photoswipe.css" />
<link rel="stylesheet" href="css/default-skin/default-skin.css" /> <script src="js/photoswipe.min.js"></script>
<script src="js/photoswipe-ui-default.js"></script>
<script src="js/connect.js"></script>
//引入相关的css和js文件及皮肤

connect.js

 document.writeln("<!-- Root element of PhotoSwipe. Must have class pswp. -->");
document.writeln("<div class=\"pswp\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">");
document.writeln("");
document.writeln(" <!-- Background of PhotoSwipe.");
document.writeln(" It\'s a separate element as animating opacity is faster than rgba(). -->");
document.writeln(" <div class=\"pswp__bg\"><\/div>");
document.writeln("");
document.writeln(" <!-- Slides wrapper with overflow:hidden. -->");
document.writeln(" <div class=\"pswp__scroll-wrap\">");
document.writeln("");
document.writeln(" <!-- Container that holds slides.");
document.writeln(" PhotoSwipe keeps only 3 of them in the DOM to save memory.");
document.writeln(" Don\'t modify these 3 pswp__item elements, data is added later on. -->");
document.writeln(" <div class=\"pswp__container\">");
document.writeln(" <div class=\"pswp__item\"><\/div>");
document.writeln(" <div class=\"pswp__item\"><\/div>");
document.writeln(" <div class=\"pswp__item\"><\/div>");
document.writeln(" <\/div>");
document.writeln("");
document.writeln(" <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->");
document.writeln(" <div class=\"pswp__ui pswp__ui--hidden\">");
document.writeln("");
document.writeln(" <div class=\"pswp__top-bar\">");
document.writeln("");
document.writeln(" <!-- Controls are self-explanatory. Order can be changed. -->");
document.writeln("");
document.writeln(" <div class=\"pswp__counter\"><\/div>");
document.writeln("");
document.writeln(" <button class=\"pswp__button pswp__button--close\" title=\"Close (Esc)\"><\/button>");
document.writeln("");
document.writeln("");
document.writeln(" <button class=\"pswp__button pswp__button--fs\" title=\"Toggle fullscreen\"><\/button>");
document.writeln("");
document.writeln(" <button class=\"pswp__button pswp__button--zoom\" title=\"Zoom in\/out\"><\/button>");
document.writeln("");
document.writeln(" <!-- Preloader demo http:\/\/codepen.io\/dimsemenov\/pen\/yyBWoR -->");
document.writeln(" <!-- element will get class pswp__preloader--active when preloader is running -->");
document.writeln(" <div class=\"pswp__preloader\">");
document.writeln(" <div class=\"pswp__preloader__icn\">");
document.writeln(" <div class=\"pswp__preloader__cut\">");
document.writeln(" <div class=\"pswp__preloader__donut\"><\/div>");
document.writeln(" <\/div>");
document.writeln(" <\/div>");
document.writeln(" <\/div>");
document.writeln(" <\/div>");
document.writeln("");
document.writeln(" <div class=\"pswp__share-modal pswp__share-modal--hidden pswp__single-tap\">");
document.writeln(" <div class=\"pswp__share-tooltip\"><\/div>");
document.writeln(" <\/div>");
document.writeln("");
document.writeln(" <button class=\"pswp__button pswp__button--arrow--left\" title=\"Previous (arrow left)\">");
document.writeln(" <\/button>");
document.writeln("");
document.writeln(" <button class=\"pswp__button pswp__button--arrow--right\" title=\"Next (arrow right)\">");
document.writeln(" <\/button>");
document.writeln("");
document.writeln(" <div class=\"pswp__caption\">");
document.writeln(" <div class=\"pswp__caption__center\"><\/div>");
document.writeln(" <\/div>");
document.writeln("");
document.writeln(" <\/div>");
document.writeln("");
document.writeln(" <\/div>");
document.writeln("");
document.writeln("<\/div>");
//因为作者没有把相关的div放进js里,所以这边通过打印,具体可以观看官方文档得知为什么要这么做。
(function() { var initPhotoSwipeFromDOM = function(gallerySelector) { var parseThumbnailElements = function(el) {
var thumbElements = el.childNodes,
numNodes = thumbElements.length,
items = [],
el,
childElements,
thumbnailEl,
size,
item; for(var i = ; i < numNodes; i++) {
el = thumbElements[i]; // include only element nodes
if(el.nodeType !== ) {
continue;
} childElements = el.children; size = el.getAttribute('data-size').split('x'); // create slide object
item = {
src: el.getAttribute('href'),
w: parseInt(size[], ),
h: parseInt(size[], ),
author: el.getAttribute('data-author')
}; item.el = el; // save link to element for getThumbBoundsFn if(childElements.length > ) {
item.msrc = childElements[].getAttribute('src'); // thumbnail url
if(childElements.length > ) {
item.title = childElements[].innerHTML; // caption (contents of figure)
}
} var mediumSrc = el.getAttribute('data-med');
if(mediumSrc) {
size = el.getAttribute('data-med-size').split('x');
// "medium-sized" image
item.m = {
src: mediumSrc,
w: parseInt(size[], ),
h: parseInt(size[], )
};
}
// original image
item.o = {
src: item.src,
w: item.w,
h: item.h
}; items.push(item);
} return items;
}; // find nearest parent element
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 === 'A';
}); if(!clickedListItem) {
return;
} var clickedGallery = clickedListItem.parentNode; var childNodes = clickedListItem.parentNode.childNodes,
numChildNodes = childNodes.length,
nodeIndex = ,
index; for (var i = ; i < numChildNodes; i++) {
if(childNodes[i].nodeType !== ) {
continue;
} if(childNodes[i] === clickedListItem) {
index = nodeIndex;
break;
}
nodeIndex++;
} if(index >= ) {
openPhotoSwipe( index, clickedGallery );
}
return false;
}; var photoswipeParseHash = function() {
var hash = window.location.hash.substring(),
params = {}; if(hash.length < ) { // pid=1
return params;
} var vars = hash.split('&');
for (var i = ; i < vars.length; i++) {
if(!vars[i]) {
continue;
}
var pair = vars[i].split('=');
if(pair.length < ) {
continue;
}
params[pair[]] = pair[];
} if(params.gid) {
params.gid = parseInt(params.gid, );
} return params;
}; var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) {
var pswpElement = document.querySelectorAll('.pswp')[],
gallery,
options,
items; items = parseThumbnailElements(galleryElement); // define options (if needed)
options = { galleryUID: galleryElement.getAttribute('data-pswp-uid'), getThumbBoundsFn: function(index) {
// See Options->getThumbBoundsFn section of docs for more info
var thumbnail = items[index].el.children[],
pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
rect = thumbnail.getBoundingClientRect(); return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
}, addCaptionHTMLFn: function(item, captionEl, isFake) {
if(!item.title) {
captionEl.children[].innerText = '';
return false;
}
captionEl.children[].innerHTML = item.title + '<br/><small>Photo: ' + item.author + '</small>';
return true;
} }; 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 = ; j < items.length; j++) {
if(items[j].pid == index) {
options.index = j;
break;
}
}
} else {
options.index = parseInt(index, ) - ;
}
} else {
options.index = parseInt(index, );
} // exit if index not found
if( isNaN(options.index) ) {
return;
} var radios = document.getElementsByName('gallery-style');
for (var i = , length = radios.length; i < length; i++) {
if (radios[i].checked) {
if(radios[i].id == 'radio-all-controls') { } else if(radios[i].id == 'radio-minimal-black') {
options.mainClass = 'pswp--minimal--dark';
options.barsSize = {top:,bottom:};
options.captionEl = false;
options.fullscreenEl = false;
options.shareEl = false;
options.bgOpacity = 0.85;
options.tapToClose = true;
options.tapToToggleControls = false;
}
break;
}
} if(disableAnimation) {
options.showAnimationDuration = ;
} // Pass data to PhotoSwipe and initialize it
gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options); // see: http://photoswipe.com/documentation/responsive-images.html
var realViewportWidth,
useLargeImages = false,
firstResize = true,
imageSrcWillChange; gallery.listen('beforeResize', function() { var dpiRatio = window.devicePixelRatio ? window.devicePixelRatio : ;
dpiRatio = Math.min(dpiRatio, 2.5);
realViewportWidth = gallery.viewportSize.x * dpiRatio; if(realViewportWidth >= || (!gallery.likelyTouchDevice && realViewportWidth > ) || screen.width > ) {
if(!useLargeImages) {
useLargeImages = true;
imageSrcWillChange = true;
} } else {
if(useLargeImages) {
useLargeImages = false;
imageSrcWillChange = true;
}
} if(imageSrcWillChange && !firstResize) {
gallery.invalidateCurrItems();
} if(firstResize) {
firstResize = false;
} imageSrcWillChange = false; }); gallery.listen('gettingData', function(index, item) {
if( useLargeImages ) {
item.src = item.o.src;
item.w = item.o.w;
item.h = item.o.h;
} else {
item.src = item.m.src;
item.w = item.m.w;
item.h = item.m.h;
}
}); gallery.init();
}; // select all gallery elements
var galleryElements = document.querySelectorAll( gallerySelector );
for(var i = , l = galleryElements.length; i < l; i++) {
galleryElements[i].setAttribute('data-pswp-uid', i+);
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 - ], true, true );
}
}; initPhotoSwipeFromDOM('.photoswipe'); })();

我们通过名为photoswipe的class通知要用到的子元素。

a里的图片为放大之后的图片,img里的图片为可实际查看的小图,data-size为要放大的图片大小。

 <div class="photoswipe">
<a href="img/1-max.jpeg" data-size='1000x1000' >
<img src="img/1-450.jpeg"/>
</a>
<a href="http://img3.imgtn.bdimg.com/it/u=4166721891,1503444760&fm=26&gp=0.jpg" data-size='1000x1000' >
<img src="http://img3.imgtn.bdimg.com/it/u=4166721891,1503444760&fm=26&gp=0.jpg"/>
</a>
<a href="http://www.91danji.com/attachments/201511/19/10/24kf5fidw.jpg" data-size='1000x1000' >
<img src="http://www.91danji.com/attachments/201511/19/10/24kf5fidw.jpg"/>
</a>
</div>

拓展:因项目需要,以及通过后台渲染出的图片大小或外链的图片,总不可能一个个设置data-size,于是用jQuery配合js写了几段代码。

 $(document).ready(function(){ //如果认为代码写的很乱可以自行修改
var pic=$("[data-size]");
pic.each(function(){
var _this = $(this);
var images = new Image(); //实例化图片
images.src = _this.find('img').attr('src'); //获取小图的链接 进行计算
images.onload = function(){ //当图片加载完
var tpW = images.width; //图片实际宽度
var tpH = images.height //图片实际高度
var winW = $(window).width(); //浏览器实际宽度
var winH = $(window).height(); //浏览器实际高度
var tpRatio = Math.min((winW/tpW),(winH/tpH));
var getW = tpW * tpRatio;
var getH = tpH * tpRatio; // 屏幕高度 * 图片宽度 / 图片高度
_this.attr("data-size",parseInt(getW,)+"x"+parseInt(getH,));
}
});
});

该插件是自适应的,具体可以通过谷歌浏览器查看该插件的炫酷之处。

PhotoSwipe-一个好用的图片放大缩小插件的更多相关文章

  1. 图片放大缩小插件 zoom.js 怎么用

    代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf ...

  2. hammer使用: 代码:捏合、捏开、图片放大 的一个手机图片“放大缩小可拖动”的小效果

    hammer.js 的使用. (手机手势插件) 捏合.捏开.图片放大 的一个手机图片“放大缩小可拖动”的小效果. 相关js 到 http://www.bootcdn.cn/  查找和下载. hamme ...

  3. 鼠标滚轮图片放大缩小功能,使用layer弹框后不起作用

    今天在项目中遇到的一个问题:点击按钮使用layer弹框弹出一张图片,需要加一个鼠标滚轮放大缩小,图片也跟着放大缩小的功能.于是在网上找了一个demo. DEMO: <!DOCTYPE html ...

  4. javascript仿新浪微博图片放大缩小及旋转效果

    javascript仿新浪微博图片放大缩小及旋转效果 经常看到新浪微博里有图片放大缩小旋转效果,感觉效果还不错,所以就想试着做一个类似的demo出来,至于旋转对于IE可以用滤镜来解决,标准的浏览器可以 ...

  5. 自定义mousewheel事件,实现图片放大缩小功能实现

    本文是承接 上一篇的<自定义鼠标滚动事件>  的基础上实现的,建议大家先看一下上一篇的mousewheel的实现,再浏览下文: 上篇中我们介绍到: $element.mousewheel( ...

  6. imageView图片放大缩小及旋转

    imageView图片放大缩小及旋转 一.简介 二.方法 1)设置图片放大缩小效果 第一步:将<ImageView>标签中的android:scaleType设置为"fitCen ...

  7. wpf下的图片放大缩小

    WPF下实现图片的放大缩小移动   在windows 7里面有自带的图片查看器,这个软件可以打开一张图片然后以鼠标在图片中的焦点为原点来进行缩放,并且放大后可以随意拖动.下面我们在WPF中实现这个功能 ...

  8. vue项目 一行js代码搞定点击图片放大缩小

    一行js代码搞定xue项目需要点击图片放大缩小,其实主要用的是用到了vue:class的动态切换,内容比较简单.一开始我把维护的需求想得太复杂了,和测试小姐姐聊了一下才反应过来. 两个月不到跟了四个项 ...

  9. Canvas实现图片放大缩小移动操作

    对于HTML5相信大家都不陌生,很早就出来了,但是貌似都没有真正的使用过.最近做项目时要实现这样一个需求:一个图片,大小不固定,要求能实现类似地图一样放大.缩小.移动功能.这里就很合适使用html5的 ...

随机推荐

  1. 将windows共享文件夹挂载在linux机器的/mnt/windows/ 目录下进行访问

    将windows共享文件夹挂载在linux机器的/mnt/windows/ 目录下进行访问.windows机器ip:192.168.1.101,用户名:XXXX密码:XXXXlinux机器ip:ip2 ...

  2. Element ui 中使用table组件实现分页记忆选中

    我们再用vue和element-ui,或者其他的表格的时候,可能需要能记忆翻页勾选,那么实现以下几个方法就ok了 示例如下 <el-table :data="tableData&quo ...

  3. 数字时钟(DigitalClock)

    数字时钟(DigitalClock) 这个其实就是我们平时看到的手机上面显示的时间 很简单 1.Activity //数字时钟 public class DigitalClockActivity ex ...

  4. Android获取SD卡路径及SDCard内存的方法

    这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了A ...

  5. 重装系统,打开VS进行程序调试运行的时候 Unable to find manifest signing certificate in the certificate store

    重装系统,打开VS进行程序调试运行的时候 Unable to find manifest signing certificate in the certificate store. 项目的属性-> ...

  6. 转 Js窗体window大小设置

    网页可见区域宽:document.body.clientWidth  网页可见区域高:document.body.clientHeight  网页可见区域宽:document.body.offsetW ...

  7. pytts3语音合成遇到的中文问题

    在使用pytts3语音合成时,遇到中文语音错乱.程序代码本身很简单,也是网上公认的一种写法: #coding: UTF-8import pyttsx3; engine = pyttsx3.init() ...

  8. 'webpack' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    npm updatea -g 很严重,把本地npm安装包都更新了,跟项目npm安装包版本不一,导致 意思是版本冲突,手动卸载了,重新安装还是最新版本,很是头疼.找同事的电脑拷贝了一份,然后复制过来报“ ...

  9. 手动配置wnmp环境

    wamp 是什么? windows,nginx,mysql,php(当然也可以是PYTHON等) 只所以使用nginx,是因为我等下要配置ZendGuardLoader ZendGuardLoader ...

  10. 使用 Azure 门户创建 Linux 虚拟机

    可以通过 Azure 门户创建 Azure 虚拟机. 此方法提供一个基于浏览器的用户界面,用于创建和配置虚拟机和所有相关的资源. 本快速入门介绍了如何创建虚拟机并在 VM 上安装 webserver. ...