初探弹出层的实现原理

首先用几句话来描述一下实现过程,好有个思路嘛^^:(1)先创建一个div层将整个屏幕罩住(所谓的遮罩层),可设置该层的属性,例如透明度(2)在遮罩层内创建div来展示内容(这里暂时称为内容展示层),在该层就可以灵活的创建个人需要的HTML组件了。例如你在内容展示层中创建了一个iframe,嘿嘿,你就可以请求指定的URL并将其返回的内容呈现在这个iframe之中。

下面就赶紧来看看如何实现吧

1、先上HTML代码

    <body>
        <div>body content</div>
        <a href="javascript:void(‘打开弹出层‘);" onclick="openDialog();">打开弹出层</a>
    </body>

呵呵

2、上Javascript部分

看上去有点儿长^^

        <script>
            window.myLayers = {};
            myLayer = function(opts){
                //默认参数
                var params = {
                    width: 500,
                    height: 370,
                    title: ‘我的窗口‘,
                    btnWrapH: 37,
                    titleWrapH: 31,
                    opacity: 0,
                    mask: true,
                    okClick: function(){}
                }
                //设置参数
                opts = opts ? opts : {};
                this.mask = (opts.mask == true || opts.mask == false) ? opts.mask : params.mask;
                this.okClick = opts.okClick ? opts.okClick : params.okClick;
                this.url = opts.url ? opts.url : "";
                this.content = opts.content ? opts.content : null;
                this.width = opts.width ? opts.width : params.width;
                this.height = opts.height ? opts.height : params.height;
                this.title = opts.title ? opts.title : params.title;
                this.btnWrapH = opts.btnWrapH ? opts.btnWrapH : params.btnWrapH;
                this.titleWrapH = opts.titleWrapH ? opts.titleWrapH : params.titleWrapH;
                this.opacity = opts.opacity ? opts.opacity : params.opacity;
                this.id = opts.id ? opts.id : parseInt(Math.random()*10000); //设置ID

                var _top = window;
                while(_top && (_top.parent != _top.self) && _top.parent.frames.length == 0){
                    _top = _top.parent;
                }

                this.left =_top.document.documentElement.clientWidth && _top.document.body.clientWidth/2 - this.width/2;
                this.top = _top.document.documentElement.clientHeight && _top.document.body.clientHeight/2 - this.height/2;

                this.left = this.left < 0 ? 0 : this.left;
                this.top = this.top < 0 ? 0 : this.top;
                //保存,便于在方法之间引用
                myLayers[this.id] = this;
            };
            //核心方法
            myLayer.prototype.open = function(){
                //定义遮罩层
                var _maskDiv = "<div id=‘_maskDiv_"+this.id+"‘ style=‘position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: #ccc; margin: 0; opacity: "+this.opacity+"; filter: alpha(opacity="+(this.opacity*100)+");‘></div>"
                //按钮
                var _wrapBtn = "<div style=‘height: "+this.btnWrapH+"px; width: 100%; background-color: #20B2AA; position: relative;‘><a href=‘javascript:void(0);‘ onclick=‘myLayers[\""+this.id+"\"].cancelBtnClick(\""+this.id+"\");‘  style=‘float: right; display: inline-block; margin-right:10px; color: green;background-color: white; padding: 1px 10px; height: 27px;  margin-top: "+((this.btnWrapH - 29)/2)+"px; line-height: 27px; text-decoration: none;‘>关闭</a><a href=‘javascript:void(0);‘ onclick=‘myLayers[\""+this.id+"\"].okBtnClick(\""+this.id+"\");‘ style=‘float: right;  display: inline-block; margin-right: 10px; color: green; padding: 1px 10px; margin-top: "+((this.btnWrapH - 29)/2)+"px; height: 27px; line-height: 27px; background-color: white; text-decoration: none;‘>确认</a></div>";
                //iframe
                var _iframe = "<iframe style=‘width: 100%; height: "+(this.height-(this.titleWrapH+10)-this.btnWrapH)+"px; background-color: white; overflow: auto; ‘ src=‘"+this.url+"‘  frameborder=‘0‘></iframe>";
                //content属性优先
                var _content = this.content ? this.content : _iframe;
                //内容展示层
                var _wrapIframe = "<div id=‘_wrapIframe_"+this.id+"‘ style=‘border: 1px solid #E0FFFF; position: absolute; left: "+this.left+"px; top: "+this.top+"px; margin: 0 auto; padding: 0; width: "+this.width+"px; height: "+this.height+"px; background-color: white;‘><h3 style=‘position: relative; margin: 0; padding: 5px 0 5px 10px; height: 31px; line-height: 31px; background-color: #20B2AA; overflow: hidden;‘><a style=‘height: "+this.titleWrapH+"px; line-height: "+this.titleWrapH+"px; float: right; top: 31px; margin-right: 20px; padding: 3px 10px; font-size: 17px;‘ href=‘javascript: void(0);‘ onclick=‘myLayers[\""+this.id+"\"].closeLayer(\""+this.id+"\");‘>关闭</a><span style=‘overflow: hidden;‘>"+this.title+"</span></h3><div style=‘width: 100%; height: "+(this.height-(this.titleWrapH+10)-this.btnWrapH)+"px;‘>"+_content+"</div>"+_wrapBtn+"</div>";

                var body = window.document.body;
                //是否显示遮罩层
                if(this.mask == true){
                    body.innerHTML = body.innerHTML + _maskDiv;
                }

                body.innerHTML = body.innerHTML + _wrapIframe;
            };
            //关闭
            myLayer.prototype.closeLayer = function(layerId){
                var _w = document.getElementById("_wrapIframe_"+layerId);
                _w.parentNode.removeChild(_w);
                var _m = document.getElementById("_maskDiv_"+layerId);
                _m && _m.parentNode.removeChild(_m);
            };
            //事件
            myLayer.prototype.okBtnClick = function(layerId){
                myLayers[layerId].closeLayer(layerId);
                myLayers[layerId].okClick();
            };

            myLayer.prototype.cancelBtnClick = function(layerId){
                myLayers[layerId].closeLayer(layerId);
            };
            //调用打开弹出层
            function openDialog(){
                var opts = {
                    opacity: 0.31,
                    title: ‘我的标题‘,
                    height: 430,
                    width: 560,
                    url: "layer.htm",
                    mask: true,
                    okClick: function(){
                        alert("我被执行了。OK,可以提交表单了。");
                    },
                    content: "<p style=‘color: red;‘><a href=‘javascript:void(\"打开弹出层\");‘ onclick=‘openDialog();‘>打开弹出层</a></p>"

                }
                new myLayer(opts).open();
            }

        </script>

以上就是全部代码

仅仅是初探。

附上执行档地址:http://www.zhaojz.com.cn/demo/layer.htm

时间: 2024-10-03 13:30:09

初探弹出层的实现原理的相关文章

JS简易弹出层手机版

简单说明 手机弹出层模枋了WEIUI.弹出层原理还是依照bootstrap 去掉了PC端的ESC关闭.点击背景层时也不默认关闭. 模板样子 CSS样式 /*弹出时给body加上这个,关闭时去掉*/ .overhide { overflow: hidden; } /*关键样式 遮罩层的*/ .msgboxshadow { position: fixed; /*固定定位*/ left: 0; top: 0; right: 0; bottom: 0; opacity: .5; /*背景透明度.这里没有

JavaScript学习总结(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

JavaScript学习总结(一)--延迟对象.跨域.模板引擎.弹出层.AJAX示例 目录 一.AJAX示例 1.1.优点 1.2.缺点 1.3.jQuery AJAX示例 二.延迟对象(Deferred) 2.1.回调函数 2.2.deferred.done 三.跨域 3.1.什么是跨域 3.2.JSONP跨域 3.3.jQuery使用JSONP跨域 3.4.跨域资源共享(CORS) 3.5.小结 四.弹出层 五.模板引擎 5.1.Hello World 5.2.方法 5.3.与AJAX结合应

【转载】jQuery弹出层始终垂直居中于当前屏幕

一般网站上肯定有一些弹出框,不论弹出框的大小,都需要他在当前窗口垂直居中.之前手上就有一个jQuery的例子,后来才发现,他只能在第一屏垂直居中,如果滑动滚动条,弹出的框就在上方,不是很方便.请教朋友后稍作修改,成了现在的例子. 代码分析 注释已经写得很清楚了,看得懂jQuery的应该都看得懂 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function popup(popupName){     var _scrollHeight = $(docu

javascript实现掉落弹出层------Day29

顾名思义,所谓"掉落弹出层",就是出现一个弹出层,而出现的位置是从上方向下掉落,掉落到指定的位置停止,这样分析起来,和"右下角弹出提醒对话框"比起来,确有异曲同工之妙啊,一个从上向下,一个由下及上. 实现原理: 我们不妨肢解了这个动作来看,可以大概分为这几个部分: 1.弹出弹出层,弹出层位置在屏幕上方不可见: 2.弹出层从上而下的降落: 3.弹出层到达指定位置,停止降落: 如果加上缓冲弹跳效果的话,就是四部分: 4.出现缓冲弹跳效果,直到静止,而弹跳效果简单了说,就

一组li或者div里面多个弹出层对应各自的内容

今天在一个做一个页面开发的时候发现了这个需求,简单的给大家描述一下我的使用环境: 射鸡师要求点击每一个卡片上的查看更多需要弹出各自的内容: 可能有同学会说了,每个卡片下面写一个div当做弹出层就ok了.从效果上说,这样的方法是可以实现的,但是他存在以下的弊端: 1.代码量臃肿 2.工作量成倍增长 3.不方便维护 ... 我的实现原理和方法: 需要弹出的内容,我直接将他们存在json中去,然后点击的那一个“查看更多”遍历对应的json,将内容插入到弹出中即可,这样也只是需要些一个弹出层div!可能

wuzhicms上传弹出层,如何返回数据到当前页面?

我们要实现下面功能: 上传图片后,返回图片列表到页面: 点击开始上传后,自动返回结果到页面. 原理:通过openiframe打开上传弹出层. 其中: returntype 在这里是 2 www/res/js/html5upload/extension.js中的 callback_dianping 函数执行返回结果的处理. 再通过:openiframe函数把返回的结果插入到页面.

遮罩层、弹出层

1.实现原理 * 实际上弹出层.遮罩层和原页面显示分别为三个不同的div * 弹出层的层级在遮罩层之上,遮罩层的层级在原页面显示之上: * 遮罩层有通明效果 * 遮罩层没有实际意义,则无需在html部分就写上,当然写上同样可以实现 2.代码实现 html语言如下: <body>     <center>         <div ><input type="button" value="go" onclick="s

Javascript实现页面弹出层效果

弹出层效果是一个很实用的功能,很多网站都采用了这种方式实现登录和注册,比如百度: 弹出层的特点:点击登录或注册的时候在页面的中间部分弹出一个登录或注册区域并且页面有一个遮罩层,而且登录框在遮罩层之上,也就是登陆框的z-index值要大于遮罩层的z-index值.当点击关闭或者遮罩层时关闭登录或者注册框(有的网页没有实现点击遮罩层关闭登录或注册区域的功能.). 最近也做了一个类似的弹出层的效果,先展示一下最终效果: 简单的说一下实现的过程. 首先是遮罩层.遮罩层是在页面动态加载的过程中创建的,因为

react 点击空白处隐藏弹出层

点击空白处隐藏弹出层的原理是:在 document 上绑定事件来隐藏弹出层,这样点击任何元素的时候都会冒泡到 document 上,都会执行隐藏弹出层的功能.然后我们在不需要隐藏弹出层的元素上阻止冒泡即可. class Select extends Component { constructor(props) { super(props); this.state = { selected: props.list[0], showList: false }; this.showList = thi