通过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. SpringCloud Eureka(注册中心集群)

    多个注册中心,其实用不同的配置对应 不同的端口号注册就行了. 注册中心自己也是个服务,看看之前的单个注册中心是怎么样的呢? server: port: 8888 # 服务端口eureka: insta ...

  2. knockout事件绑定

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. 数组元素的移动(删除) C#实现

    下面有四个问题: 把数组元素前后部分交换 MoveFirstPartOfArrayToTheEnd(int[] array, int index) 比如 {1,2,3,4,5,6,7} 3  => ...

  4. Yarn vs npm:你需要知道的一切(转)

    转载:https://zhuanlan.zhihu.com/p/23493436 原文链接:Yarn vs npm: Everything You Need to Know Facebook.Goog ...

  5. node.js(http协议)

    七层网络协议 应用层:浏览器(http,FTP,DNS,SMTP,TeInet)(邓哥)表示层:加密,格式转换(怕别人偷看,加密摩斯电码)会话层:解除或者建立和其他节点的联系(邓哥在想追这个女孩,不再 ...

  6. 代码实现自定义TableView

    实现效果(通过代码的方式实现TableCell 的创建) 实现过程: 实现过程两个部分 1 数据源的准备 本例子采用NSDictionary +NSArray 为数据源 (接口部分) (数据初始化部分 ...

  7. 慕课网 深入浅出javascript 笔记

    javascript 数据类型 5种简单数据类型:Number.String.Boolean.Undefined.Null 1种复杂数据类型:Object =    表示赋值: ==  表示比较,但是 ...

  8. FFmpeg实现将图片转换为视频

    ##名称:ffmpeg实现将图片转换为视频 ##平台:ubuntu(已经安装好了ffmpeg工具) ##日期:2017年12月10日 简介: 因为学习需要,需要将连续图片转换成视频,昨天和今天早上用o ...

  9. ShortcutBadger添加桌面角标(Badge)

    1.简介:角标原本是苹果的ios中的东西,android原生并不支持角标,因为google的意思是让大家用notification(提示栏)即可,不过无妨,厉害的android第三方厂商可以通过在自定 ...

  10. 大O表示法

    概念 大O表示法是和数据项的个数相关联的粗略度量算法时间复杂度的快捷方法. 常数一个无序可重复数组插入一个数据项的时间T是常数K,常数K表示一次插入所花费的时间,包含cpu.编译器等工作时间.可表示为 ...