手机端点击图片放大特效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 相关文章推荐
Javascript下的keyCode键码值表
Apr 10 Javascript
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
Jun 02 Javascript
Javascript 函数中的参数使用分析
Mar 27 Javascript
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
onbeforeunload与onunload事件异同点总结
Jun 24 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
Aug 19 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
Sep 10 jQuery
小程序ios音频播放没声音问题的解决
Jul 11 Javascript
JS添加或删除HTML dom元素的方法实例分析
Mar 05 Javascript
javascript移动端 电子书 翻页效果实现代码
Sep 07 Javascript
layui点击弹框页面 表单请求的方法
Sep 21 Javascript
js消除图片小游戏代码
Dec 11 Javascript
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 静态变量与自定义常量的使用方法
2010/01/26 PHP
php 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
JavaScript 拾漏补遗
2009/12/27 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
微信小程序实现蓝牙打印
2019/09/23 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
Django 静态文件配置过程详解
2019/07/23 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
pycharm实现猜数游戏
2020/12/07 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
自我评价的写作规则
2014/01/06 职场文书
建房协议书
2014/04/11 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
2015暑假实习报告范文
2015/07/13 职场文书
欢送领导祝酒词
2015/08/12 职场文书