+ -
当前位置:首页 → 问答吧 → 【原创-超实用方便的jQuery弹出层插件】

【原创-超实用方便的jQuery弹出层插件】

时间:2010-08-15

来源:互联网



我们在前端开发,经常要用到弹出层的效果,以前很早前就想将这个功能整理成一个公共的接口来实现了;自写的第一个jQuery插件“类似QQ空间相片查看jQuery插件http://bbs.phpchina.com/thread-191427-1-1.html”被版主收录后,给了我信心,所以利用今天休息天再来写我的这个第二个jQuery插件,一来是自己以后随时可以使用,二来是当做代码的收集与整理;该插件在开发中参考了网友的一些资料,如兼容XHTML和HTML和算法等,还引用了我同事所整理的代码,在些发表感谢!
该插件特性功能:
1:弹出显示时带遮罩效果,并可定义遮罩的颜色
2:可自定义是否带动画显示效果.
3:支持托动效果.
4:支持绑定方式关闭层或显示调用方式关闭层
5:兼容 HTML文档和 XHTML文档
6:对窗口大小或滚动条自适应。
  1. /*
  2. 项目:jQuery弹出层插件
  3. 版本:Ver 1.0
  4. 作者:袁维
  5. 感谢:飞舟提供的"层托动效果"代码
  6. 详细效果:http://www.myquickphp.com/archives/163
  7. */
  8. //解决 $ 被其它框架所定义带来的影响
  9. (function($){
  10. $.fn.extend({

  11.         //插件的设置数据
  12.         popSet:{
  13.                 closeId:'',//可以执行关闭当前层的DOM ID,这个值是可选项
  14.                 titleId:'', //层移动的DOM ID,这个值是可选项,
  15.                 backDivColor:'#333',//遮罩层的颜色
  16.                 showAnimate:true, //弹出层显示时是否有动画效果
  17.                 backDivId:'pop__div__id'//遮罩层的ID,一般不在程序中设置
  18.         },

  19.         //显示弹出层
  20.         popShow:function(setObj){

  21.                 /*
  22.                         层的托动效果
  23.                         titleDivid:弹出层中的标题栏ID
  24.                         dragDivid:整个用于托动的层
  25.                 */
  26.                 var divDragGable = function(titleDivid , dragDivid)
  27.                 {
  28.                         document.getElementById(titleDivid).style.cursor = "move";
  29.                         document.getElementById(titleDivid).onmousedown=function(e){
  30.                                 var posX;
  31.                                 var posY;  
  32.                                 var fdiv = document.getElementById(dragDivid);
  33.                                 if(!e) e = window.event;
  34.                                 posX = e.clientX - parseInt(fdiv.style.left);
  35.                                 posY = e.clientY - parseInt(fdiv.style.top);
  36.                                 document.onmousemove = function(ev){
  37.                                         if(ev==null) ev = window.event;
  38.                                         fdiv.style.left = (ev.clientX - posX) + "px";
  39.                                         fdiv.style.top = (ev.clientY - posY) + "px";
  40.                                         return false;
  41.                                 }
  42.                                 document.onmouseup = function(){
  43.                                         document.onmousemove = null;
  44.                                 }
  45.                         }
  46.                 }

  47.                 /*
  48.                         调整遮罩层和弹出层的位置
  49.                         jqBackDiv:遮罩层的jQuery对象
  50.                         jqPopDiv:弹出层的jQuery对象
  51.                 */
  52.                 var setDivPox = function(jqBackDiv,jqPopDiv,isScrollEvent)
  53.                 {
  54.                         //自动判断当前是否支持W3C标准的
  55.                         var bodyObj = document.documentElement;
  56.                         //文档没有DOCTYPE声明,是 HTML文档,否则是XHTML文档
  57.                         if(document.compatMode == 'BackCompat'){
  58.                                 bodyObj = document.body;
  59.                         }
  60.                         //--设置遮罩层为满屏
  61.                         jqBackDiv.width(Math.max(bodyObj.scrollWidth, document.documentElement.clientWidth));
  62.                         jqBackDiv.height(Math.max(bodyObj.scrollHeight, document.documentElement.clientHeight));
  63.                         //调整要显示的DIV的位置
  64.                         var dleft = bodyObj.clientWidth/2 - jqPopDiv.width()/2;
  65.                         var dtop = bodyObj.clientHeight/2 - jqPopDiv.height()/2;
  66.                         //如果是Scroll事件
  67.                         if(typeof(isScrollEvent)!= 'undefined' && isScrollEvent){
  68.                                 dleft += bodyObj.scrollLeft;
  69.                                 dtop += bodyObj.scrollTop;
  70.                         }
  71.                         jqPopDiv.css({left:dleft,top:dtop,position:'absolute',zIndex:1001});
  72.                 }

  73.                 //读取用户的设置,注意:这个 this == jQuery 对象
  74.                 if(typeof(setObj.closeId) != 'undefined'){
  75.                         this.popSet.closeId = setObj.closeId;
  76.                 }
  77.                 if(typeof(setObj.titleId) != 'undefined'){
  78.                         this.popSet.titleId = setObj.titleId;
  79.                 }
  80.                 if(typeof(setObj.backDivColor) != 'undefined'){
  81.                         this.popSet.backDivColor = setObj.backDivColor;
  82.                 }
  83.                 if(typeof(setObj.showAnimate) != 'undefined'){
  84.                         this.popSet.showAnimate = setObj.showAnimate;
  85.                 }

  86.                 //弹出一个遮罩层
  87.                 var backDivId = this.popSet.backDivId;
  88.                 //--如果弹出层不存在则添加
  89.                 if($('#'+backDivId).length < 1){
  90.                         //--遮罩层追加到 body  //#333
  91.                         var divStr = '<div id="'+backDivId+'" style="background-color:'+this.popSet.backDivColor+';filter: Alpha(Opacity=40); -moz-opacity:.1; opacity:0.5;  position:absolute; left:0px;top:0px; z-index:1000"></div>';       
  92.                         $(divStr).appendTo('body');
  93.                 }

  94.                 //设置位置
  95.                 setDivPox($('#'+backDivId),this);
  96.                
  97.                 //动画效果显示出来
  98.                 $('#'+backDivId).show();
  99.                 this.popSet.showAnimate ? this.fadeIn("slow") : this.show();

  100.                 //将当前jQuery对象保存,在绑定事件中会用到
  101.                 var jq = this;

  102.                 //绑定关闭事件的DOM
  103.                 var ary = this.popSet.closeId.split(',');
  104.                 for(var i=0; i<ary.length; ++i){
  105.                         $('#'+ary[i]).click(function(){
  106.                                 jq.popHide();
  107.                         });
  108.                         //鼠标显示手型
  109.                         $('#'+ary[i]).css({cursor:'pointer'});
  110.                 }

  111.                 //绑定弹出层的移动效果
  112.                 if(this.popSet.titleId != ''){
  113.                         divDragGable(this.popSet.titleId , this.attr('id'));
  114.                 }

  115.                 //绑定窗口缩放和滚动事件
  116.                 $(window).resize(function(){
  117.                         setDivPox($('#'+backDivId),jq);
  118.                 });
  119.                 $(window).scroll(function(){
  120.                         setDivPox($('#'+backDivId),jq,true);
  121.                 });

  122.         },

  123.         //关闭弹出层
  124.         popHide:function(){
  125.                 //隐藏层
  126.                 this.hide();
  127.                 $('#'+this.popSet.backDivId).hide();
  128.                 //取消绑定的事件
  129.                 $(window).unbind('resize');
  130.                 $(window).unbind('scroll');
  131.         }
  132. });
  133. })(jQuery);
复制代码
  1. 调用例子:
  2. <script type="text/javascript" src="jquery-1.4.2.js"></script>
  3. <script type="text/javascript" src="jquery.popdiv.js"></script>
  4. <script type="text/javascript">
  5.         //弹出层,具体参数设置请看 "插件的设置数据" 部分的说明
  6.         $('#div1').popShow({closeId:'close1,close2',titleId:'title1'});
  7.         //关闭层(显示调用方式,可以通过以上绑定方式的)
  8.         $('#div1').popHide();
  9. </script>
复制代码
详细请看:http://www.myquickphp.com/archives/163
实例效果:http://www.myquickphp.com/code/popdiv
在线下载:http://www.myquickphp.com/code/popdiv/popdiv.zip

作者: bzby555   发布时间: 2010-08-15

效果不错,不过
document.getElementById
这个让我很费解

作者: sheak   发布时间: 2010-08-16

相关阅读 更多

热门下载

更多