手机端点击图片放大特效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编程起步(第四课)
Feb 27 Javascript
node.js中的fs.symlinkSync方法使用说明
Dec 15 Javascript
简介AngularJS的视图功能应用
Jun 17 Javascript
jQuery实现文本框输入同步的方法
Jun 20 Javascript
JavaScript设计模式经典之命令模式
Feb 24 Javascript
BootStrap便签页的简单应用
Jan 06 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
Aug 18 Javascript
vue实现页面加载动画效果
Sep 19 Javascript
vue移动端路由切换实例分析
May 14 Javascript
js监听html页面的上下滚动事件方法
Sep 11 Javascript
浅谈vue引用静态资源需要注意的事项
Sep 28 Javascript
JavaScript代码模拟鼠标自动点击事件示例
Aug 07 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 google或baidu分页代码
2009/11/26 PHP
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
php-msf源码详解
2017/12/25 PHP
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
jquery实现简单手风琴菜单效果实例
2015/06/13 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
详解python之多进程和进程池(Processing库)
2017/06/09 Python
Python面向对象之继承代码详解
2018/01/29 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
读书心得体会
2013/12/28 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
2014年社区工作总结
2014/11/18 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
文明单位申报材料
2014/12/23 职场文书
六一领导慰问欢迎词
2015/01/26 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
javascript之Object.assign()的痛点分析
2022/03/03 Javascript
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js