移动端图片预览功能(放大和左右滑动)

1.分享一个好用的h5移动端图片预览插件,直接上代码:在你的项目中引入imageReview.js文件,如下:

var reviewHtml='<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">'+
    '<div class="pswp__bg"></div>'+
    '<div class="pswp__scroll-wrap">'+
        '<div class="pswp__container">'+
            '<div class="pswp__item"></div>'+
            '<div class="pswp__item"></div>'+
            '<div class="pswp__item"></div>'+
        '</div>'+
        '<div class="pswp__ui pswp__ui--hidden">'+
            '<div class="pswp__top-bar">'+
                '<div class="pswp__counter"></div>'+
                '<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>'+
                '<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>'+
                '<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>'+
                '<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>';
$('body').append(reviewHtml);

//预览图片
var initPhotoSwipeFromDOM = function(gallerySelector) {
    // 解析来自DOM元素幻灯片数据(URL,标题,大小...)
    var parseThumbnailElements = function(el) {
        var thumbElements = el.childNodes,
            numNodes = thumbElements.length,
            items = [],
            figureEl,
            linkEl,
            size,
            item,
            divEl;
        for(var i = 0; i < numNodes; i++) {
            figureEl = thumbElements[i]; // <figure> element
            // 仅包括元素节点
            if(figureEl.nodeType !== 1) {
                continue;
            }
            divEl = figureEl.children[0];
            linkEl = divEl.children[0]; // <a> element
            // 创建幻灯片对象
            var img = linkEl.children[0];
            item = {
                src: linkEl.getAttribute('href'),
                w: parseInt(img.naturalWidth, 10),
                h: parseInt(img.naturalHeight, 10)
            };
            if(figureEl.children.length > 1) {
                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;
        var clickedListItem = closest(eTarget, function(el) {
            return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
        });
        if(!clickedListItem) {
            return;
        }
        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) {
            openPhotoSwipe( index, clickedGallery );
        }
        return false;
    };

    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}
            ],
            galleryUID: galleryElement.getAttribute('data-pswp-uid'),
            getThumbBoundsFn: function(index) {
                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};
            }
        };
        if(fromURL) {
            if(options.galleryPIDs) {
                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);
        }
        if( isNaN(options.index) ) {
            return;
        }
        if(disableAnimation) {
            options.showAnimationDuration = 0;
        }
        gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
        gallery.init();
    };

    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;
    }
    var hashData = photoswipeParseHash();
    if(hashData.pid && hashData.gid) {
        openPhotoSwipe( hashData.pid ,  galleryElements[ hashData.gid - 1 ], true, true );
    }
};

function stopHref(event){
    event.preventDefault();
    return false;
}

2.接着在你的html中按照这样的格式渲染图片就ok了

<div class="my-gallery" data-pswp-uid="1">
            <figure style="height: 74px;width: 74px;float: left;margin: 0px 20px 10px 0;">
                <div class="img-dv worker-photo">
                    <a href="http://img0.imgtn.bdimg.com/it/u=151472226,3497652000&fm=26&gp=0.jpg" onclick="stopHref(event)">
                        <img src="http://img0.imgtn.bdimg.com/it/u=151472226,3497652000&fm=26&gp=0.jpg" width="74" height="74" style="border-radius:6px;">
                    </a>
                </div>
            </figure>
            <figure style="height: 74px;width: 74px;float: left;margin: 0px 20px 10px 0;">
                <div class="img-dv worker-photo">
                    <a href="http://img0.imgtn.bdimg.com/it/u=151472226,3497652000&fm=26&gp=0.jpg" onclick="stopHref(event)">
                        <img src="http://img0.imgtn.bdimg.com/it/u=151472226,3497652000&fm=26&gp=0.jpg" width="74" height="74" style="border-radius:6px;">
                    </a>
                </div>
            </figure>
 </div>

附上效果图:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现移动端App中的页面放大并进行滑动查看,可以借助于一些第三方库和浏览器自带的一些属性来实现。下面是一个简单的示例代码: 1. 引入依赖: ```javascript import Hammer from 'hammerjs'; // 引入Hammer.js库 ``` 2. 在mounted钩子函数中初始化Hammer,并绑定事件: ```javascript <script> export default { mounted() { const el = this.$refs.zoom; const mc = new Hammer.Manager(el); const pinch = new Hammer.Pinch(); mc.add(pinch); let currentScale = 1; let lastScale = 1; let posX = 0; let posY = 0; let lastPosX = 0; let lastPosY = 0; mc.on('pinchstart', function(ev) { lastScale = currentScale; }); mc.on('pinchmove', function(ev) { currentScale = lastScale * ev.scale; el.style.transform = `translate3d(${posX}px, ${posY}px, 0) scale(${currentScale})`; }); mc.on('panmove', function(ev) { posX = lastPosX + ev.deltaX; posY = lastPosY + ev.deltaY; el.style.transform = `translate3d(${posX}px, ${posY}px, 0) scale(${currentScale})`; }); mc.on('panend', function(ev) { lastPosX = posX; lastPosY = posY; }); } } </script> ``` 这里使用了Hammer.js库来处理触摸事件。在mounted钩子函数中,我们初始化Hammer,并绑定pinch和pan事件。在pinch事件中,我们计算出当前的缩放比例,并将其应用到元素的transform属性上。在pan事件中,我们计算出元素的位置,并将其应用到元素的transform属性上。在panend事件中,我们记录下元素的最后位置,以便下一次操作时使用。 3. 在模板中添加元素,并绑定ref属性: ```html <template> <div ref="zoom"> <!-- 页面内容 --> </div> </template> ``` 这里使用一个div元素来包裹页面内容,并将其绑定到ref属性上,以便在mounted钩子函数中使用。 4. 在样式中设置元素的初始大小和位置: ```css .zoom { position: relative; overflow: hidden; width: 100%; height: 100%; transform-origin: 0 0; transition: transform 0.3s ease-out; } ``` 这里设置了元素的宽高为100%,通过设置transform-origin属性,使缩放时页面的中心点为左上角。同时设置了过渡效果,使缩放时有平滑的过渡效果。 通过以上步骤,我们就可以实现一个移动端App中的页面放大并进行滑动查看的效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值