手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果


Posted in Javascript onAugust 25, 2016

先来几张效果图:

手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果

点击其中一张照片可放大,可支持图片文字描述:

手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果

同时支持分享功能:

手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果

支持手势放大缩小

手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果

使用js框架是PhotoSwipe。 
PhotoSwipe是一个图片放大插件,兼容pc和移动端,经历过多个版本的迭代且一直在不断更新,踩过的坑不知凡几,在移动端有着巨大的优势。
1、可控制多种风格如:
标题、分享、全屏按钮,点击事件、是否加入字幕,背景透明等。
2、可支持移动端触摸手势兼容pc端
所有的基本手势支持:滑动下一个或上一个,拖动平移、缩放、放大或关闭,点击切换控件,双击放大或缩放。
3、分享
默认的UI有一个按钮,分享链接。默认的链接是facebook,推特和Pinterest,但你可以通过API设置分享类型。
4、用户界面
用户界面是完全从核心脚本分离。完全可以自定义界面。默认photoswipe UI是响应式的,桌面、平板电脑和移动设备完全可以使用。 
5、更多功能等你发现。 
官网:http://photoswipe.com/ 
github:https://github.com/dimsemenov/photoswipe

1、在官网下载PhotoSwipe,在页面中引入

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

2、页面中必须加入以下代码结构(此结构是插件图片浏览必须代码,作者并没有集成到js中,所以使用者必须手动加入自己的网页中):

<!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

 <!-- Background of PhotoSwipe. 
 It's a separate element as animating opacity is faster than rgba(). -->
 <div class="pswp__bg"></div>

 <!-- Slides wrapper with overflow:hidden. -->
 <div class="pswp__scroll-wrap">

 <!-- Container that holds slides. 
 PhotoSwipe keeps only 3 of them in the DOM to save memory.
 Don't modify these 3 pswp__item elements, data is added later on. -->
 <div class="pswp__container">
 <div class="pswp__item"></div>
 <div class="pswp__item"></div>
 <div class="pswp__item"></div>
 </div>

 <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
 <div class="pswp__ui pswp__ui--hidden">

 <div class="pswp__top-bar">

 <!-- Controls are self-explanatory. Order can be changed. -->

 <div class="pswp__counter"></div>

 <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

 <button class="pswp__button pswp__button--share" title="Share"></button>

 <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

 <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

 <!-- element will get class pswp__preloader--active when preloader is running -->
 <div class="pswp__preloader">
  <div class="pswp__preloader__icn">
  <div class="pswp__preloader__cut">
  <div class="pswp__preloader__donut"></div>
  </div>
  </div>
 </div>
 </div>

 <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
 <div class="pswp__share-tooltip"></div> 
 </div>

 <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
 </button>

 <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
 </button>

 <div class="pswp__caption">
 <div class="pswp__caption__center"></div>
 </div>

 </div>

 </div>

</div>

3、需要浏览的图片加入photoswipe结构代码,这里需要注意的是
 data-pswp-uid在每个相册中必须是唯一的,data-size是指定放大时图片显示的宽和高,若指定的宽高与图片不符会导致显示的图片变形;目前还没找到去掉 data-size的办法,但然有时间可以找下替代办法。

<!--data-pswp-uid在每个相册中必须是唯一的,data-size指定放大时图片显示的宽和高-->
<div class="my-gallery" data-pswp-uid="1">
<figure>
  <a href="img/m3.jpg" data-size="670x712">
  <img src="img/th1.jpg">
  </a>
  </figure>
</div>

4、加入js代码,此代码作者也没有集成到photoswipe框架中,需要自己手动加入网页里

<script type="text/javascript">
 var initPhotoSwipeFromDOM = function(gallerySelector) {

 // 解析来自DOM元素幻灯片数据(URL,标题,大小...)
 // (children of gallerySelector)
 var parseThumbnailElements = function(el) {
 var thumbElements = el.childNodes,
 numNodes = thumbElements.length,
 items = [],
 figureEl,
 linkEl,
 size,
 item;

 for(var i = 0; i < numNodes; i++) {

 figureEl = thumbElements[i]; // <figure> element

 // 仅包括元素节点
 if(figureEl.nodeType !== 1) {
 continue;
 } 25 linkEl = figureEl.children[0]; // <a> element
 
 size = linkEl.getAttribute('data-size').split('x');

 // 创建幻灯片对象
 item = {
 src: linkEl.getAttribute('href'),
 w: parseInt(size[0], 10),
 h: parseInt(size[1], 10)
 };


 if(figureEl.children.length > 1) {
 // <figcaption> content
 item.title = figureEl.children[1].innerHTML; 
 }

 if(linkEl.children.length > 0) {
 // <img> 缩略图节点, 检索缩略图网址
 item.msrc = linkEl.children[0].getAttribute('src');
 }

 item.el = figureEl; // 保存链接元素 for getThumbBoundsFn
 items.push(item);
 }

 return items;
 };

 // 查找最近的父节点
 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;

 // find root element of slide
 var clickedListItem = closest(eTarget, function(el) {
 return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
 });

 if(!clickedListItem) {
 return;
 }

 // find index of clicked item by looping through all child nodes
 // alternatively, you may define index via data- attribute
 var clickedGallery = clickedListItem.parentNode,
 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) {
 // open PhotoSwipe if valid index found
 openPhotoSwipe( index, clickedGallery );
 }
 return false;
 };

 // parse picture index and gallery index from URL (#&pid=1&gid=2)
 var photoswipeParseHash = function() {
 var hash = window.location.hash.substring(1),
 params = {};

 if(hash.length < 5) {
 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);

 // 这里可以定义参数
 options = {
 barsSize: { 
 top: 100,
 bottom: 100
 }, 
 fullscreenEl : false, // 是否支持全屏按钮
 shareButtons: [
 {id:'wechat', label:'分享微信', url:'#'},
 {id:'weibo', label:'新浪微博', url:'#'},
 {id:'download', label:'保存图片', url:'{{raw_image_url}}', download:true}
 ], // 分享按钮

 // define gallery index (for URL)
 galleryUID: galleryElement.getAttribute('data-pswp-uid'),

 getThumbBoundsFn: function(index) {
 // See Options -> getThumbBoundsFn section of documentation for more info
 var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail
  pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
  rect = thumbnail.getBoundingClientRect();

 return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
 }

 };

 // PhotoSwipe opened from URL
 if(fromURL) {
 if(options.galleryPIDs) {
 // parse real index when custom PIDs are used 
 for(var j = 0; j < items.length; j++) {
  if(items[j].pid == index) {
  options.index = j;
  break;
  }
 }
 } else {
 // in URL indexes start from 1
 options.index = parseInt(index, 10) - 1;
 }
 } else {
 options.index = parseInt(index, 10);
 }

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

 if(disableAnimation) {
 options.showAnimationDuration = 0;
 }

 // Pass data to PhotoSwipe and initialize it
 gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
 gallery.init();
 };

 // loop through all gallery elements and bind events
 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 );
 }
 };

 // execute above function
 initPhotoSwipeFromDOM('.my-gallery');
</script>

本文已被整理到了《JavaScript微信开发技巧汇总》,欢迎大家学习阅读。

为大家推荐现在关注度比较高的微信小程序教程一篇:《微信小程序开发教程》小编为大家精心整理的,希望喜欢。

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

Javascript 相关文章推荐
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
May 15 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
Dec 26 Javascript
javascript正则表达式使用replace()替换手机号的方法
Jan 19 Javascript
JS运动框架之分享侧边栏动画实例
Mar 03 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
javascript正则表达式定义(语法)总结
Jan 08 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
Aug 15 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
Aug 17 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
Dec 06 Javascript
JavaScript时间与时间戳的转换操作实例分析
Dec 07 Javascript
JavaScript实现简单动态表格
Dec 02 Javascript
手机图片预览插件photoswipe.js使用总结
Aug 25 #Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
Aug 25 #Javascript
jQuery组件easyui对话框实现代码
Aug 25 #Javascript
jQuery组件easyui基本布局实现代码
Aug 25 #Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
Aug 25 #Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
Aug 25 #Javascript
总结JavaScript的正则与其他语言的不同之处
Aug 25 #Javascript
You might like
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
php while循环得到循环次数
2013/10/26 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
2012/01/15 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
javascript常见数据验证插件大全
2015/08/03 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
简单理解js的prototype属性及使用
2016/12/07 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
python实现折半查找和归并排序算法
2017/04/14 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
社团招新策划书
2014/02/04 职场文书
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
加薪申请报告范本
2015/05/15 职场文书
2016婚礼主持词开场白
2015/11/24 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis