前言:

考虑自己网站的图片展示,而且要支持移动端和PC端。自己写的代码也不尽如意,要写好的话也需要时间,于是就想到了使用相关插件。

准备:

PhotoSwipe 官网地址:http://photoswipe.com/

英语还可以的同学可以看官方文档学习:http://photoswipe.com/documentation/getting-started.html

下载对应的几个CSS、JS文件就可以了:https://github.com/dimsemenov/PhotoSwipe/tree/master/dist

正文:

进入正题,我们先把下载的文件添加到项目里面,然后就可以下面的步骤了。

1.引用JS、CSS文件

  1. <link href="photoswipe.css" rel="stylesheet" />
  2. <link href="default-skin/default-skin.css" rel="stylesheet" />
  3. <script src="photoswipe.min.js"></script>
  4. <script src="photoswipe-ui-default.min.js"></script>

2.添加 PhotoSwipe 的图片展示窗口的 HTML 代码

  1. <!-- Root element of PhotoSwipe. Must have class pswp. -->
  2. <div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
  3. <!-- Background of PhotoSwipe.
  4. It's a separate element, as animating opacity is faster than rgba(). -->
  5. <div class="pswp__bg"></div>
  6. <!-- Slides wrapper with overflow:hidden. -->
  7. <div class="pswp__scroll-wrap">
  8. <!-- Container that holds slides. PhotoSwipe keeps only 3 slides in DOM to save memory. -->
  9. <div class="pswp__container">
  10. <!-- don't modify these 3 pswp__item elements, data is added later on -->
  11. <div class="pswp__item"></div>
  12. <div class="pswp__item"></div>
  13. <div class="pswp__item"></div>
  14. </div>
  15. <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
  16. <div class="pswp__ui pswp__ui--hidden">
  17. <div class="pswp__top-bar">
  18. <!-- Controls are self-explanatory. Order can be changed. -->
  19. <div class="pswp__counter"></div>
  20. <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
  21. <button class="pswp__button pswp__button--share" title="Share"></button>
  22. <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
  23. <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
  24. <!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->
  25. <!-- element will get class pswp__preloader--active when preloader is running -->
  26. <div class="pswp__preloader">
  27. <div class="pswp__preloader__icn">
  28. <div class="pswp__preloader__cut">
  29. <div class="pswp__preloader__donut"></div>
  30. </div>
  31. </div>
  32. </div>
  33. </div>
  34. <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
  35. <div class="pswp__share-tooltip"></div>
  36. </div>
  37. <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
  38. </button>
  39. <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
  40. </button>
  41. <div class="pswp__caption">
  42. <div class="pswp__caption__center"></div>
  43. </div>
  44. </div>
  45. </div>
  46. </div>

3.初始化

我们先简单的了解下,这个通过 JS 进行初始化,图片信息使用指定的两个图片文件信息:

  1. var openPhotoSwipe = function () {
  2. var pswpElement = document.querySelectorAll('.pswp')[0];
  3. // build items array
  4. var items = [
  5. {
  6. src: 'https://farm2.staticflickr.com/1043/5186867718_06b2e9e551_b.jpg',
  7. w: 964,
  8. h: 1024
  9. },
  10. {
  11. src: 'https://farm7.staticflickr.com/6175/6176698785_7dee72237e_b.jpg',
  12. w: 1024,
  13. h: 683
  14. }
  15. ];
  16.  
  17. // define options (if needed)
  18. var options = {
  19. // history & focus options are disabled on CodePen
  20. history: false,
  21. focus: false,
  22. showAnimationDuration: 0,
  23. hideAnimationDuration: 0
  24. };
  25. var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
  26. gallery.init();
  27. };
  28. openPhotoSwipe();

这样简单的效果就出来了。

演示地址:http://www.ycdoit.com/plugins/photoswipe/index1.html

页面源代码:https://github.com/YeXiaoChao/yexiaochao.github.io/blob/master/plugins/PhotoSwipe/index1.html

进阶:

但是如果我们不希望在 JS 设置图片信息,而是直接在 HTML 文件里面生成图片代码,然后点击的时候展示图片。

首先我们要知道, PhotoSwipe 添加自己的属性到这个图片对象的代码如下所示:

  1. var slides = [
  2. // slide 1
  3. {
  4. src: 'path/to/image1.jpg', // path to image
  5. w: 1024, // image width
  6. h: 768, // image height
  7. msrc: 'path/to/small-image.jpg', // small image placeholder,
  8. // main (large) image loads on top of it,
  9. // if you skip this parameter - grey rectangle will be displayed,
  10. // try to define this property only when small image was loaded before
  11. title: 'Image Caption' // used by Default PhotoSwipe UI
  12. // if you skip it, there won't be any caption
  13. // You may add more properties here and use them.
  14. // For example, demo gallery uses "author" property, which is used in the caption.
  15. // author: 'John Doe'
  16. },
  17. // slide 2
  18. {
  19. src: 'path/to/image2.jpg',
  20. w: 600,
  21. h: 600
  22. // etc.
  23. }
  24. // etc.
  25. ];

图片数组列表的HTML代码是这样的:

  1. <div class="my-gallery" itemscope itemtype="http://schema.org/ImageGallery">
  2. <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
  3. <a href="large-image.jpg" itemprop="contentUrl" data-size="600x400">
  4. <img src="small-image.jpg" itemprop="thumbnail" alt="Image description" />
  5. </a>
  6. <figcaption itemprop="caption description">Image caption</figcaption>
  7. </figure>
  8. <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
  9. <a href="large-image.jpg" itemprop="contentUrl" data-size="600x400">
  10. <img src="small-image.jpg" itemprop="thumbnail" alt="Image description" />
  11. </a>
  12. <figcaption itemprop="caption description">Image caption</figcaption>
  13. </figure>
  14. </div>

然后我们通过 JS 把图片属性信息绑定起来:

  1. var initPhotoSwipeFromDOM = function(gallerySelector) {
  2. // parse slide data (url, title, size ...) from DOM elements
  3. // (children of gallerySelector)
  4. var parseThumbnailElements = function(el) {
  5. var thumbElements = el.childNodes,
  6. numNodes = thumbElements.length,
  7. items = [],
  8. figureEl,
  9. linkEl,
  10. size,
  11. item;
  12. for(var i = 0; i < numNodes; i++) {
  13. figureEl = thumbElements[i]; // <figure> element
  14. // include only element nodes
  15. if(figureEl.nodeType !== 1) {
  16. continue;
  17. }
  18. linkEl = figureEl.children[0]; // <a> element
  19. size = linkEl.getAttribute('data-size').split('x');
  20. // create slide object
  21. item = {
  22. src: linkEl.getAttribute('href'),
  23. w: parseInt(size[0], 10),
  24. h: parseInt(size[1], 10)
  25. };
  26. if(figureEl.children.length > 1) {
  27. // <figcaption> content
  28. item.title = figureEl.children[1].innerHTML;
  29. }
  30. if(linkEl.children.length > 0) {
  31. // <img> thumbnail element, retrieving thumbnail url
  32. item.msrc = linkEl.children[0].getAttribute('src');
  33. }
  34. item.el = figureEl; // save link to element for getThumbBoundsFn
  35. items.push(item);
  36. }
  37. return items;
  38. };
  39. // find nearest parent element
  40. var closest = function closest(el, fn) {
  41. return el && ( fn(el) ? el : closest(el.parentNode, fn) );
  42. };
  43. // triggers when user clicks on thumbnail
  44. var onThumbnailsClick = function(e) {
  45. e = e || window.event;
  46. e.preventDefault ? e.preventDefault() : e.returnValue = false;
  47. var eTarget = e.target || e.srcElement;
  48. // find root element of slide
  49. var clickedListItem = closest(eTarget, function(el) {
  50. return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
  51. });
  52. if(!clickedListItem) {
  53. return;
  54. }
  55. // find index of clicked item by looping through all child nodes
  56. // alternatively, you may define index via data- attribute
  57. var clickedGallery = clickedListItem.parentNode,
  58. childNodes = clickedListItem.parentNode.childNodes,
  59. numChildNodes = childNodes.length,
  60. nodeIndex = 0,
  61. index;
  62. for (var i = 0; i < numChildNodes; i++) {
  63. if(childNodes[i].nodeType !== 1) {
  64. continue;
  65. }
  66. if(childNodes[i] === clickedListItem) {
  67. index = nodeIndex;
  68. break;
  69. }
  70. nodeIndex++;
  71. }
  72. if(index >= 0) {
  73. // open PhotoSwipe if valid index found
  74. openPhotoSwipe( index, clickedGallery );
  75. }
  76. return false;
  77. };
  78. // parse picture index and gallery index from URL (#&pid=1&gid=2)
  79. var photoswipeParseHash = function() {
  80. var hash = window.location.hash.substring(1),
  81. params = {};
  82. if(hash.length < 5) {
  83. return params;
  84. }
  85. var vars = hash.split('&');
  86. for (var i = 0; i < vars.length; i++) {
  87. if(!vars[i]) {
  88. continue;
  89. }
  90. var pair = vars[i].split('=');
  91. if(pair.length < 2) {
  92. continue;
  93. }
  94. params[pair[0]] = pair[1];
  95. }
  96. if(params.gid) {
  97. params.gid = parseInt(params.gid, 10);
  98. }
  99.  
  100. return params;
  101. };
  102. var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) {
  103. var pswpElement = document.querySelectorAll('.pswp')[0],
  104. gallery,
  105. options,
  106. items;
  107. items = parseThumbnailElements(galleryElement);
  108. // define options (if needed)
  109. options = {
  110. // define gallery index (for URL)
  111. galleryUID: galleryElement.getAttribute('data-pswp-uid'),
  112. getThumbBoundsFn: function(index) {
  113. // See Options -> getThumbBoundsFn section of documentation for more info
  114. var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail
  115. pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
  116. rect = thumbnail.getBoundingClientRect();
  117. return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
  118. }
  119. };
  120. // PhotoSwipe opened from URL
  121. if(fromURL) {
  122. if(options.galleryPIDs) {
  123. // parse real index when custom PIDs are used
  124. // http://photoswipe.com/documentation/faq.html#custom-pid-in-url
  125. for(var j = 0; j < items.length; j++) {
  126. if(items[j].pid == index) {
  127. options.index = j;
  128. break;
  129. }
  130. }
  131. } else {
  132. // in URL indexes start from 1
  133. options.index = parseInt(index, 10) - 1;
  134. }
  135. } else {
  136. options.index = parseInt(index, 10);
  137. }
  138. // exit if index not found
  139. if( isNaN(options.index) ) {
  140. return;
  141. }
  142. if(disableAnimation) {
  143. options.showAnimationDuration = 0;
  144. }
  145. // Pass data to PhotoSwipe and initialize it
  146. gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
  147. gallery.init();
  148. };
  149. // loop through all gallery elements and bind events
  150. var galleryElements = document.querySelectorAll( gallerySelector );
  151.  
  152. for(var i = 0, l = galleryElements.length; i < l; i++) {
  153. galleryElements[i].setAttribute('data-pswp-uid', i+1);
  154. galleryElements[i].onclick = onThumbnailsClick;
  155. }
  156.  
  157. // Parse URL and open gallery if it contains #&pid=3&gid=1
  158. var hashData = photoswipeParseHash();
  159. if(hashData.pid && hashData.gid) {
  160. openPhotoSwipe( hashData.pid , galleryElements[ hashData.gid - 1 ], true, true );
  161. }
  162. };
  163.  
  164. // execute above function
  165. initPhotoSwipeFromDOM('.my-gallery');

我们把自己的图片信息根据模板修改下,然后把前面的图片展示代码放在一起就行了。

演示地址:http://www.ycdoit.com/plugins/photoswipe/index2.html

页面源代码:https://github.com/YeXiaoChao/yexiaochao.github.io/blob/master/plugins/PhotoSwipe/index2.html

接着根据自己的页面需求,相对应的修改代码就可以了。

因为并不需要太复杂的功能,解决了自己的问题,就没有继续研究了。需要深入了解的同学,可以看看官方文档

【JavaScript 插件】图片展示插件 PhotoSwipe 初识的更多相关文章

  1. jq图片展示插件highslide.js简单dom

    今天用用了一款图片展示插件highslide.js,感觉用起来很是舒畅,几乎不用怎么写代码,只需要知道如何写参数就行了. 那么这么牛叉的插件我们该如何用哪,下面我就跟大家讲解一下. 一.引入   首先 ...

  2. PhotoSwipe图片展示插件

    这个插件相当棒!功能也很强大,可以自行体会. 官方网址:http://www.photoswipe.com/ github地址:https://github.com/codecomputerlove/ ...

  3. 强大的图片展示插件,JQuery图片预览展示插件

    只需要引入JQuery.js , viewer.css 和 viewer.js <!DOCTYPE html> <html lang="en"> <h ...

  4. Lightbox 图片展示插件

    html <a href="<?php echo RESOURCES_BASE_FOLDER;?>image/default_pic.jpg" target=&q ...

  5. PhotoSwipe.js 相册展示插件学习

    PhotoSwipe.js官网:http://photoswipe.com/,在这个网站上可以下载到PhotoSwipe的文件以及相关的例子. 这个组件主要是用来展示图片.相册用的,还是很实用的. 一 ...

  6. 十个jQuery图片画廊插件推荐

    jQuery的画廊插件可以将分组图像和多媒体资料转成类似Flash的图像或照片.当幻灯片已经成为网站的重要组成部分,jQuery的重要性不能被忽视.下面为你介绍了10个最有美感,创新性和创造性的jQu ...

  7. 使用iScroll和photoswipe写手机浏览图片的插件的几点经验

    首先,当我知道我得到一个任务需要写一个在手机上能浏览图片的插件时,我第一想到了iScroll.它的左右滑动,上下滑动的效果在安卓手机上也能让用户有良好的体验,自己写也能方便控制. 我的需求是,插件要能 ...

  8. jQuery图片组展示插件----Galleria使用简介

    1.技术目标 掌握Galleria插件的基本操作 2.Galleria简介 Galleria是一个jQuery插件,可用于展示多张图片,操作也比较简单, 展示效果也非常不错,如图: 提示:Galler ...

  9. 使用图片视频展示插件blueimp Gallery改造网站的视频图片展示

    在很多情况下,我们网站可能会展示我们的产品图片.以及教程视频等内容,结合一个比较好的图片.视频展示插件,能够使得我们的站点更加方便使用,也更加酷炫,在Github上有很多相关的处理插件可以找来使用,有 ...

随机推荐

  1. BZOJ3531 [Sdoi2014]旅行 树链剖分 线段树

    原文链接:http://www.cnblogs.com/zhouzhendong/p/8080189.html 题目传送门 - BZOJ3531 题意概括 一棵树,n个节点,每一个节点两个值,一个颜色 ...

  2. youDao

    2018-09-22Journeys end in lovers' meeting.漂泊止于爱人的相遇. All extremes of feeling are allied with madness ...

  3. Kafka的接口回调 +自定义分区、拦截器

    一.接口回调+自定义分区 1.接口回调:在使用消费者的send方法时添加Callback回调 producer.send(new ProducerRecord<String, String> ...

  4. 解决资源id冲突

    --摘自<android插件化开发指南> 1.一套完整的Android App打包流程(Gradle方案) 第一步:aapt.为res目录下的资源生成R.java文件,同时为Android ...

  5. datetime.timedelta类

    datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象. Python中datetime模块中的timedelta ...

  6. Oracle Loop

    1. LOOP - END LOOP - EXIT declare v_rlt ):; begin v_rlt:; loop dbms_output.put_line('loop'||v_rlt); ...

  7. 使用Admin监控

    在springboot中,也提供了很全面的监控系统.这篇文章介绍一下springboot-admin监控springboot项目. 原来大致是这样的,springboot--admin--server ...

  8. PHP.ini 文件大小限制

    post_max_size=80000000000M upload_max_filesize=2000000000M

  9. 10个非常有趣的Linux命令【转载】

    Linux当中有很多比较有趣的命令,可以动手看看,很简单的. 1.rev命令 一行接一行地颠倒所输入的字符串. 运行: $rev 如输入:shiyanlou shiyanlou rev.jpg 2.a ...

  10. 最详细的Vuex教程

    什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性. ...