您好,欢迎访问一九零五行业门户网

基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解_javascript技巧

调用方式 :imageview(index,imgdata)  --index参数 为图片默认显示的索引值,类型 为number  --imadata参数 为图片url数组 ,类型为array
使用之前要先引入 zepto.js 文件
imageview.js具体代码如下:
复制代码 代码如下:
/*
 * imageview v1.0.0
 * --基于zepto.js的大图查看
 * --调用方法 imageview(index,imgdada)
 * --index 图片默认值显示索引,number  --imgdata 图片url数组,array
 * */
var imageview=(function(window,$){
    var _this=$(#slideview),_imgdata=[],_index=0,_length=0,
        _start=[],_org=[],_orgtime=null,
        _lasttapdate=null,
        _zoom=1,_zoomxy=[0,0],_transx=null,
        _advancedsupport = false,
        _doubledistorg=1,_doublezoomorg=1,isdoublezoom = false,
        isslide=true,isdrag=false,timer=null,
        winw=window.innerwidth,winh=window.innerheight;
    /**
     * 事件对象 event
     */
    var event={
        touchstart:function(e){
            e.preventdefault();
            if (_advancedsupport && e.touches && e.touches.length >= 2) {
                var img = getimg();
                $(img).css({-webkit-transitionduration: 0ms,transitionduration: 0ms});
                _doublezoomorg = _zoom;
                _doubledistorg = getdist(e.touches[0].pagex, e.touches[0].pagey, e.touches[1].pagex, e.touches[1].pagey);
                isdoublezoom = true;
                return
            }
            e = e.touches ? e.touches[0] : e;
            isdoublezoom = false;
            _start = [e.pagex, e.pagey];
            _org = [e.pagex, e.pagey];
            _orgtime = date.now();
            _transx = -_index * winw;
            if(_zoom!=1){
                _zoomxy = _zoomxy || [0, 0];
                _orgzoomxy = [_zoomxy[0], _zoomxy[1]];
                var img = getimg();
                img&&($(img).css({-webkit-transitionduration: 0ms,transitionduration: 0ms}));
                isdrag = true
            }else{
                _this.find(.pv-inner).css({-webkit-transitionduration:0ms,transitionduration:0ms});
                isslide = true
            }
        },
        touchmove:function(e){
            e.preventdefault();
            if (_advancedsupport && e.touches && e.touches.length >= 2) {
                var newdist = getdist(e.touches[0].pagex, e.touches[0].pagey, e.touches[1].pagex, e.touches[1].pagey);
                _zoom = (newdist/_doubledistorg) * _doublezoomorg
                var img = getimg();
                $(img).css({-webkit-transitionduration: 0ms,transitionduration: 0ms});
                if (_zoom                     _zoom = 1;
                    _zoomxy = [0, 0];
                    $(img).css({-webkit-transitionduration: 200ms,transitionduration: 200ms})
                } else if (_zoom >getscale(img) * 2){
                     _zoom = getscale(img) * 2;
                }
                $(img).css({-webkit-transform: scale( + _zoom + ) translate( + _zoomxy[0] + px, + _zoomxy[1] + px),transform: scale( + _zoom + ) translate( + _zoomxy[0] + px, + _zoomxy[1] + px)});
                return
            }
            if (isdoublezoom){
                return;
            }
            e = e.touches ? e.touches[0] : e;
            if (_zoom != 1) {
                var deltax = (e.pagex - _start[0]) / _zoom;
                var deltay = (e.pagey - _start[1]) / _zoom;
                _start = [e.pagex, e.pagey];
                var img = getimg();
                var newwidth = img.clientwidth *_zoom,
                    newheight = img.clientheight * _zoom;
                var borderx = (newwidth - winw) / 2 / _zoom,
                    bordery = (newheight - winh) / 2 / _zoom;
                (borderx >= 0)&&(_zoomxy[0] borderx)&&(deltax /= 3);
                (bordery > 0)&&(_zoomxy[1] bordery)&&(deltay /= 3);
                _zoomxy[0] += deltax;
                _zoomxy[1] += deltay;
                (_length == 1 && newwidth                 (_length == 1 && newheight                 $(img).css({-webkit-transform: scale( + _zoom + ) translate( + _zoomxy[0] +
                    px, + _zoomxy[1] + px),transform: scale( + _zoom + ) translate( + _zoomxy[0] +
                    px, + _zoomxy[1] + px)})
            }else{
                if (!isslide) return;
                var deltax = e.pagex - _start[0];
                (_transx > 0 || _transx                 _transx = -_index * winw + deltax;
                _this.find(.pv-inner).css({-webkit-transform:translate( + _transx + px,0px) translatez(0)});
            }
        },
        touchend:function(e){
            if (isdoublezoom) {
                return;
            }
            if (_zoom != 1) {
                if (!isdrag){return;}
                var img = getimg();
                var newwidth = img.clientwidth *_zoom,
                    newheight = img.clientheight * _zoom;
                var borderx = (newwidth - winw) / 2 / _zoom,
                    bordery = (newheight - winh) / 2 / _zoom;
                if (_length > 1 && borderx >= 0) {
                    var updatedelta = 0;
                    var switchdelta = winw / 6;
                    if (_zoomxy[0]                         updatedelta = 1;
                    }else if (_zoomxy[0] > borderx + switchdelta / _zoom && _index > 0){
                        updatedelta = -1;
                    }
                    if (updatedelta != 0) {
                        scaledown(img);
                        changeindex(_index + updatedelta);
                        return
                    }
                }
                var delta = date.now() - _orgtime;
                if (delta                     (delta                     var deltadis = math.pow(180 / delta, 2);
                    _zoomxy[0] += (_zoomxy[0] - _orgzoomxy[0]) * deltadis;
                    _zoomxy[1] += (_zoomxy[1] - _orgzoomxy[1]) * deltadis;
                    $(img).css({-webkit-transition: 400ms cubic-bezier(0.08,0.65,0.79,1),transition: 400ms cubic-bezier(0.08,0.65,0.79,1)})
                } else{
                    $(img).css({-webkit-transition: 200ms linear,transition: 200ms linear});
                }
                if (borderx >= 0){
                    if (_zoomxy[0]                         _zoomxy[0] = -borderx;
                    }else if (_zoomxy[0] > borderx){
                        _zoomxy[0] = borderx;
                    }
                }
                if (bordery > 0){
                    if (_zoomxy[1]                         _zoomxy[1] = -bordery;
                    }else if (_zoomxy[1] >bordery){
                        _zoomxy[1] = bordery;
                    }
                }
                if (math.abs(_zoomxy[0])                     $(img).css({-webkit-transform: scale( + _zoom + ) translate(0px, + _zoomxy[1] + px),transform: scale( + _zoom + ) translate(0px, + _zoomxy[1] + px)});
                    return
                } else{
                    $(img).css({-webkit-transform: scale( + _zoom + ) translate( + _zoomxy[0] + px, + _zoomxy[1] + px),transform: scale( + _zoom + ) translate( + _zoomxy[0] + px, + _zoomxy[1] + px)});
                }
                isdrag = false
            }else{
                if (!isslide){ return;}
                var deltax = _transx - -_index * winw;
                var updatedelta = 0;
                if (deltax > 50){
                    updatedelta = -1;
                }else if(deltax                     updatedelta = 1;
                }
                _index=_index+updatedelta;
                changeindex(_index);
                isslide =false
            }
        },
        click:function(e){
            _zoom=1;
            _zoomxy=[0,0];
            _this.css(opacity,0);
            timer=settimeout(function(){
                _this.css({display:}).html();
                unbind();
            },150)
        },
        dobeltap:function(e){
            cleartimeout(timer);
            var now = new date;
            if (now - _lasttapdate                 return;
            }
            _lasttapdate = now;
            var img = getimg();
            if (!img){
                return;
            }
            if (_zoom != 1){
                scaledown(img);
            }else{
                scaleup(img);
            }
        },
        setview:function(e){
            winw=window.innerwidth;
            winh=window.innerheight;
            _this.width(window.innerwidth).height(window.innerheight);
            translate((-_index*window.innerwidth),0,0,$(.pv-inner)[0]);
            scaledown(getimg())
        }
    };
    var handleevent=function(e){
        switch (e.type){
            case touchstart:
                event.touchstart(e);
                break;
            case touchmove:
                event.touchmove(e);
                break;
            case touchcancel:
            case touchend:
                event.touchend(e);
                break;
            case orientationchange:
            case resize:
                event.setview(e);
                break
        }
    };
    /**
     * 绑定事件
     */
    var bind=function(){
        _this.on(singletap,function(e){
            e.preventdefault();
            var now = new date;
            if (now - _lasttapdate                 return;           
            }
            _lasttapdate = now;
            event.click(e);
            return false;
        }).on(doubletap, function(e) {
            e.preventdefault();
            event.dobeltap(e);
            return false;
        });
        _this.on(touchstart touchmove touchend touchcancel, function(e) {
            handleevent(e);
        });
        event.setview();
        onorientationchange in window ? window.addeventlistener(orientationchange,event.setview,false) : window.addeventlistener(resize,event.setview,false);
    };
    /**
     * 解除事件
     */
    var unbind= function() {
         _this.off();
        onorientationchange in window ? window.removeeventlistener(orientationchange,event.setview, false) : window.removeeventlistener(resize,event.setview, false)
    };
    var getdist= function(x1, y1, x2, y2) {
        return math.sqrt(math.pow(x2 - x1, 2) + math.pow(y2 - y1, 2), 2)
    }
    /**
     * 图片缩放
     */
    var getscale=function(img) {
        var h = img.naturalheight, w = img.naturalwidth,
        scale=w*h/(img.clientheight*img.clientwidth);
        return scale;
    };
    var scaleup=function(img) {
        var scale = getscale(img);
        if (scale > 1)
            $(img).css({-webkit-transform: scale( + scale + ),transform: scale( + scale + ),-webkit-transition: 200ms,transition: 200ms});
        _zoom = scale;
    };
    var scaledown=function(img) {
        _zoom = 1;
        _zoomxy = [0, 0];
        _doubledistorg = 1;
        _doublezoomorg = 1;
        $(img).css({-webkit-transform: scale(1),transform: scale(1),-webkit-transition: 200ms,transition: 200ms});
    };
    /**
     * 滑动效果
     * dist
     */
    var translate = function( distx,disty,speed,ele) {
        if( !!ele ){ ele=ele.style; }else{ return; }
        ele.webkittransitionduration =  ele.moztransitionduration = ele.mstransitionduration = ele.otransitionduration = ele.transitionduration =  speed + 'ms';
        ele.webkittransform = 'translate(' + distx + 'px,'+disty+'px)' + 'translatez(0)';
        ele.mstransform = ele.moztransform = ele.otransform = 'translatex(' + distx + 'px) translatey(' + disty + 'px)';
    };
    /**
     * 更改索引值 _index
     */
    var changeindex=function(index,force){
        if (index             index = 0;
        }else if(index >= _length){
            index =_length - 1;
        }
        _index = index;
        translate((-_index*window.innerwidth),0,force? 0 : 200 ,$(.pv-inner)[0]);
        $(#j_index).html(_index+1+/+_length);
        imgload();
    }
    /**
     * 图片获取
     */
    var getimg=function(index) {
        var img = _this.find(li).eq(index || _index).find(img);
        if (img.size() == 1){
            return img[0];
        }else{
            return null
        }
    }
    /**
     * 图片加载
     */
    var imgload=function(){
        if($(.pv-img).eq(_index).find(img)[0]){
            $(#j_loading).css(display,);
            return;
        }else{
            $(#j_loading).css(display,block);
            var tempimg=new image(),w,h,set;
            tempimg.src=_imgdata[_index];
            $(.pv-img).eq(_index)[0].appendchild(tempimg);
            tempimg.onload=function(){
                $(#j_loading).css(display,);
            }
        }
    };
    /**
     * 创建大图查看dome结构
     */
    var create=function(){
        _this.append().append(+(_index+1)+/+_length+
).append()
        for(var i=0;i            $(.pv-inner).append()
        }
        imgload();
    };
    /**
     * 大图查看初始化
     */
    var init=function(){
        !!_this[0]||$(body).append(
);
        _this=$(#slideview);
        ($.os.iphone || $.os.android && parsefloat($.os.version) >= 4)&&(_advancedsupport = true);
    }();
    /**
     * 大图查看返回接口函数
     * imageview(index,data)
     * index 初始索引值 nubmer
     * data 图片数组 array
     */
    var imageview=function(index,data){
        _imgdata=data;
        _index=index;
        _length=data.length;
        //创建dom结构
        create();
        //dom结构显示
        _this.css(display,block);
        //绑定事件
        bind();
    }
    return imageview;
})(window,zepto);
imageview.js用到的css代码如下:
复制代码 代码如下:
/*大图查看*/
.slide-view {background: #000;position: fixed;width: 100%;height: 100%;overflow: hidden;top: 0;left: 0;z-index: 100;opacity:0;display: none;-webkit-animation:fadein .2s linear forwards;animation:fadein .2s linear forwards;-webkit-touch-callout: none;-webkit-transform-style: preserve-3d; }
.slide-view .counts {position: absolute;top: 5%;left: 0;right: 0;text-align: center;font-size: 0;-webkit-transform-style: preserve-3d; }
.slide-view .counts .value {border-radius: 9px;line-height: 18px;padding: 0 6px;font-size: 11px;display: inline-block;background-color: rgba(102,102,102,.6);color: #f1f1f1;}
.pv-inner {position: relative;z-index: -1;display: -webkit-box;display: box;width: 100%;height: 100%;-webkit-transition: all 350ms linear;-webkit-backface-visibility: hidden;transition: all 350ms linear;backface-visibility: hidden;-webkit-touch-callout: none;-webkit-transform-style: preserve-3d; }
.pv-inner li {text-align: center;display: -webkit-box;display: box;-webkit-box-align: center;overflow: hidden;width: 100%;height: 100%;-webkit-touch-callout: none;backface-visibility: hidden;-webkit-transform-style: preserve-3d; }
.pv-inner img {max-width: 97%;max-height: 100%;-webkit-transform: scale(1) translate(0px,0px);transform: scale(1) translate(0px,0px);visibility: visible;-webkit-transition: 200ms;transition: 200ms;-webkit-user-select: none;user-select: none;display: block;margin: 0 auto;backface-visibility: hidden;-webkit-transform-style: preserve-3d; }
@-webkit-keyframes fadein{
    0%{opacity:0;}
    100%{opacity:1;}
}
@keyframes fadein{
    0%{opacity:0;}
    100%{opacity:100%;}
}
/*--------------------loading-----------------------*/
.ui-loading {position: absolute;left: 50%;top: 50%;display: none;vertical-align: middle;font: 0/0 arial;margin: -5px 0 0 -10px;}
.ui-loading i {display: inline-block;width: 5px;height: 12px;background: #fff;vertical-align: top;-webkit-animation: loading-spin 1s infinite linear;animation: loading-spin 1s infinite linear;}
.ui-loading i {-webkit-animation: loading-spin 1s infinite linear;animation: loading-spin 1s infinite linear}
.ui-loading i.t2 {margin: 0 3px;-webkit-animation-name: loading-spin-one;animation-name: loading-spin-one}
.ui-loading i.t3 {-webkit-animation-name: loading-spin-two;animation-name: loading-spin-two}
@-webkit-keyframes loading-spin {
    0% {opacity: 0}
    30% {opacity: 1;-webkit-transform: scale(1,1.2)}
    60% {opacity: 0;-webkit-transform: scale(1)}
    100% {opacity: 0}
}
@-webkit-keyframes loading-spin-one {
    0% {opacity: 0}
    20% {opacity: 0}
    50% {opacity: 1;-webkit-transform: scale(1,1.2)}
    80% {opacity: 0;-webkit-transform: scale(1)}
    100% {opacity: 0}
}
@-webkit-keyframes loading-spin-two {
    0% {opacity: 0}
    40% {opacity: 0}
    70% {opacity: 1;-webkit-transform: scale(1,1.2)}
    100% {opacity: 0;-webkit-transform: scale(1)}
}
@keyframes loading-spin {
    0% {opacity: 0}
    30% {opacity: 1;transform: scale(1,1.2)}
    60% {opacity: 0;transform: scale(1)}
    100% {opacity: 0}
}
@keyframes loading-spin-one {
    0% {opacity: 0}
    20% {opacity: 0}
    50% {opacity: 1;transform: scale(1,1.2)}
    80% {opacity: 0;transform: scale(1)}
    100% {opacity: 0}
}
@keyframes loading-spin-two {
    0% {opacity: 0}
    40% {opacity: 0}
    70% {opacity: 1;transform: scale(1,1.2)}
    100% {opacity: 0;transform: scale(1)}
}
/*--------------------loading-end----------------------*/
ps:代码功能比较简单,可能会存在诸多问题。但也能勉强使用了
下用是使用imageview.js的一个例子:
复制代码 代码如下:
移动端大图查看
以上就是本文的全部内容了,希望大家能够喜欢
其它类似信息

推荐信息