zoukankan      html  css  js  c++  java
  • 移动端图片点击放大缩小(例如商品详情时)插件

    使用:

            showImagesFn.init({
                "btnName" : "imgs_ul",
                "end" : function(index,wrapper){
                    wrapper.siblings(".img_percent").find("span").eq(0).html(index + 1);
                    var width = wrapper.find("li").width();
                    wrapper.find("ul").css("margin-left" , - index * width).attr("data-index" , index);
                }
            });
    <ul class="imgs_ul clearfix">
                                                    <volist name="appraiseData_best_list['appraisesAnnex']" id="vull">
                                                        <li><img src="{$vull}"><span>{$appraiseData_best_list['appraisesImg_count']}张</span></li>
                                                    </volist>
    
                                                </ul>

    代码:

    /**
     * 
     * @authors lwd (495986719@qq.com)
     * @date    2018-02-01 16:39:05
     * @version v.1.0.1
     * @params     {
                    "btnName" : "imgs_ul",    //包含li->img标签的父元素,可以是id或者class
                    "scaleSmall" : 1,        //手机,手动缩放图片的最小缩小倍数,默认1
                    "scaleBig" : 4            //手机,手动缩放图片的最大放大倍数,默认4
                }
     */
    
    var showImagesFn = {
        "init" : function(json){
            this.btnName = json.btnName;
            this.scaleBig = json.scaleBig || 4;//最大放大倍数
            this.scaleSmall = json.scaleSmall || 1;//最小缩小倍数
            this.end = json.end || function(){};
            this.winWidth = $(window).width();
            this.winHeight = $(window).height();
            this.imgWrapWidth = $(window).width() > 640 ? 640 : $(window).width();
            this.index = 0;
            this.scaleArray = [];
            this.touchMethod = 0;
            this.showImagesContainer();
            return this;
        },
        "getUrls" : function(child){
            var lis = $(child).parent().find("li");
            var scope = this;
            lis.each(function(){
                var img = $(this).find("img");
                if (img.parent().hasClass("MIDIV")) {
                    var url = img.parent().attr("data-src");
                }else{
                    var url = $(this).find("img").attr("src");
                }
                scope.urls.push(url);
            });
            this.length = this.urls.length;
        },
        "setHtml" : function(){
            var section = $('<section style="position: fixed;  100%; height: 100%;bottom: -100%; z-index: 1001; left: 0;"></section>');
            this.section = section;
            this.cover = $('<div class="showImages_cover" style="position: fixed;  100%; height: 100%; z-index: 1000; background-color: #000; top: 0;"></div>');
            this.container = $('<div class="showImagesCotainer" style="position: absolute; top: -100%; height:100%;  100%; left: 0; z-index: 1001;"></div>');
            var head = $('<div class="showImagesHead" style="height: 44px; line-height: 44px; text-align: center; font-size: 14px; color: #fff; position: relative; z-index: 3;"></div>');
            this.nowIndex = $('<span class="showImagesNowIndex" style="margin-right: 3px;">1</span>');
            this.totalImgs = $('<span class="showImagesTotalImgs" style="margin-left: 3px;"></span>');
            this.totalImgs.html(this.length);
            head.append(this.nowIndex);
            head.append("/");
            head.append(this.totalImgs);
            this.container.append(head);
            this.body = $('<div class="showImagesBody" style="position: absolute; z-index: 2; top: 0; bottom: 0;  100%;overflow:hidden;"></div>');
            var ul = $('<ul class="showImagesUl" style="position:absolute;height:100%;left:0;top:0;"></ul>');
            ul.css({
                "width" : this.winWidth * this.length
            });
            this.ul = ul;
            var prop = this.imgWrapWidth / this.winHeight;
            var scope = this;
            scope.loadImg(0);
            this.body.append(ul);
            this.container.append(this.body);
            section.append(this.cover);
            section.append(this.container);
            this.shutDown = $('<div class="showImagesShutDown"></div>');
            this.shutDown.css({
                "width": "30%",
                "height": "44px",
                "position": "absolute",
                "z-index": "1002",
                "left": "0",
                "top": "-100%"
            });
            var span = $('<span></span>')
            span.css({
                "display": "block",
                "width": "14px",
                "height": "14px",
                "border-left": "1px solid #fff",
                "border-top": "1px solid #fff",
                "transform": "rotate(-45deg)",
                "position": "absolute",
                "left": "14px",
                "top": "14px"
            });
            this.shutDown.append(span);
            section.append(this.shutDown);
            $(document.body).append(section);
            var scope = this;
            this.ul.on("touchstart",function(e){
                scope.slideTouchStart(e,scope);
            });
            this.ul.on("touchmove",function(e){
                scope.slideTouchMove(e,scope);
            });
            this.ul.on("touchend",function(e){
                scope.slideTouchEnd(e,scope);
            });
            this.ul.on("mousedown",function(e){
                scope.mouseDown(e,scope);
            });
            this.ul.on("mousemove",function(e){
                scope.mouseMove(e,scope);
            });
            this.ul.on("mouseup",function(e){
                var e = e || window.event;
                scope.mouseUp(e,scope);
                var upX = e.clientX;
                var upY = e.clientY;
                if (Math.abs(upX - scope.mouseX) < 1 && Math.abs(upY - scope.mouseY) < 1) {
                    scope.hideContainer();
                }
            });
        },
        "loadImg" : function(i){
            var scope = this;
            var img = new Image();
            img.src = scope.urls[i];
            img.onerror = function(){
                if (WST) {
                    var bakSrc = WST.ROOT + "/Public/wap/images/loadFail.png";
                }else{
                    var bakSrc = "/Public/wap/images/loadFail.png";
                }
                scope.setLi(this,scope,bakSrc);
                if (i < scope.length - 1) {
                    scope.loadImg(i + 1);
                }
            }
            img.onload = function(){
                scope.setLi(this,scope);
                if (i < scope.length - 1) {
                    scope.loadImg(i + 1);
                }
            }
        },
        "setLi" : function(thisImg,scope,src){
            var width = thisImg.naturalWidth;
            var height = thisImg.naturalHeight;
            var li = $('<li style="float:left;"></li>');
            li.css({
                "width" : scope.winWidth,
                "height" : scope.winHeight,
                "position" : "relative",
                "display" : "-webkit-box",
                "vertical-align" : "middle",
                "-webkit-box-pack" : "center",
                "-webkit-box-align" : "center"
                // ,"-webkit-transform" : "scale(2)"
            });
            var imgElement = $("<img />");
            src = src || thisImg.src;
            imgElement.attr({"src" : src}).css({
                "max-width" : "100%",
                "max-height" : "100%",
                "display" : "block",
                "overflow": "hidden"
            });
            li.append(imgElement);
            scope.ul.append(li);
            scope.scaleArray.push(1);
        },
        "winResize" : function(){
            var scope = this;
            $(window).resize(function(){
                scope.winWidth = $(window).width();
                scope.winHeight = $(window).height();
                scope.imgWrapWidth = $(window).width() > 640 ? 640 : $(window).width();
                scope.ul.css({
                    "width" : scope.winWidth * scope.length,
                    "height" : scope.winHeight,
                    "left" : -scope.winWidth * scope.index
                });
                scope.ul.find("li").css({
                    "width" : scope.winWidth,
                    "height" : scope.winHeight
                });
            });
        },
        "showImagesContainer" : function(){
            var scope = this;
            var btn = $("#" + this.btnName).length > 0 ? "#" + this.btnName : "." + this.btnName;
            var mouseMoveHappen = false;
            $(document).on("mousemove",function(){
                mouseMoveHappen = true;
            });
            $(document).on("mousedown",function(){
                mouseMoveHappen = false;
            });
            $(document).on("click",btn + " li",function(){
                scope.btnBom = $(this).closest(btn);
                if (!mouseMoveHappen) {
                    scope.urls = [];
                    scope.getUrls(this);
                    scope.index = $(this).index();
                    var scrollTop = $(window).scrollTop();
                    var left = ($(window).width() - $(document.body).width()) / 2;
                    $(document.body).css({"position":"fixed","top":"-" + scrollTop + "px","left" : left});
                    scope.setHtml();
                    scope.hideImagesContainer();
                    scope.ul.css({
                        "left" : -scope.winWidth * scope.index
                    });
                    scope.nowIndex.html(scope.index + 1);
                    scope.winResize();
                }
            });
        },
        "hideImagesContainer" : function(){
            var scope = this;
            this.shutDown.click(function(){
                scope.hideContainer();
            });
        },
        "hideContainer" : function(){
            var top = -parseFloat($(document.body).offset().top);
            $(document.body).css({"position":"initial"});
            $(window).scrollTop(top);
            for (var i = 0; i < this.length; i++) {
                this.scaleArray[i] = 1;
            }
            this.section.remove();
            this.end && this.end(this.index,this.btnBom);
        },
        "slideTouchStart" : function(e,scope){
            var touch = e.originalEvent.changedTouches[0];
            scope.startX = touch.clientX;
            scope.startY = touch.clientY;
            scope.ulLeft = parseFloat(scope.ul.css("left"));
            scope.ulTop = parseFloat(scope.ul.css("top"));
            scope.touchMethod = 1;
            try {
                scope.dis = [];
            }catch (e) {
                alert('touchSatrtFunc:' + e.message);
            }
        },
        "mouseDown" : function(e,scope){
            var e = e || window.event;
            scope.mouseX = e.clientX;
            scope.mouseY = e.clientY;
            scope.ulLeft = parseFloat(scope.ul.css("left"));
            scope.ulTop = parseFloat(scope.ul.css("top"));
            scope.mouseStart = 1;
        },
        "mouseMove" : function(e,scope){
            var e = e || window.event;
            e.preventDefault();
            if (scope.mouseStart === 1) {
                scope.mX = e.clientX;
                scope.mY = e.clientY;
                var dx = scope.mX - scope.mouseX;
                var dy = scope.mY - scope.mouseY;
                var left;
                //过度距离
                var boundDis = 10;
                //超越距离
                var switchDis = 30;
                left = scope.ulLeft + dx;
                scope.ul.css({
                    "left" : left
                });
            }
        },
        "slideTouchMove" : function(e,scope){
            e.preventDefault();
            var evt = e.originalEvent;
            var touch = evt.touches[0];
            if (evt.touches.length === 1 && scope.touchMethod === 1) {
                scope.dX = touch.clientX;
                scope.dY = touch.clientY;
                var dx = scope.dX - scope.startX;
                var dy = scope.dY - scope.startY;
                var boundLeft = scope.winWidth * (scope.scaleArray[scope.index] - 1) / 2 - scope.winWidth * scope.index;
                var boundRight = -scope.winWidth * (scope.scaleArray[scope.index] - 1) / 2 - scope.winWidth * scope.index;
                var boundTop = scope.winHeight * (scope.scaleArray[scope.index] - 1) / 2;
                var left,top;
                //过度距离
                var boundDis = 10;
                //超越距离
                var switchDis = 30;
                if (scope.scaleArray[scope.index] > 1) {
                    if (scope.ulTop + dy >= boundTop + boundDis ) {
                        top = boundTop + boundDis;
                    }else if(scope.ulTop + dy <= -boundTop - boundDis){
                        top = -boundTop - boundDis;
                    }else{
                        top = scope.ulTop + dy;
                    }
                    if (scope.ulLeft + dx >= boundLeft + boundDis) {
                        //放大时向右滑
                        var bdx = scope.ulLeft + dx - ((boundLeft + boundDis));
                        left = boundLeft + boundDis + bdx / 10;
                        if (left > boundLeft + switchDis) {
                            scope.scaleArray[scope.index] = 1;
                            top = 0;
                            if (scope.index > 0) {
                                scope.ul.find("li").eq(scope.index - 1).css({
                                    "z-index" : 1
                                }).siblings().css({
                                    "webkitTransform" : 'scale(1)',
                                    "z-index" : 0
                                });
                            }
                        }
                    }else if(scope.ulLeft + dx <= boundRight - boundDis){
                        //放大时向左滑
                        var bdx = scope.ulLeft + dx - (boundRight - boundDis);
                        left = boundRight - boundDis + bdx / 10;
                        if (left < boundRight - switchDis) {
                            scope.scaleArray[scope.index] = 1;
                            top = 0;
                            if (scope.index < scope.length - 1) {
                                scope.ul.find("li").eq(scope.index + 1).css({
                                    "z-index" : 1
                                }).siblings().css({
                                    "webkitTransform" : 'scale(1)',
                                    "z-index" : 0
                                });
                            }
                        }
                    }else{
                        left = scope.ulLeft + dx;
                    }
                    scope.ul.css({
                        "top" : top
                    });
                    scope.ul.css({
                        "left" : left
                    });
                }else{
                    left = scope.ulLeft + dx;
                    scope.ul.css({
                        "left" : left
                    });
                }
            }else if(evt.touches.length === 2){
                scope.touchMethod = 2;
                try {
                    var x = Number(touch.clientX); //页面触点X坐标
                    var y = Number(touch.clientY); //页面触点Y坐标
                    if (evt.targetTouches.length == 2) {
                        var touch1 = evt.targetTouches[1]; //获取第2个触点
                        var x1 = Number(touch1.clientX); //页面触点X坐标
                        var y1 = Number(touch1.clientY); //页面触点Y坐标
                        scope.dis.push(Math.sqrt(Math.pow(x - x1, 2) + Math.pow(y - y1, 2)));
                        if (scope.dis.length > 1) {
                            scope.scaleArray[scope.index] -= 0.05 * (scope.dis[scope.dis.length - 2] - scope.dis[scope.dis.length - 1]);
                            if (scope.scaleArray[scope.index] < scope.scaleSmall) {
                                scope.scaleArray[scope.index] = scope.scaleSmall;
                            }
                            if(scope.scaleArray[scope.index] > scope.scaleBig){
                                scope.scaleArray[scope.index] = scope.scaleBig;
                            }
                            scope.ul.find("li").eq(scope.index).css({
                                "webkitTransform" : 'scale(' + scope.scaleArray[scope.index] + ')',
                                "z-index": 1
                            }).siblings().css({
                                "z-index" : 0
                            });
                        }
                    }
                }catch (e) {
                  alert('touchMoveFunc:' + e.message);
                }
            }
        },
        "mouseUp" : function(e,scope){
            var e = e || window.event;
            var evt = e.originalEvent;
            scope.endX = e.clientX;
            var dx = scope.endX - scope.mouseX;
            if (Math.abs(dx) / scope.imgWrapWidth < 0.1) {
                scope.ul.stop().animate({
                    "left" : -scope.winWidth * scope.index
                },200);
            }else{
                if (dx > 0) {
                    if (scope.index === 0) {
                        scope.ul.stop().animate({
                            "left" : -scope.winWidth * scope.index
                        },200,moveEnd);
                    }else{
                        scope.ul.stop().animate({
                            "left" : -scope.winWidth * (scope.index - 1)
                        },200,function(){
                            if (scope.index > 0) {
                                scope.index --;
                                scope.nowIndex.html(scope.index + 1);
                            }
                            moveEnd();
                        });
                    }
                }else{
                    if (scope.index === (scope.length - 1)) {
                        scope.ul.stop().animate({
                            "left" : -scope.winWidth * scope.index
                        },200,moveEnd);
                    }else{
                        scope.ul.stop().animate({
                            "left" : -scope.winWidth * (scope.index + 1)
                        },200,function(){
                            if (scope.index < scope.length - 1) {
                                scope.index ++;
                                scope.nowIndex.html(scope.index + 1);
                                moveEnd();
                            }
                        });
                    }
                }
            }
            scope.mouseStart = 0;
            function moveEnd(){
                scope.ul.find("li").eq(scope.index).css({
                    "z-index" : 1
                }).siblings().css({
                    "z-index" : 0
                });
            }
        },
        "slideTouchEnd" : function(e,scope){
            var evt = e.originalEvent;
            var touch = evt.changedTouches[0];
            if (scope.scaleArray[scope.index] > 1) {
                try {
                    e.preventDefault(); //阻止触摸时浏览器的缩放、滚动条滚动
                }catch (e) {
                    alert('touchEndFunc:' + e.message);
                }
            }else{
                scope.endX = touch.clientX;
                var dx = scope.endX - scope.startX;
                if (Math.abs(dx) / scope.imgWrapWidth < 0.05) {
                    scope.ul.stop().animate({
                        "left" : -scope.winWidth * scope.index,
                        "top" : 0
                    },200);
                }else{
                    if (dx > 0) {
                        if (scope.index === 0) {
                            scope.ul.stop().animate({
                                "left" : -scope.winWidth * scope.index
                            },200,moveEnd);
                        }else{
                            scope.ul.stop().animate({
                                "left" : -scope.winWidth * (scope.index - 1)
                            },200,function(){
                                if (scope.index > 0) {
                                    scope.index --;
                                    scope.nowIndex.html(scope.index + 1);
                                }
                                moveEnd();
                            });
                        }
                    }else{
                        if (scope.index === (scope.length - 1)) {
                            scope.ul.stop().animate({
                                "left" : -scope.winWidth * scope.index
                            },200,moveEnd);
                        }else{
                            scope.ul.stop().animate({
                                "left" : -scope.winWidth * (scope.index + 1)
                            },200,function(){
                                if (scope.index < scope.length - 1) {
                                    scope.index ++;
                                    scope.nowIndex.html(scope.index + 1);
                                    moveEnd();
                                }
                            });
                        }
                    }
                }
            }
            function moveEnd(){
                for (var i = 0; i < scope.length; i++) {
                    if (i !== scope.index) {
                        scope.scaleArray[i] = 1;
                    }
                    scope.ul.find("li").eq(i).css({
                        "webkitTransform" : 'scale(' + scope.scaleArray[i] + ')'
                    });
                }
                scope.ul.find("li").eq(scope.index).css({
                    "z-index" : 1
                }).siblings().css({
                    "z-index" : 0
                });
            }
        }
    };
  • 相关阅读:
    Yii 动作过滤的方法
    artdialog
    第一天:安装nodejs
    yii模块下面的组件
    总是容易忘记 jquery ajax POST
    【来自简书】浏览器~加载,解析,渲染
    【收藏】九个PHP很有用的功能
    从理论到实践,全方位认识DNS(实践篇)
    从理论到实践,全方位认识DNS(理论篇)
    DNS解析过程原理
  • 原文地址:https://www.cnblogs.com/lst619247/p/8888074.html
Copyright © 2011-2022 走看看