zoukankan      html  css  js  c++  java
  • 移动web HTML5使用photoswipe模仿微信朋友圈图片放大浏览

    先来几张效果图:

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

    同时支持分享功能:

    支持手势放大缩小

    使用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框架中,需要自己手动加入网页里

    复制代码
      1 <script type="text/javascript">
      2     var initPhotoSwipeFromDOM = function(gallerySelector) {
      3 
      4     // 解析来自DOM元素幻灯片数据(URL,标题,大小...)
      5     // (children of gallerySelector)
      6     var parseThumbnailElements = function(el) {
      7         var thumbElements = el.childNodes,
      8             numNodes = thumbElements.length,
      9             items = [],
     10             figureEl,
     11             linkEl,
     12             size,
     13             item;
     15 
     16         for(var i = 0; i < numNodes; i++) {
     17 
     18             figureEl = thumbElements[i]; // <figure> element
     19 
     20             // 仅包括元素节点
     21             if(figureEl.nodeType !== 1) {
     22                 continue;
     23             } 25             linkEl = figureEl.children[0]; // <a> element
     26             
     27             size = linkEl.getAttribute('data-size').split('x');
     28 
     29             // 创建幻灯片对象
     30             item = {
     31                 src: linkEl.getAttribute('href'),
     32                 w: parseInt(size[0], 10),
     33                 h: parseInt(size[1], 10)
     34             };
     35 
     36 
     37 
     38             if(figureEl.children.length > 1) {
     39                 // <figcaption> content
     40                 item.title = figureEl.children[1].innerHTML; 
     41             }
     42 
     43             if(linkEl.children.length > 0) {
     44                 // <img> 缩略图节点, 检索缩略图网址
     45                 item.msrc = linkEl.children[0].getAttribute('src');
     46             } 
     47 
     48             item.el = figureEl; // 保存链接元素 for getThumbBoundsFn
     49             items.push(item);
     50         }
     51 
     52         return items;
     53     };
     54 
     55     // 查找最近的父节点
     56     var closest = function closest(el, fn) {
     57         return el && ( fn(el) ? el : closest(el.parentNode, fn) );
     58     };
     59 
     60     // 当用户点击缩略图触发
     61     var onThumbnailsClick = function(e) {
     62         e = e || window.event;
     63         e.preventDefault ? e.preventDefault() : e.returnValue = false;
     64 
     65         var eTarget = e.target || e.srcElement;
     66 
     67         // find root element of slide
     68         var clickedListItem = closest(eTarget, function(el) {
     69             return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
     70         });
     71 
     72         if(!clickedListItem) {
     73             return;
     74         }
     75 
     76         // find index of clicked item by looping through all child nodes
     77         // alternatively, you may define index via data- attribute
     78         var clickedGallery = clickedListItem.parentNode,
     79             childNodes = clickedListItem.parentNode.childNodes,
     80             numChildNodes = childNodes.length,
     81             nodeIndex = 0,
     82             index;
     83 
     84         for (var i = 0; i < numChildNodes; i++) {
     85             if(childNodes[i].nodeType !== 1) { 
     86                 continue; 
     87             }
     88 
     89             if(childNodes[i] === clickedListItem) {
     90                 index = nodeIndex;
     91                 break;
     92             }
     93             nodeIndex++;
     94         }
     95 
     96 
     97 
     98         if(index >= 0) {
     99             // open PhotoSwipe if valid index found
    100             openPhotoSwipe( index, clickedGallery );
    101         }
    102         return false;
    103     };
    104 
    105     // parse picture index and gallery index from URL (#&pid=1&gid=2)
    106     var photoswipeParseHash = function() {
    107         var hash = window.location.hash.substring(1),
    108         params = {};
    109 
    110         if(hash.length < 5) {
    111             return params;
    112         }
    113 
    114         var vars = hash.split('&');
    115         for (var i = 0; i < vars.length; i++) {
    116             if(!vars[i]) {
    117                 continue;
    118             }
    119             var pair = vars[i].split('=');  
    120             if(pair.length < 2) {
    121                 continue;
    122             }           
    123             params[pair[0]] = pair[1];
    124         }
    125 
    126         if(params.gid) {
    127             params.gid = parseInt(params.gid, 10);
    128         }
    129 
    130         return params;
    131     };
    132 
    133     var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) {
    134         var pswpElement = document.querySelectorAll('.pswp')[0],
    135             gallery,
    136             options,
    137             items;
    138 
    139         items = parseThumbnailElements(galleryElement);
    140 
    141         // 这里可以定义参数
    142         options = {
    143           barsSize: { 
    144             top: 100,
    145             bottom: 100
    146           }, 
    147            fullscreenEl : false, // 是否支持全屏按钮
    148             shareButtons: [
    149             {id:'wechat', label:'分享微信', url:'#'},
    150             {id:'weibo', label:'新浪微博', url:'#'},
    151             {id:'download', label:'保存图片', url:'{{raw_image_url}}', download:true}
    152             ], // 分享按钮
    153 
    154             // define gallery index (for URL)
    155             galleryUID: galleryElement.getAttribute('data-pswp-uid'),
    156 
    157             getThumbBoundsFn: function(index) {
    158                 // See Options -> getThumbBoundsFn section of documentation for more info
    159                 var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail
    160                     pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
    161                     rect = thumbnail.getBoundingClientRect(); 
    162 
    163                 return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
    164             }
    165 
    166         };
    167 
    168         // PhotoSwipe opened from URL
    169         if(fromURL) {
    170             if(options.galleryPIDs) {
    171                 // parse real index when custom PIDs are used 
    172                 for(var j = 0; j < items.length; j++) {
    173                     if(items[j].pid == index) {
    174                         options.index = j;
    175                         break;
    176                     }
    177                 }
    178             } else {
    179                 // in URL indexes start from 1
    180                 options.index = parseInt(index, 10) - 1;
    181             }
    182         } else {
    183             options.index = parseInt(index, 10);
    184         }
    185 
    186         // exit if index not found
    187         if( isNaN(options.index) ) {
    188             return;
    189         }
    190 
    191         if(disableAnimation) {
    192             options.showAnimationDuration = 0;
    193         }
    194 
    195         // Pass data to PhotoSwipe and initialize it
    196         gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
    197         gallery.init();
    198     };
    199 
    200     // loop through all gallery elements and bind events
    201     var galleryElements = document.querySelectorAll( gallerySelector );
    202 
    203     for(var i = 0, l = galleryElements.length; i < l; i++) {
    204         galleryElements[i].setAttribute('data-pswp-uid', i+1);
    205         galleryElements[i].onclick = onThumbnailsClick;
    206     }
    207 
    208     // Parse URL and open gallery if it contains #&pid=3&gid=1
    209     var hashData = photoswipeParseHash();
    210     if(hashData.pid && hashData.gid) {
    211         openPhotoSwipe( hashData.pid ,  galleryElements[ hashData.gid - 1 ], true, true );
    212     }
    213     };
    214 
    215     // execute above function
    216     initPhotoSwipeFromDOM('.my-gallery');
    217 </script>
    复制代码

     加入以上代码即可完成一个图片浏览功能、相册、画廊

    为了方便大家直观了解,我做了一个demo出来:

     PhotoSwipe4.1.1Demo:http://download.csdn.net/detail/cq371356447/9494081

    /***********************************/
    /***********Hello!world!************/
    /***********************************/
  • 相关阅读:
    cmake自动添加宏定义
    Wapiti web扫描工具使用——支持ssl,看官方示例报告就知道如何支持带cookie和用户名密码的扫描了
    AI入门(重实践)书籍推荐
    初探零信任模型——就是假设所有的设备、人员等都是不可信的,在此基础上构建安全策略
    概率论疑难问题---7、通俗理解最小二乘法
    概率论疑难问题---6、极大似然估计
    概率论疑难问题---5、通俗理解中心极限定理
    matplotlib画直方图
    numpy数组添加元素
    概率论疑难问题---4、通俗理解概率论中的“矩”
  • 原文地址:https://www.cnblogs.com/webenh/p/7092961.html
Copyright © 2011-2022 走看看