JS简易弹出层

一个简易的弹出框,内容层自定义.为了简单灵活的在小项目中使用.

目标要求

模仿bootstrap的弹出层实现

如何实现

bootstrap弹出框的效果.经过研究后.思路如下

  1. 将要弹出的DIV要置于body直属.不必有遮罩DIV.它在运行时由JS生成.关闭时再删掉
  2. 弹出层DIV和遮罩层使用绝对定位并且长宽一样,在弹出前,将BODY设为无滚动条,以消除网页有滚动条时的盖不住问题
  3. 弹出层DIV.长宽与页面窗口一样,背景透明.可以单击(单击背景关闭弹出层功能),可以垂直滚动.
  4. 弹出层第二级为弹出内容父层DIV.长宽,位置与内容自定义.

建议的弹出层的HTML结构 仿bootstrap

<div id=xxx class="msgboxbg">  // 弹出框的最外层必要 msgboxbg类名必要

 <div class="msgbox">   // 内容层父级(建议)

   <div class="msgboxheader"></div> // 内容层HEAD区(建议)

   <div class="msgboxbody"></div> // 内容层BODY区(建议)

   <div class="msgboxfooter"></div> // 内容层FOOTER区(建议)

 </div>

</div>

目前能实现的效果和功能

模仿BT的弹出框,弹出窗口可以滚动,但背景不会动.

点击内容层外的区域可以关闭弹出层,按ESC也可以关闭弹出层

可以绑定事件确定 取消,按钮DOM上要设置role=约定好的按钮名字

可以绑定一个关闭窗口后的事件

使用步骤注意事项

  1. 建一个要弹出的DIV层,放在BODY下.最外层加上类名msgboxbg,加上一个id
  2. 调用msgBox.show(domid,cfg)
  3. msgboxshadow是遮罩层的样式名,是必要的.msgboxbg是弹出层最外层的样式名,是必要的
  4. 内容层位于弹出框的最外层下级,自定义弹出框的大小与位置.(可以使用设定好的msgboxcontent样式).这个不是必要的,如果没有这一层,内容就会显示在左上角.

实验测试

弹出一个空框 弹出绑定了确定按钮的框 弹出一个建议标准的框 弹出加载IFRAME的框

/*弹出时给body加上这个,关闭时去掉*/
.overhide {
    overflow: hidden;
}
/*关键样式 遮罩层的*/
.msgboxshadow {
    position: fixed; /*固定定位*/
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    opacity: .5; /*背景透明度.这里没有兼容样式*/
    background-color: #000; /*背景色*/
    z-index: 10000; /*层级数仅小于内容弹出框*/
}
/*关键样式 弹出框最外层*/
.msgboxbg {
    display: none;
    position: fixed; /*固定定位*/
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    overflow-x: hidden;
    overflow-y: auto;
    z-index: 10001; /*比遮罩层大1,要显示在遮罩层上面*/
}
/*内容层默认样式*/
.msgboxcontent {
    position: relative;
    border-radius: 5px;
    background-color: #fff;
    box-shadow: 2px 2px 40px #000000;
    margin: 30px auto 0 auto;
    width:250px;
    height:150px;
    overflow:auto;
    text-indent:10px;
    padding-top:5px;
}

关键样式

/*--msgbox函数对象,相当于弄了一个类,方法都在这个函数(类)上,是"静态"的--*/
function msgBox()
{
}
/*****************************************/
/*******************  PROPERTY     ******/
/****************************************/
// public 按ESC关闭? 否置false(bool)
msgBox.ESCclose = true;
// public 点击背景关闭?(bool)
msgBox.Bgclose = true;
// public 弹出层关闭之后事执行
msgBox.closedEvent = null;
// public 确定按钮 [role = btnok]
msgBox.okEvent = null;
// public 取消(关闭)按钮 [role = btncancel]
msgBox.cancelEvent = null;

// 当前弹出层元素的ID(string)
msgBox.CurrentDomId = null;
// 当前弹出层元素的JQERY对象
msgBox.CurrentDomJqObj = null;
/******************************************/
/******************* FUNCTION     *******/
/*****************************************/
// 显示弹出层(主要方法) domid=弹出层DOM的id , cfg=配置JSON
msgBox.show = function (domid, cfg)
{
    // 当前要弹出的层的ID(这两个属性要最后才重置)
    msgBox.CurrentDomId = domid;
    msgBox.CurrentDomJqObj = $(‘#‘ + domid);
    // 将配置设置到属性
    msgBox.config(cfg);
    // window的宽度与高度
    //var windowWidth = window.innerWidth;
    //var windowHeight = window.innerHeight;
    // 文档宽度与高度
    //var scrollTop = $(document).scrollTop();
    //var scrollLeft = $(document).scrollLeft();
    // 先将body的滚动条设无,这样遮罩范围就限于当前窗口大小.遮罩和弹出层还须是固定定位
    $(‘body‘).addClass(‘overhide‘);
    // 加入遮罩层
    $(‘body .msgboxshadow‘).remove();
    $(‘body‘).append(‘<div class="msgboxshadow"></div>‘);
    // 要获得焦点,需要设定这个属性tabindex
    msgBox.CurrentDomJqObj.attr(‘tabindex‘, -1);
    // 显示内容层
    msgBox.CurrentDomJqObj.show().focus();
}
// 用于配置属性的方法,参数是JSON对象 传入 def 则恢复到默认配置
msgBox.config = function (cfg)
{
    msgBox.reset();
    if (cfg) {
        // 属性设定
        for (var n in cfg) {
            if (msgBox[n] !== undefined)
                msgBox[n] = cfg[n];
        }
    }
    // 事件绑定
    msgBox.bindEvent();
}
// 将属性重置,将事件清空.但不清除当前弹出层JQ对象 不应在外部调用此法 关闭时会调用此方法
msgBox.reset = function ()
{
    msgBox.ESCclose = true; // 按ESC关闭
    msgBox.Bgclose = true; // 点击背景关闭
    msgBox.closedEvent = null; // 窗口关闭后执行
    msgBox.okEvent = null;   // 确定按钮 [role = btnok]
    msgBox.cancelEvent = null;// 取消(关闭)按钮 [role = btncancel]
    // event
    msgBox.CurrentDomJqObj.off(‘keyup click‘);
    msgBox.CurrentDomJqObj.find("[role = btnok]").off(‘click‘);
    msgBox.CurrentDomJqObj.find("[role = btncancel]").off(‘click‘);
}
// 该方法用于绑定事件:有默认事件如: 按ESC关闭,点击背景关闭.也有指定的事件,如确定 取消
// 不应在外部调用此方法,所有属性和事件应在CFG方法中传入,CFG会调用此方法
msgBox.bindEvent = function ()
{
    // 默认事件绑定 按ESC关闭,点击关闭
    if (msgBox.ESCclose === true) {
        msgBox.CurrentDomJqObj.on("keyup", function (event)
        {
            // 只在这个元素上触发
            if (event.target.id === msgBox.CurrentDomId) {
                var keycode = event.which;
                if (keycode === 27)
                    msgBox.close();
            }
        })
    }
    // 默认事件绑定 点击背景关闭
    if (msgBox.Bgclose === true)
        msgBox.CurrentDomJqObj.on(‘click‘, function (event)
        {
            if (event.target.id === msgBox.CurrentDomId) {
                msgBox.close();
            }
        });
    // 事件 但role约定为btnok(确定) btncancel(取消)
    if (typeof msgBox.okEvent === ‘function‘)
        msgBox.CurrentDomJqObj.find("[role = btnok]").on("click", function ()
        {
            msgBox.okEvent();
        })
    if (typeof msgBox.cancelEvent === ‘function‘)
        msgBox.CurrentDomJqObj.find("[role = btncancel]").on("click", function ()
        {
            msgBox.cancelEvent(); msgBox.close();
        })
}
// 关闭对话框
msgBox.close = function ()
{
    // 还原文档的滚动条,清除遮罩层
    $(‘body‘).removeClass(‘overhide‘);
    $(‘body .msgboxshadow‘).remove();
    // 隐藏弹出层
    msgBox.CurrentDomJqObj.hide();
    // 执行关闭后事件
    if (typeof msgBox.closedEvent === ‘function‘)
        msgBox.closedEvent();
    // 重置弹出层
    msgBox.reset();
    // 当前弹出层ID和jquery引用销毁
    msgBox.CurrentDomId = null;
    msgBox.CurrentDomJqObj = null;
}

弹出层类

弹出一个空框

有确定按钮,按钮绑定了事件,确定后,弹出此框的按钮变红

确定

标准弹出框 HEADER区域

这个是仿制的BOOTSTRAP的弹出框

按ESC可关闭

点击背景也可以关闭

标准弹出框FOOTER区域

时间: 2024-10-13 22:23:55

JS简易弹出层的相关文章

JS简易弹出层手机版

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

奉献一个实用的JS动画弹出层效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>动画弹出层</title><s

JS实现弹出层效果

很多时候我们想去某某网站干点什么的时候,就会让我们先注册登录后才可以访问内容,而现在很多网站注册登录的时候都会有一种遮罩层的效果,就是背景是带有透明度的黑色遮罩,盖满整个网站,然后登录框弹出固定在屏幕的居中位置.那么,今天就练练这个实用而简单的效果吧.PS:这个是我学习后练习的demo! 首先,需要有一个按钮来模拟登录: <button id="btnLogin"class="login-btn">登录</button> 然后呢,我们想通过点

很实用的baguetteBox.js 图片弹出层

lightbox JS插件--baguetteBox.js,它是用纯Javascript创建的图像展示效果,拥有图像放大缩小并带有相应的CSS3过度,并能在触摸屏等设备上完美展示. baguetteBox.js 优势javascript完成,不需要jQuery库支持支持触屏手机端支持显示标题和说明等支持响应式效果支持CSS3过渡效果使用 SVG 按钮,没有多余的文件下载启用 gzip 压缩后仅 2KB 在线实例 默认 淡入淡出 响应式图片 使用方法 <div class="header l

关于移动端js弹出层滚动的时候 body层不可滚动的解决办法

最近在做移动端网站,在点击导航栏,弹出导航列表时,出现了问题.下滑列表时底层body也跟着滚动,连查带想的折腾了两天才解决这个问题.下面主要分享一下解决办法以及关键代码. 一.有的网友建议弹出层弹出时给 html 和 body 都加上"height:100%:overflow:hidden:",然而在手机上并没有什么卵用 二.结合弹出层加上"overflow-y:auto"依然不起作用 .... 后来经过网友的帮助,结合我的代码终于找到了解决的办法 我的项目是用vu

JS通过设置cookie来控制弹出层,首次打开页面显示弹出层

<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.jb51.net/" /> <title>JS通过设置cookie来控制弹出层,首次打开页面显示弹出层,刷新页面不再显示:关闭浏览器重新打开.清除缓存cookie显示.</title&

js制作带有遮罩弹出层实现登录小窗口

要实现的效果如下 点击“登录”按钮后,弹出登录小窗口,并且有遮罩层(这个名词还是百度知道的,以前只知道效果,却不知道名字) 在没有点击“登录”按钮之前登录小窗口不显示,点击“登录”按钮后小窗口显示,并且遮罩层笼罩整个页面,使整个页面的其他元素暂时失去行为. 遮罩层的实现:相对于body绝对定位,宽度和高度都和body相同,并且有一定的透明度,使得下面的元素能够被看到.原先的元素的z-index为0,遮罩层的z-index在弹出登录小窗口和原先元素的之间. 说的不是很清楚,还是看代码吧! <!DO

简易网页弹出层

今天写了一个简易的弹出层,为了以后工作能够重复使用,特地整理了一下. 首先,添加弹出层,赋id为tip_box<div id="tip_box"> <div id="close_box">x</div> <p>弹出层内容</p></div> 在HTML中调用box()函数 <a href="javascript:void(0)" onclick="box()&

div+js 弹出层

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>jQuery弹出层效果</title> <style> .black_overlay{ display: none; position: absolute; top: 0%; left: 0%; width: 100%; height: 100%; background