// JavaScript Document ;(function($){ /*全局变量*/ var zIndex = 9900, $document = $(document), $window = $(window), ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent); /*插件功能,调用*/ $.extend({ popui:function(options){//弹出层展示 options = options == undefined ? $.popui.defaults : options; var str = $.extend({}, $.popui.defaults, options); str.overlayCss = $.extend({}, $.popui.defaults.overlayCss, options.overlayCss); str.popCss = $.extend({}, $.popui.defaults.popCss, options.popCss); var popLy = $('div.popui_overlay'), popWp = $('div.popui_wrap'), poLength = popLy.length, powlength = popWp.length, elePcStr = str.popupEle,//弹出层ID elePc = $('#'+elePcStr), elePcParent = elePc.parent(), popPos = str.popupPos,//弹出位置 popLay = str.overlay,//是否有遮罩层 autoH = str.autoHide,//自动隐藏 pch = str.popCss.height,//弹出层样式 pcw = str.popCss.width, popr = str.popRoll,//是否可滚动 fow = str.follow,//跟随元素 ete = str.eventEle,//follow,事件元素ID elet = $('#'+ete), popLt = str.popCss.left, popBm = str.popCss.bottom, popRt = str.popCss.right, popTp = str.popCss.top, timeH = isNaN(parseInt(str.timeout)) == true ? 3000 : parseInt(str.timeout),//隐藏时间 aiTime = isNaN(parseInt(str.animateIn)) == true ? 300 : parseInt(str.animateIn),//动画进入时间 oZdx, elePo, elePw; if(powlength != 0){ var ifHave = 0; popWp.each(function(i) { var popWpI = popWp.eq(i), idStr = popWpI.children().attr('id'); if(idStr == elePcStr){ ifHave = 1; var poth = popWpI.attr('popui-wrap-num'); oZdx = parseInt(popWpI.css('z-index')); elePo = $('div.popui_overlay[popui-overlay-num='+poth+']'); elePw = $('div.popui_wrap[popui-wrap-num='+poth+']'); return false; }; }); if(ifHave == 0){ createPop(); }; }else{ createPop(); } function createPop(){ oZdx = poLength == 0 ? zIndex : parseInt(popLy.last().css('z-index'))+2; var poStr = '
', pwStr = ''; $(poStr).appendTo($('body')).hide(); $(pwStr).appendTo($('body')).hide(); $('').appendTo(elePcParent); elePo = $('div.popui_overlay[popui-overlay-num='+poLength+']'); elePw = $('div.popui_wrap[popui-wrap-num='+poLength+']'); } if(popr == true){ popupPostion = 'absolute'; }else if(popr == false){ popupPostion = 'fixed'; }else{ popupPostion = 'fixed'; }; var posin = ie6 == true ? 'absolute' : popupPostion; var winh = parseInt($window.height()), winw = parseInt($window.width()), doth = parseInt($document.height()), dotw = parseInt($document.width()), solt = parseInt($window.scrollTop()); if(elePcStr == 'popupEleId' || elePc.length == 0){//未传入弹出ID提示 strError('请传入需要弹出的元素ID名称,$.popui({popupEle : "popupEleId"})', 500); }else if(fow != true && fow != false){ strError('follow为布尔值,请传入true或者false', 300); }else if(ete != 'eventEleId' && elet.length == 0){ strError('请传入正确的跟随元素,$.popui({eventEle : "eventEleId"})ID,', 450); }else{//已传入弹出ID并弹出 eleBlw = elePc.css('border-left-width') == 'medium' ? 0 : elePc.css('border-left-width'); eleBrw = elePc.css('border-right-width') == 'medium' ? 0 : elePc.css('border-right-width'); eleBtw = elePc.css('border-top-width') == 'medium' ? 0 : elePc.css('border-top-width'); eleBbw = elePc.css('border-bottom-width') == 'medium' ? 0 : elePc.css('border-bottom-width'); if(pch == 'popupWrapHeight'){ pch = parseInt(elePc.height())+parseInt(elePc.css('padding-top'))+parseInt(elePc.css('padding-bottom'))+parseInt(eleBtw)+parseInt(eleBbw); }; if(pcw == 'popupWrapWidth'){ pcw = parseInt(elePc.width())+parseInt(elePc.css('padding-left'))+parseInt(elePc.css('padding-right'))+parseInt(eleBlw)+parseInt(eleBrw); }; elePc.appendTo(elePw); elePc.show(); //具体展现形式 popShowWay(); }; if(popLay == false){//是否展示遮罩层 elePo.css({ height : 0, width : 0 }); }; if(autoH == true){//是否自动隐藏 setTimeout(function() { $.closepop({popupEle : elePcStr}); }, timeH); }; function popShowWay(){//位置窗口center pch = parseInt(pch);//弹出层样式 pcw = parseInt(pcw); pwStyle(elePw, posin, str.popCss.background, pch, pcw, oZdx+1); poStyle(elePo, doth, dotw, str.overlayCss.background, str.overlayCss.opacity, oZdx); if(posin == 'fixed'){//其它浏览器不可滚动 if(popPos == 'topleft'){ posTopleft(); }else if(popPos == 'bottomleft'){ posBottomleft(); }else if(popPos == 'topright'){ posTopright(); }else if(popPos == 'bottomright'){ posBottomright(); }else{ fixedPosCenter(winh, winw, elePw, pch, pcw); }; }else if(popr != true && posin == 'absolute' && ie6 == true){//ie6不可滚动 if(popPos == 'topleft'){ posTopleft(); }else if(popPos == 'bottomleft'){ posBottomleft(); }else if(popPos == 'topright'){ posTopright(); }else{ absolutePosCenter(winh, winw, solt, elePw, pch, pcw); scrollAbsolute(winh, winw, elePw, pch, pcw); }; }else{//可滚动 if(fow == true){//跟随元素 elePw.attr({ 'popui-wrap-follow' : 'true', 'popui-wrap-follow-btn' : ete }); followEle(elet, pcw, elePw); }else{ absolutePosCenter(winh, winw, solt, elePw, pch, pcw); }; }; elePo.fadeIn(aiTime); elePw.fadeIn(aiTime); } function posTopleft(){ elePw.attr('popui-popupPos-topleft', 'true'); elePw.show(); fixedPosTopleft(elePw, pcw, aiTime, popTp, popLt); } function posBottomleft(){ elePw.attr('popui-popupPos-bottomleft', 'true'); elePw.show(); fixedPosBottomleft(elePw, pcw, aiTime, popBm, popLt); } function posTopright(){ elePw.attr('popui-popupPos-topright', 'true'); elePw.show(); fixedPosTopright(elePw, pcw, aiTime, popTp, popRt); } function posBottomright(){ elePw.attr('popui-popupPos-bottomright', 'true'); elePw.show(); fixedPosBottomright(elePw, pcw, aiTime, popBm, popRt); } function strError(str, pcew){//没有传入正确数值 var noEleTipsStr = ''+str+'
'; pch = 80; pcw = pcew; $(noEleTipsStr).appendTo(elePw); //具体展现形式 popShowWay(); setTimeout(function() { elePo.remove(); elePw.remove(); }, timeH); } }, closepop:function(options){//关闭弹出层 options = options == undefined ? $.closepop.defaults : options; var str = $.extend({}, $.closepop.defaults, options), elePcStr = str.popupEle,//弹出层ID elePc = $('#'+elePcStr), elePo = $('div.popui_overlay[popup-overlay-popid='+elePcStr+']'), elePw = $('div.popui_wrap[popup-overlay-popid='+elePcStr+']'), popuiOrigin = $('#popuiOrigin-'+elePcStr); if(elePcStr == 'popupElementId' || elePc.length == 0){ alert('请传入需要关闭的元素ID名称$.closepop({popupEle : "popupElementId"})'); }else{ elePc.insertAfter(popuiOrigin).hide(); popuiOrigin.remove(); elePw.remove(); elePo.remove(); }; } }); $.fn.extend({ showpop:function(options){//事件弹出 var str = $.extend({}, $.fn.showpop.defaults, options); return this.each(function(){ $this = $(this); }); } }); $.popui.defaults = {//默认设置 popupEle : 'popupEleId',//弹出层ID eventEle : 'eventEleId',//跟随元素ID popupPos : 'center', //弹出层位置(topleft, topright, bottomleft, bottomright, center)默认center或其它字符串如popupPos : 'abc'都为center;当popRoll为false时有效 popRoll : true, //是否支持滚动,仅位置在中间 overlay : true, //是否支持遮罩层 autoHide : false, //自动隐藏 follow : false, //是否跟随元素,仅popRoll为true时有效 timeout : 3000, //自动隐藏时间 animateIn : 300, //进入时间 overlayCss : { //遮罩层样式 background : '#000', opacity : 0.4 }, popCss : { //包围弹出层样式 left : '10px', bottom : '10px', right : '10px', top : '10px', background : '#FFF', height : 'popupWrapHeight', width : 'popupWrapWidth' } }; $.fn.showpop.defaults = $.popui.defaults; $.closepop.defaults = { popupEle : 'popupElementId' }; $window.resize(function(){//窗口改变时,计算位置 var winh = parseInt($window.height()), winw = parseInt($window.width()), doth = parseInt($document.height()), dotw = parseInt($document.width()), solt = parseInt($window.scrollTop()), elePo = $('div.popui_overlay'), elePw = $('div.popui_wrap'); elePo.each(function(i) {//遮罩层位置计算 var elePoI = elePo.eq(i), elePoIH = elePoI.height(), elePoIW = elePoI.width(); if(elePoIH != 0 || elePoIW != 0){ elePoI.css({ height : doth, width : dotw }); }; }); elePw.each(function(i){//弹出层位置计算 var elePwI = elePw.eq(i), elePwIH = elePwI.height(), elePwIW = elePwI.width(), elePwIPos = elePwI.css('position'), elePwFw = elePw.attr('popui-wrap-follow'), posLeft = elePw.attr('popui-popuppos-topleft'), posLeftB = elePw.attr('popui-popuppos-bottomleft'), posRight = elePw.attr('popui-popuppos-topright'), posRightB = elePw.attr('popui-popuppos-bottomright'); if(elePwIPos == 'fixed'){ if(posLeft == 'true'){ elePwI.css({ left : '10px', top : '10px' }); }else if(posLeftB == 'true'){ elePwI.css({ left : '10px', bottom : '10px' }); }else if(posRight == 'true'){ elePwI.css({ right : '10px', top : '10px' }); }else if(posRightB == 'true'){ elePwI.css({ right : '10px', bottom : '10px' }); }else{ fixedPosCenter(winh, winw, elePwI, elePwIH, elePwIW); }; }else if(elePwIPos == 'absolute'){ if(elePwFw == 'true'){ var elePwFwBtn = $('#' + elePwI.attr('popui-wrap-follow-btn')); followEle(elePwFwBtn, elePwIW, elePwI); }else{ absolutePosCenter(winh, winw, solt, elePwI, elePwIH, elePwIW); }; }; }); }); /*私有函数,具体方法*/ function followEle(elet, pcw, elePw){ var ww = $(window).width(); ot = parseInt(elet.offset().top), ol = parseInt(elet.offset().left), tw = parseInt(elet.width()), th = parseInt(elet.height()), pt = parseInt(elet.css('padding-top')), pb = parseInt(elet.css('padding-bottom')), pl = parseInt(elet.css('padding-left')), pr = parseInt(elet.css('padding-right')), bt = elet.css('border-top-width') == 'medium' ? 0 : parseInt(elet.css('border-top-width')), bb = elet.css('border-bottom-width') == 'medium' ? 0 : parseInt(elet.css('border-bottom-width')), bl = elet.css('border-left-width') == 'medium' ? 0 : parseInt(elet.css('border-left-width')), br = elet.css('border-right-width') == 'medium' ? 0 : parseInt(elet.css('border-right-width')); allW = bl + pl + tw + pr + br; if(ww - ol - allW >= pcw - allW ){ elePw.css({ left : ol, top : ot + bt + pt + th + pb + bb }); }else{ elePw.css({ left : ol + allW - pcw, top : ot + bt + pt + th + pb + bb }); } } function fixedPosBottomright(elePw, pcw, aiTime, popBm, popRt){ eRight = -pcw; elePw.css({ left : '', top : '', bottom : popBm, right : eRight }); elePw.animate({ right : popRt }, aiTime); } function fixedPosTopright(elePw, pcw, aiTime, popTp, popRt){ eright = -pcw; elePw.css({ bottom : '', left : '', top : popTp, right : eright }); elePw.animate({ right : popRt }, aiTime); } function fixedPosBottomleft(elePw, pcw, aiTime, popBm, popLt){ eLeft = -pcw; elePw.css({ right : '', top : '', bottom : popBm, left : eLeft }); elePw.animate({ left : popLt }, aiTime); } function fixedPosTopleft(elePw, pcw, aiTime, popTp, popLt){ eLeft = -pcw; elePw.css({ bottom : '', right : '', top : popTp, left : eLeft }); elePw.animate({ left : popLt }, aiTime); } function fixedPosCenter(winh, winw, elePw, pch, pcw){//position:fixed位置计算 eLeft = (winw - pcw) / 2; eTop = pch >= winh ? 40 : (winh - pch) / 2; elePw.css({ left : eLeft, top : eTop }); } function scrollAbsolute(winh, winw, elePw, pch, pcw){//不可滚动处理 $window.scroll(function(){ solt = $window.scrollTop(); absolutePosCenter(winh, winw, solt, elePw, pch, pcw); }); } function absolutePosCenter(winh, winw, solt, elePw, pch, pcw){//position:absolute位置计算 eLeft = (winw - pcw) / 2; eTop = pch >= winh ? solt+40 : solt + (winh - pch) / 2; elePw.css({ left : eLeft, top : eTop }); } function poStyle(ele, dh ,dw, bgor, opty , zdx){//遮罩层样式 ele.css({ position : 'absolute', left : 0, top : 0, background : bgor, height : dh, opacity : opty, overflow : 'hidden', width : dw, zIndex : zdx }); } function pwStyle(ele, posn, bgor, puh, puw, zdex){//弹出层,包裹div样式 ele.css({ position : posn, background : bgor, height : puh, width : puw, overflow : 'hidden', zIndex : zdex }); } /*$.popui = function(options){ var str = $.extend({}, $.popui.defaults, options); return this.each(function(){ $this = $(this); }); }; $.fn.popui = function(){}; $.fn.closepop = function(){};*/ })(jQuery);