JS简易弹出层
目标
实现简易的js弹出框.为了简单灵活的在小项目中使用.
实现思路
研究bootstrap的弹出框效果后,认为层级示意图如下:

层说明
弹出层分为三层.最底层的遮罩层,覆盖在浏览器视口上.它之上是弹出层父级,这个层完全透明,并且与遮罩层重合.最上层是弹出层,它的活动范围在其父层的范围内.
- 弹出时,隐藏body的滚动条
- 遮罩层位于body直属,固定定位,大小与视口相等.不必有dom,在每次弹出时,由js直接生成.
- 弹出层父级位于body直属,透明隐藏,大小同遮罩层,自动垂直滚动条.位于遮罩层与弹出层之间.
- 弹出层是一个自定义的DOM,位于最上层.
- 每个弹出层可做一个模板,放在templete标记内.
html结构
建议的弹出层的HTML结构
<div class="msgbox-content">
<div class="msgbox-header"><h3 class="msgbox-title">标题</h3><a class="msgbox-close">×</a></div>
<div class="msgbox-body">弹出框内容</div>
<div class="msgbox-footer"><a class="btn lg">确定</a><a class="btn lg">取消</a></div>
</div>

位置
弹出层父级使用flex布局,可简洁的实现在9种位置上弹出.

实现功能
jq插件方式,模态框和倒计时消失框,9种位置弹出,按esc关闭,点击背景关闭,支持绑定显示前后和关闭后事件,自由定义弹出框
使用方式
// alert框
$.msgboxalert('alert框,默认2秒后关闭.')
// 倒计时间3秒关闭
$.msgboxalert('alert框,默认2秒后关闭.',3000)
// 显示在右下方
$.msgboxalert('alert框,默认2秒后关闭.',3000,'br') // 模态框
let config={
escClose:true
}
$('#msg_box').modal(config);
js
 $.extend({
         // alert框 {msg:要提示的信息,[timeout]:关闭时间(2000毫秒),[location]:位置(tl,tm,tr,ml,mr,bl,bm,br)}
         msgboxalert: function (msg, timeout, location)
         {
             $('body .msgbox-modal').remove();
             // alert组件弹出层Dom
             let dom = '<div class="msgbox-modal $location"><div class="msgbox-alert">$msg</div></div>';
             dom = dom.replace("$msg", msg || '');
             dom = dom.replace("$location", location || '');
             //
             $('body').append(dom);
             // 自动消失
             setTimeout(() =>
             {
                 $('body .msgbox-modal').remove();
             }, timeout || 2000)
         },
         // 清除所有弹出框,还原body滚动条状态 {closeE:fun}
         msgboxClear: function (closeE)
         {
             $('body').find('.msgbox-shadow,.msgbox-modal').remove();
             $('body').removeClass('overflowhide');
             if (typeof closeE == 'function')
             {
                 closeE();
             }
         }
     });
 $.fn.extend({
         // 模态框 {beforeShow:fun,afterShow:fun,afterClose:fun,escClose:false,backClose:false,location:''}
         modal: function (config)
         {
             //=== 弹出层父级类名:为方便引用()
             let modalClsName = 'msgbox-modal';
             //=== init config
             let cfg = {};
             if (config)
             {
                 // 显示之前执行
                 cfg.beforeShow = config.beforeShow || null;
                 // 显示后执行
                 cfg.afterShow = config.afterShow || null;
                 // 关闭后执行
                 cfg.afterClose = config.afterClose || null;
                 // 按esc关闭
                 cfg.escClose = config.escClose || false;
                 // 点击背景(弹出层父级)关闭
                 cfg.backClose = config.backClose || false;
                 // 位置
                 cfg.location = config.location || '';
             }
             //===
             // body禁用滚动条
             // 删除旧的遮罩层
             $('body').addClass('overflowhide').find('.msgbox-shadow,.msgbox-modal').remove();
             //=== 弹出层准备: dom生成,相关事件执行
             // 将弹出层包含在弹出层父级DOM中
             let modal = $('<div class="' + modalClsName + ' ' + cfg.location + '" tabindex="-1"></div>');
             modal.append($(this));
             // x按钮事件:点击关闭弹出框
             modal.find('.msgbox-close').on('click', function ()
             {
                 $.msgboxClear(cfg.afterClose);
             })
             // 按ESC关闭
             if (cfg.escClose == true)
             {
                 modal.on("keyup", function (event)
                 {
                     //alert(event.target.className + event.which );
                     if (event.which != 27 || event.target.className.indexOf(modalClsName)==-1)
                         return;
                     $.msgboxClear(cfg.afterClose);
                 });
             }
             // 点击背景关闭
             if (cfg.backClose == true)
             {
                 modal.on('click', function (event)
                 {
                     if (event.target.className.indexOf(modalClsName) == -1)
                         return;
                     $.msgboxClear(cfg.afterClose);
                 });
             }
             // 显示之前执行
             if (typeof cfg.beforeShow == 'function')
             {
                 cfg.beforeShow($(this));
             }
             // 显示遮罩
             $('body').append('<div class="msgbox-shadow"></div>');
             // 显示弹出框
             $('body').append(modal);
             // 让弹出层父级获得焦点
             modal.focus();
             // 显示之后执行
             if (typeof cfg.afterShow == 'function')
             {
                 cfg.afterShow($(this));
             }
         }
     })
msgbox
css
//=== 关键部分css样式
// 弹出框时,body设为无滚动条
.overflowhide {
overflow: hidden;
}
// 遮罩层/
.msgbox-shadow {
position: fixed;
left:;
top:;
right:;
bottom:;
// 黑色背景,透明度
opacity: .4;
background-color: #000;
// 层级位于弹出层父级之下
z-index:;
}
// 弹出层父级
.msgbox-modal {
// 使用flex布局,默认弹出层水平垂直居中
display: flex;
justify-content: center;
align-items: center;
// 固定定位
position: fixed;
left:;
top:;
right:;
bottom:;
overflow-x: hidden;
overflow-y: auto;
// 在遮罩层之上
z-index:;
}
详细示例代码,修改后的
https://github.com/mirrortom/webcoms/tree/master/msgbox
JS简易弹出层的更多相关文章
- js简单弹出层、遮罩层
		<html> <head> <title>js简单弹出层</title> <style> /*阴影边框效果*/ .box-shadow-1 ... 
- js插件---弹出层sweetalert2(总结)
		js插件---弹出层sweetalert2(总结) 一.总结 一句话总结: sweetalert2的效果非常好,效果比较Q萌,移动端适配也比较好,感觉比layer.js效果好点 1.SweetAler ... 
- js 实现弹出层效果
		代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <tit ... 
- JS实现弹出层对话框
		点击按钮后,弹出层对话框,可交互,点击关闭后才关闭掉对话框. 效果图: 源码: <!doctype html> <html> <head> <meta cha ... 
- JS实现弹出层效果
		很多时候我们想去某某网站干点什么的时候,就会让我们先注册登录后才可以访问内容,而现在很多网站注册登录的时候都会有一种遮罩层的效果,就是背景是带有透明度的黑色遮罩,盖满整个网站,然后登录框弹出固定在屏幕 ... 
- 很实用的baguetteBox.js 图片弹出层
		lightbox JS插件--baguetteBox.js,它是用纯Javascript创建的图像展示效果,拥有图像放大缩小并带有相应的CSS3过度,并能在触摸屏等设备上完美展示. baguetteB ... 
- div滚动条弹出层效果 (所需要的css文件和js文件,都已经上传到文件里面了progressbar.rar)
		<%--总的弹出层--%> <div class="tcck" id="joinclub" style="display:none& ... 
- JS来添加弹出层,并且完成锁屏
		上图 <html> <head> <title>弹出层</title> <style type="text/css"> ... 
- js制作带有遮罩弹出层实现登录小窗口
		要实现的效果如下 点击“登录”按钮后,弹出登录小窗口,并且有遮罩层(这个名词还是百度知道的,以前只知道效果,却不知道名字) 在没有点击“登录”按钮之前登录小窗口不显示,点击“登录”按钮后小窗口显示,并 ... 
随机推荐
- 软件工程(FZU2015) 助教总结
			SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 本次构建之法-SE助教工作,和福州大学张老师协作,福大学生基本发挥出了一定水平,在此做个小结. 教师 张老师本身的SE教学 ... 
- js数据放入缓存,需要再调用
			再贴代码之前先描述下,这个技术应用的场景:一个页面的http请求次数能少点就少,这样大大提高用户体验.所以再一个页面发起一个请求,把所有数据都拿到后储存在缓存里面,你想用的时候再调用出来,这个是非常好 ... 
- 【知乎】WinForm 与 WPF的区别
			你想上班 那么针对公司需求学如果只是自己写着玩 那么区分一下1.你的程序运行在 自己机器a.一个工具而已 要的是cooooooool 那么WPFb.一个工具而已 要的是useful easy 那么wi ... 
- Docker 给 故障停掉的 container 增加 restart 参数
			操作过程见图: 执行的命令比较简单: docker container update --restart=always containername 即可. 
- [转帖]再次提醒Google Chrome用户应尽快升级浏览器到72.0.3626.121
			再次提醒Google Chrome用户应尽快升级浏览器到72.0.3626.121 转帖地址: https://www.cnbeta.com/articles/tech/825591.htm 国内离线 ... 
- mybatis事务管理机制详解
			1.mybatis事务的配置和使用 mybatis事务有两种使用方式: (a):使用JDBC的事务管理机制:即使用java.Sql.Connection对象完成对事务的提交,回滚和关闭操作. (b): ... 
- 缓存session,cookie,sessionStorage,localStorage的区别
			https://www.cnblogs.com/cencenyue/p/7604651.html(copy) 浅谈session,cookie,sessionStorage,localStorage的 ... 
- Notepad++ 安装 NppFTP 插件
			How to install a plugin The plugin (in the DLL form) should be placed in the \plugins subfolder of t ... 
- uname -r查询版本不是安装的版本的问题
			uname -r 查出来的版本与/lib/modules下面的内核版本不匹配.啥原因? 第一步,先strace uname -r看看这个uname -r到底从哪里获取的版本. strace没有看出来 ... 
- URL & QRcode auto generator
			URL & QRcode auto generator 二维码 npm & qrcode https://www.npmjs.com/package/qrcode https://ww ... 
