手机端 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 相关文章推荐
可在线编辑网页文字效果代码(单击)
Mar 02 Javascript
javascript刷新父页面的各种方法汇总
Sep 03 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
基于jquery实现下拉框美化特效
Feb 02 Javascript
MvcPager分页控件 适用于Bootstrap
Jun 03 Javascript
解决vue 路由变化页面数据不刷新的问题
Mar 13 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
Aug 01 Javascript
一步步教你利用Docker设置Node.js
Nov 20 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
Oct 12 Javascript
vue-cli设置css不生效的解决方法
Feb 07 Javascript
原生js实现表格循环滚动
Nov 24 Javascript
element-ui点击查看大图的方法示例
Dec 14 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
PHP入门速成教程
2007/03/19 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
详解php命令注入攻击
2019/04/06 PHP
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
2014/04/02 Javascript
深入学习JavaScript中的Rest参数和参数默认值
2015/07/28 Javascript
jquery实现图片预加载
2015/12/25 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
vue浏览器返回监听的具体步骤
2021/02/03 Vue.js
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Python 支持向量机分类器的实现
2020/01/15 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
大学本科毕业生的自我鉴定
2013/11/26 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
火车的故事教学反思
2014/02/11 职场文书
分层教学实施方案
2014/03/19 职场文书
投标诚信承诺书
2014/05/26 职场文书
何玥事迹观后感
2015/06/16 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python