手机端点击图片放大特效PhotoSwipe.js插件实现


Posted in Javascript onAugust 24, 2016

PhotoSwipe插件能实现手机端点击图片全屏放大 再双击图片放大等功能

PhotoSwipe插件官方网站 http://www.photoswipe.com/

但有一点不太好的是图片放大后再单击不能关闭浏览,要点击关闭按钮或者滑动才能关闭,找了好久配置项都没说到这点上的,只能自己动手改了。

打开photoswipe.js,大概在3179行有个关于tap的函数定义
在开头先定义一个变量

var tap_num = 0;

然后在onTapStart的定义里加入

//根据需求自己添加的S
//判断是单击还是双击 单击关闭 双击放大
tap_num++;
if(tap_num < 2){
 setTimeout(function(){
  if(tap_num > 1){
   tap_num = 0;
   return;
  }else{
   tap_num = 0;
   //判断是否有拖拽 如有拖拽触发拖拽事件 没有则关闭
   if(_isDragging){
    return;
   }else{
    self.close();
   }
  }
 },200);
}
//根据需求自己添加的E

大概整体就是这样

var tapTimer,
 tapReleasePoint = {},
 _dispatchTapEvent = function(origEvent, releasePoint, pointerType) {  
  var e = document.createEvent( 'CustomEvent' ),
   eDetail = {
    origEvent:origEvent, 
    target:origEvent.target, 
    releasePoint: releasePoint, 
    pointerType:pointerType || 'touch'
   };

  e.initCustomEvent( 'pswpTap', true, true, eDetail );
  origEvent.target.dispatchEvent(e);
 };
var tap_num = 0;

_registerModule('Tap', {
 publicMethods: {
  initTap: function() {
   _listen('firstTouchStart', self.onTapStart);
   _listen('touchRelease', self.onTapRelease);
   _listen('destroy', function() {
    tapReleasePoint = {};
    tapTimer = null;
   });
  },
  onTapStart: function(touchList) {
   if(touchList.length > 1) {
    clearTimeout(tapTimer);
    tapTimer = null;
   }

   //根据需求自己添加的S
   //判断是单击还是双击 单击关闭 双击放大
   tap_num++;
   if(tap_num < 2){
    setTimeout(function(){
     if(tap_num > 1){
      tap_num = 0;
      return;
     }else{
      tap_num = 0;
      //判断是否有拖拽 如有拖拽触发拖拽事件 没有则关闭
      if(_isDragging){
       return;
      }else{
       self.close();
      }
     }
    },200);
   }
   //根据需求自己添加的E
  },
  onTapRelease: function(e, releasePoint) {
   if(!releasePoint) {
    return;
   }

   if(!_moved && !_isMultitouch && !_numAnimations) {
    var p0 = releasePoint;
    if(tapTimer) {
     clearTimeout(tapTimer);
     tapTimer = null;

     // Check if taped on the same place
     if ( _isNearbyPoints(p0, tapReleasePoint) ) {
      _shout('doubleTap', p0);
      return;
     }
    }

    if(releasePoint.type === 'mouse') {
     _dispatchTapEvent(e, releasePoint, 'mouse');
     return;
    }

    var clickedTagName = e.target.tagName.toUpperCase();
    // avoid double tap delay on buttons and elements that have class pswp__single-tap
    if(clickedTagName === 'BUTTON' || framework.hasClass(e.target, 'pswp__single-tap') ) {
     _dispatchTapEvent(e, releasePoint);
     return;
    }

    _equalizePoints(tapReleasePoint, p0);

    tapTimer = setTimeout(function() {
     _dispatchTapEvent(e, releasePoint);
     tapTimer = null;
    }, 300);
   }
  }
 }
});

把修改后的photoswipe.js压缩一下,就能实现自己想要的功能了

另外,使用photoswipe插件需要插入框架和JavaScript代码,可以把这些代码整合成一个js再引入,这样页面看起来就简洁了很多。
先在html写上图片相册结构,并配上样式

<div id="demo-test-gallery" class="demo-gallery">
 <a href="https://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.jpg" data-size="1600x1600" data-med="https://farm4.staticflickr.com/3894/15008518202_b016d7d289_b.jpg" data-med-size="1024x1024">
  <img src="https://farm4.staticflickr.com/3894/15008518202_b016d7d289_m.jpg" alt="" />
 </a>

 <a href="https://farm6.staticflickr.com/5591/15008867125_b61960af01_h.jpg" data-size="1600x1068" data-med="https://farm6.staticflickr.com/5591/15008867125_68a8ed88cc_b.jpg" data-med-size="1024x1024">
  <img src="https://farm6.staticflickr.com/5591/15008867125_68a8ed88cc_m.jpg" alt="" />
 </a>
</div>

整理后的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("    <button class=\"pswp__button pswp__button--share\" title=\"Share\"><\/button>");
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>");


(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 = 0; i < numNodes; i++) {
     el = thumbElements[i];

     // include only element nodes
     if(el.nodeType !== 1) {
      continue;
     }

     childElements = el.children;

     size = el.getAttribute('data-size').split('x');

     // create slide object
     item = {
      src: el.getAttribute('href'),
      w: parseInt(size[0], 10),
      h: parseInt(size[1], 10),
      author: el.getAttribute('data-author')
     };

     item.el = el; // save link to element for getThumbBoundsFn

     if(childElements.length > 0) {
      item.msrc = childElements[0].getAttribute('src'); // thumbnail url
      if(childElements.length > 1) {
       item.title = childElements[1].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[0], 10),
       h: parseInt(size[1], 10)
      };
     }
     // 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 = 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) { // pid=1
     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 = {

     galleryUID: galleryElement.getAttribute('data-pswp-uid'),

     getThumbBoundsFn: function(index) {
      // See Options->getThumbBoundsFn section of docs for more info
      var thumbnail = items[index].el.children[0],
        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[0].innerText = '';
       return false;
      }
      captionEl.children[0].innerHTML = item.title + '<br/><small>Photo: ' + item.author + '</small>';
      return true;
     }

    };

    // options for control bar
    options.shareEl = false;
    options.fullscreenEl = false;

    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 {
      options.index = parseInt(index, 10) - 1;
     }
    } else {
     options.index = parseInt(index, 10);
    }

    // exit if index not found
    if( isNaN(options.index) ) {
     return;
    }



    // 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 : 1;
     dpiRatio = Math.min(dpiRatio, 2.5);
     realViewportWidth = gallery.viewportSize.x * dpiRatio;


     if(realViewportWidth >= 1200 || (!gallery.likelyTouchDevice && realViewportWidth > 800) || screen.width > 1200 ) {
      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 = 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 );
   }
  };

  initPhotoSwipeFromDOM('.demo-gallery');

 })();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery.Validate 使用笔记(jQuery Validation范例 )
Jun 25 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
Dec 22 Javascript
seajs1.3.0源码解析之module依赖有序加载
Nov 07 Javascript
JQuery 常用方法和事件详细介绍
Apr 18 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
Dec 13 Javascript
ParseInt函数参数设置介绍
Jan 02 Javascript
js随机生成网页背景颜色的方法
Feb 26 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
Jul 27 Javascript
JS实现的文字间歇循环滚动效果完整示例
Feb 13 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
Aug 21 Javascript
react 原生实现头像滚动播放的示例
Apr 21 Javascript
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
jQuery Raty 一款不错的星级评分插件
Aug 24 #Javascript
jQuery实现自动输入email、时间和域名的方法
Aug 24 #Javascript
jQuery实现页面点击后退弹出提示框的方法
Aug 24 #Javascript
input 禁止输入特殊字符的四种实现方式
Aug 24 #Javascript
深入浅析JavaScript中的3DES
Aug 24 #Javascript
jQuery自适应轮播图插件Swiper用法示例
Aug 24 #Javascript
JavaScript lodash常见用法系列小结
Aug 24 #Javascript
You might like
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
微信js-sdk地理位置接口用法示例
2016/10/12 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
python DataFrame 修改列的顺序实例
2018/04/10 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
股权转让协议书
2014/04/12 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
保护动物的标语
2014/06/11 职场文书
教师暑期培训感言
2014/08/15 职场文书
机动车登记业务委托书
2014/10/08 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS