Heim  >  Artikel  >  Web-Frontend  >  Natives Javascript realisiert interaktive Effekte für Bild-Popups. Javascript-Fähigkeiten

Natives Javascript realisiert interaktive Effekte für Bild-Popups. Javascript-Fähigkeiten

WBOY
WBOYOriginal
2016-05-16 16:20:581278Durchsuche

【1】Var zum Deklarieren mehrerer Variablen zu verwenden ist viel schneller als die Verwendung von var für jede Variable

Code kopieren Der Code lautet wie folgt:

var sScrollTop = document.body.scrollTop ||. document.documentElement.scrollTop,
sWindow_h = document.documentElement.clientHeight,
t_h = parseInt(this.getCss(this.getId('gy_photoBox_head'),'height')),
Hold_h = sWindow_h - t_h - 20,
width = this.nImgWidth ,
height = this.nImgHeight;

【2】Dom-Ereignisoptimierung: Definieren Sie bei window.onresize einen Timer, setTimeout, der häufige Aufrufe von Ereignissen verhindern kann

Code kopieren Der Code lautet wie folgt:

windowResize:function(){
               var _that = this,
                 _timer = null;
// Funktionsdrosselung
               window.onresize = function(){
                                                                                                     „                   _timer = setTimeout(function(){
If( _that.tools.getId('gy_photoBox')){
                          _that.setBoxCss();
                 }
},100);

                                                                         }


[3] Bildladeverarbeitungsfunktion


Code kopieren Der Code lautet wie folgt:

/*
           @ src [String] Die Adresse des Bildes
​​​​​@success[Function] Rückruffunktion für erfolgreiches Laden des Bildes
​​​​​@ error [Funktion] Rückruffunktion für Bildladefehler
*/
          imgLoading:function(opt){
            var _img = new Image(),
                 _that = this;
​​​​​​​ _img.onload = function(){
                   _that.nImgWidth = this.width;
                   _that.nImgHeight = this.height;
If(typeof opt.success == 'function'){
                                          setTimeout(function(){
                                         opt.success();
                      },300);
                }
            }
                _img.onerror = function(){
If(typeof opt.error){
                        opt.error();
                                                                                             }
    {                 _img.src = opt.src;
}


Quellcode:

Code kopieren Der Code lautet wie folgt:

/*
Autor:laoguoyong
*/
(function(){
/* -----------Einfacher Selektor----------------- --- -
@ Parameter [Zeichenfolge]
​​---------------------------------------
★-Nur die folgenden Optionen werden unterstützt-★
@ Unterstützt Selektoren der ersten Ebene: wie „#id“, „.class“, „p“
@ Unterstützt die Auswahl von Nachkommen, z. B. „.class p“, „body span“
@ Unterstützt die Auswahl von Unterelementen, z. B. „.class>p“, „body>span“
​ ----------------------------------------
@ return [Array]
*/
var selector = function(str){
​​​​ //Elementarray definieren
var elem = [];
              /* Private Methode
​​​​------------------------*/
//Das Element mit der ID
zurückgeben          Funktion _getId(id){
               return document.getElementById(id);
}
//Elemente mit solchen Namen zurückgeben - Elemente
         Funktion _getByClassName(className,parent){
            var class_array = [],
Node = parent != undefiniert&&parent.nodeType==1?parent.getElementsByTagName('*'):document.getElementsByTagName('*'),
                 reg = new RegExp("(^|\s)" className "(\s|$)");
for(var n=0,i=node.length;n If(reg.test(node[n].className)){
                        class_array.push(node[n]);
                }
            }
                return class_array;
}
//Auswahl der ersten Ebene, z. B. '#id','p','.class'
              // [Array] zurückgeben
         Funktion _getDom(s){
            var array_elem = [];
If (s.indexOf('#')==0){
                   array_elem.push(_getId(s.slice(1)));
            }
                 else if(s.indexOf('.')==0){
                  array_elem = array_elem.concat(_getByClassName(s.slice(1)));
            }
            sonst{
              var tag = document.getElementsByTagName(s);
for(var n=0,i=tag.length;n                         array_elem.push(tag[n]);
                }
            }
               return array_elem;
}
          /*
​​​​​ @arry_elm [Array]: Elementarray, z. B. ['.demo', 'p'], das p-Element unter .demo wird ausgewählt. Informationen dazu, ob Nachkommen oder Nachkommen ausgewählt werden sollen, finden Sie im zweiten Parameter Erklärung
​​​​​@ r [String] – Optional (wenn nicht übergeben, werden standardmäßig Nachkommen ausgewählt): '>', wählt Nachkommenelemente aus;        -----------
        @ return [Array]
        */
        Funktion _query(array_elem,r){
            var node = array_elem,
                type_name = node[0].match(/#/)?'id_' node[0].slice(1):node[0].match(/./)?'className_' node[0].slice(1 ):'tagName_' node[0],
                child = _getDom(node[1]),
                type = type_name.split('_'),
                len = document.getElementsByTagName('*').length,
                reg = new RegExp("(^|\s)" type[1] "(\s|$)");;
            for(var i=0,j=child.length;i                 var par = child[i].parentNode;
                for(var n=0;n                     if(par.nodeType == 9){
                        Pause;
                    }
                    if(reg.test(par[type[0]])){
                        elem.push(child[i]);
                        brechen;                   
                    }else{
                        if(r == '>') break;
                        par = par.parentNode;
                    }       
                }
            }
        }
        /* 接口
        ---------*/
        var elemStr = str.replace(/(^s )|(s $)/,'');
        if(document.querySelectorAll){
            var dom = document.querySelectorAll(elemStr);
            for(var n=0,len=dom.length;n                 elem.push(dom[n]);
            }
        }else{
            var    split = /[>s]/g.exec(elemStr);
            if(split){
                var node = elemStr.split(split[0]);
                _query(node,split[0]);
            }else{
                elem = elem.concat( _getDom(elemStr) );
            }
}
         return elem;
}
/* Popup-Fenster-Funktionskonstruktor
​ ---------*/
Funktion LGY_photoBox(option){
This.opt = option;
This.oTarget = typeof option.target == 'object'?option.target:selector(option.target);
If(!this.oTarget) return;
This.nLen = this.oTarget.length; //Gesamtzahl
This.aBigimg_src = []; //Großes Bilddatenarray
This.aTitle = []; //Titeldatenarray
This.nIndex = 0; //Index
This.nImgWidth = 0; //Ermitteln Sie dynamisch die Breite des Bildes
This.nImgHeight = 0; //Ermitteln Sie dynamisch die Höhe des Bildes
This.nDelay = 0,2;
This.intit();
}
LGY_photoBox.prototype = {
         intit:function(){
               var _that = this;
This.getData();
for(var n=0;n This.oTarget[n].index = n;
This.oTarget[n].onclick = function(e){
                       _that.createCover();
                var e = _that.tools.getEvent(e),
Target = _that.tools.getTarget(e);
                                                                                                                                                                                   _that.tools.setCss(document.documentElement,{'height':'100%','overflow-y':'hidden','overflow-x':'hidden'});
// Den aktuellen Index abrufen
                       _that.nIndex = this.index;
//Erstes Urteil
                      _that.firstLoad(_that.aBigimg_src[_that.nIndex], function(){
//Struktur einfügen
                           _that.createBoxDom();
                                                                                                                                                           That.tools.getId('gy_photoBox_close').onclick = function(){
                     _that.removeBox();                                                                                                                                           } // Bestimmen Sie, ob auf den linken und rechten Tasten
angezeigt wird _that.btnIsShow();
// 上一张
_that.btnPrev();
// 下一张
_that.btnNext();
// 加载图片
_that.imgChange(_that.aBigimg_src[_that.nIndex]);
});
// 重置窗口大小
_that.windowResize();
// 键盘事件
_that.keyEvent();
//阻止跳转
return false;
}
}
},
createBoxDom:function(){
var doc = document,
exHtml = '',
boxHtml = doc.createElement('div');
boxHtml.id = 'gy_photoBox';
doc.body.appendChild(boxHtml);
if(typeof this.opt.appendHTML == 'string'){
exHtml = this.opt.appendHTML;
}
boxHtml.innerHTML = '
'+
                            '
'+
                            ''+
                            '
'+exHtml+'
'+
                            '
'+
                                'http://www.pconline.com.cn/blank.gif" />'+
                                ''+
                                '
'+
                                    ''+
                                        ''+
                                        '/'+this.nLen+
                                    '
'+
                                    '

'+
                                '
'+
                            '
';
        },
        createCover:function(){
            // 创建覆盖层
            var    doc = Dokument,
                coverHtml = doc.createElement('div');
                coverHtml.id = 'gy_photoBox_cover';
            doc.body.appendChild(coverHtml);
            //设置覆盖层的样式
            this.tools.setCss(this.tools.getId('gy_photoBox_cover'),{'height':(doc.body.scrollTop || doc.documentElement.scrollTop) (doc.documentElement.clientHeight) 'px'});
        },
        setBoxCss:function(){
            var    doc = Dokument,
                nScrollTop = doc.body.scrollTop || doc.documentElement.scrollTop,
                nWindow_h = doc.documentElement.clientHeight,
                eBox_head_h = this.tools.getId('gy_photoBox_head').clientHeight,
                eBox = this.tools.getId('gy_photoBox'),
                eBoxPadding = 10,
                hold_h = nWindow_h - eBoxPadding - 50 - eBox_head_h,
                width = this.nImgWidth ,
                height = this.nImgHeight;
            // alarm('nWindow_h:' nWindow_h '-' 'eBoxPadding:' eBoxPadding '-' 'eBox_head_h:' eBox_head_h);
            // 图片大小超过可见范围,进行缩放
            if(this.nImgHeight>hold_h){
                height = hold_h,
                width = Math.ceil(this.nImgWidth*(height/this.nImgHeight));
            }
            //设置盒子在整个页面居中
            this.tools.setCss(eBox,{'width':width 'px',
                                    'height':eBox_head_h height 'px',
                                    'margin-left':-(width eBoxPadding)/2 'px',
                                    'top':nScrollTop (nWindow_h-height-eBoxPadding)/2 'px'});
            this.tools.setCss(this.tools.getId('gy_photoBox_main'),{'width':width 'px','height':height 'px'});
            //设置覆盖层的样式
            this.tools.setCss(this.tools.getId('gy_photoBox_cover'),{'height':nScrollTop doc.documentElement.clientHeight 'px'});
        },
        removeBox:function(){
            var doc = document;
            if(this.tools.getId('gy_photoBox')){
                doc.body.removeChild(this.tools.getId('gy_photoBox'));
            }
            if(this.tools.getId('gy_photoBox_cover')){
                document.body.removeChild(this.tools.getId('gy_photoBox_cover'));
            }
            this.tools.setCss(document.documentElement,{'height':'auto','overflow-y':'auto','_overflow-y':'scroll','overflow-x':'auto'}) ;
        },
        getData:function(){
            for(var n=0;n                 var src = this.oTarget[n].getAttribute('href'),
                    title = this.oTarget[n].getAttribute('title');
                this.aBigimg_src.push(src);
                if(!title) title = '';
                this.aTitle.push(title);
            }
        },
        btnIsShow:function(){
            this.tools.setCss(this.tools.getId('gy_photoBox_prev'),{'display':'block'});
            this.tools.setCss(this.tools.getId('gy_photoBox_next'),{'display':'block'});
            if(this.nIndex == 0) this.tools.setCss(this.tools.getId('gy_photoBox_prev'),{'display':'none'});
            if(this.nIndex == (this.nLen-1)) this.tools.setCss(this.tools.getId('gy_photoBox_next'),{'display':'none'});
        },
        imgChange:function(){
            var _that = das,
                _src = this.aBigimg_src[this.nIndex],
                eLoadingTips = this.tools.getId('gy_photoBox_img_loading'),
                eImg = this.tools.getId('gy_photoBox_img'),
                eTitle = this.tools.getId('gy_photoBox_title'),
                eInfor = this.tools.getId('gy_photoBox_infor');
            // 显示loading图片
            this.tools.setCss(eLoadingTips,{'display':'block'});
            this.tools.setCss(eInfor,{'display':'none'});
            // 判断左右按钮显示
            this.btnIsShow();
            // 图片加载处理
            this.imgLoading({
                'src':_src,
                'success':function(){
                    _that.tools.setCss(eLoadingTips,{'display':'none'});
                    _that.tools.setCss(eInfor,{'display':'block'});
                    // 设置真实图片路径,标题,当前页码
                       eImg.src = _src;
eTitle.innerHTML = _that.aTitle[_that.nIndex];
                       _that.tools.getId('gy_photoBox_index').innerHTML = (_that.nIndex 1);
                                                                                                                                                                                                        _that.setBoxCss();
// Popup-Fenster erscheint
                   _that.tools.setCss(_that.tools.getId('gy_photoBox'),{'visibility':'visible'});
If(_that.tools.getId('gy_photoBox_firstLoad')){
document.body.removeChild(_that.tools.getId('gy_photoBox_firstLoad'));
                 }
// Callback-Funktion wird bei jedem Wechsel
ausgeführt If(typeof _that.opt.onChange == 'function'){
                     _that.opt.onChange({'src':_src,'index':_that.nIndex,'title':_that.aTitle[_that.nIndex]});
                                                                                                                                                                                     },
                 'error':function(){
                                          setTimeout(function(){
                        _that.tools.setCss(eLoadingTips,{'display':'none'});
                     },200);
                      eImg.src = 'gyPhotoBox/error.png';
eTitle.innerHTML = 'Keine verwandten Bilder';
                        _that.nImgWidth = 400;
                        _that.nImgHeight = 300;
                       _that.setBoxCss();
                   _that.tools.setCss(_that.tools.getId('gy_photoBox'),{'visibility':'visible'});
If(_that.tools.getId('gy_photoBox_firstLoad')){
document.body.removeChild(_that.tools.getId('gy_photoBox_firstLoad'));
                 }
                }
            });
},
          btnPrev:function(){
               var _that = this;
This.tools.getId('gy_photoBox_prev').onclick = function(){
                _that.nIndex--;
                _that.imgChange();
            }
        },
        btnNext:function(){
            var _that = this;
            this.tools.getId('gy_photoBox_next').onclick = function(){
                _that.nIndex ;
                _that.imgChange();
            }
        },
        keyEvent:function(){
            var _that = this;
            document.onkeydown = function(e){
                var e = e || window.event;
                switch(e.keyCode){
                    Fall 37:{
                        if(_that.nIndex != 0&&_that.tools.getId('gy_photoBox_prev')){
                            _that.nIndex--;
                            _that.imgChange();   
                        }   
                    };pause;
                    Fall 39 :{
                        if(_that.nIndex != (_that.nLen-1)&&_that.tools.getId('gy_photoBox_next')){
                            _that.nIndex ;
                            _that.imgChange();   
                        }           
                    };pause;
                    Fall 27:{
                        _that.removeBox();                           
                    };pause;
                }
            }
        },
        /*
        @ src [String] 图片的地址
        @ success [Funktion] 图片加载成功的回调函数
        @ error [Funktion] 图片加载失败的回调函数
        */
        imgLoading:function(opt){
            var _img = new Image(),
                _das = das;
            _img.onload = function(){
                _that.nImgWidth = this.width;
                _that.nImgHeight = this.height;
                if(typeof opt.success == 'function'){
                    setTimeout(function(){
                        opt.success();
                    },300);
                }
            }
            _img.onerror = function(){
                if(typeof opt.error){
                    opt.error();
                }           
            }
            // 注意:要放在onload事件下面,否则ie会出现BUG
            _img.src = opt.src;
        },
        firstLoad:function(src,callback){
            var _that = das,
                html = document.createElement('div');
                html.id = 'gy_photoBox_firstLoad';
            document.body.appendChild(html);
            this.tools.setCss(this.tools.getId('gy_photoBox_firstLoad'),{'top':(document.body.scrollTop || document.documentElement.scrollTop) (document.documentElement.clientHeight/2) 'px'}) ;
            if(typeof callback == 'function') {
                callback();
            }
        },
        windowResize:function(){
            var _that = das,
                _timer = null;
            // 函数节流
            window.onresize = function(){
                clearTimeout(_timer);
                _timer = setTimeout(function(){
                    if( _that.tools.getId('gy_photoBox')){
                        _that.setBoxCss();
                    }
                },100);
            }       
        },
        tools:function(){
            zurück{
                getEvent:function(e){
                    Rückkehr e || window.event;
                },
                getTarget:function(e){
                    e.target zurückgeben || e.srcElement;
                },
                präventDefault:function(e){
                    e.preventDefault?e.preventDefault():e.returnValue = false;
                },
                getId:function(id){
                    return document.getElementById(id);
                },
                getCss:function(node,value){
                    return node.currentStyle?node.currentStyle[value]:getComputedStyle(node,null)[value];
                },
                setCss:function(node,val){
                    for(var v in val){
                        node.style.cssText = ';' v ':' val[v];
                    }
                }
            }
        }()
    }
    window.LGY_photoBox = LGY_photoBox;
})();

最终效果图:

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn