目标

实现简易的js弹出框.为了简单灵活的在小项目中使用.

实现思路

研究bootstrap的弹出框效果后,认为层级示意图如下:

层说明

弹出层分为三层.最底层的遮罩层,覆盖在浏览器视口上.它之上是弹出层父级,这个层完全透明,并且与遮罩层重合.最上层是弹出层,它的活动范围在其父层的范围内.

  1. 弹出时,隐藏body的滚动条
  2. 遮罩层位于body直属,固定定位,大小与视口相等.不必有dom,在每次弹出时,由js直接生成.
  3. 弹出层父级位于body直属,透明隐藏,大小同遮罩层,自动垂直滚动条.位于遮罩层与弹出层之间.
  4. 弹出层是一个自定义的DOM,位于最上层.
  5. 每个弹出层可做一个模板,放在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简易弹出层的更多相关文章

  1. js简单弹出层、遮罩层

    <html> <head> <title>js简单弹出层</title> <style> /*阴影边框效果*/ .box-shadow-1 ...

  2. js插件---弹出层sweetalert2(总结)

    js插件---弹出层sweetalert2(总结) 一.总结 一句话总结: sweetalert2的效果非常好,效果比较Q萌,移动端适配也比较好,感觉比layer.js效果好点 1.SweetAler ...

  3. js 实现弹出层效果

    代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <tit ...

  4. JS实现弹出层对话框

    点击按钮后,弹出层对话框,可交互,点击关闭后才关闭掉对话框. 效果图: 源码: <!doctype html> <html> <head> <meta cha ...

  5. JS实现弹出层效果

    很多时候我们想去某某网站干点什么的时候,就会让我们先注册登录后才可以访问内容,而现在很多网站注册登录的时候都会有一种遮罩层的效果,就是背景是带有透明度的黑色遮罩,盖满整个网站,然后登录框弹出固定在屏幕 ...

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

    lightbox JS插件--baguetteBox.js,它是用纯Javascript创建的图像展示效果,拥有图像放大缩小并带有相应的CSS3过度,并能在触摸屏等设备上完美展示. baguetteB ...

  7. div滚动条弹出层效果 (所需要的css文件和js文件,都已经上传到文件里面了progressbar.rar)

    <%--总的弹出层--%> <div class="tcck" id="joinclub" style="display:none& ...

  8. JS来添加弹出层,并且完成锁屏

    上图 <html> <head> <title>弹出层</title> <style type="text/css"> ...

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

    要实现的效果如下 点击“登录”按钮后,弹出登录小窗口,并且有遮罩层(这个名词还是百度知道的,以前只知道效果,却不知道名字) 在没有点击“登录”按钮之前登录小窗口不显示,点击“登录”按钮后小窗口显示,并 ...

随机推荐

  1. scrapy之五大核心组件

    scrapy之五大核心组件 scrapy一共有五大核心组件,分别为引擎.下载器.调度器.spider(爬虫文件).管道. 爬虫文件的作用: a. 解析数据 b. 发请求 调度器: a. 队列 队列是一 ...

  2. 【转】给word中的代码着色

    基本操作 1)用Notepad++直接编辑代码文件,注意文件后缀,比如.cpp是C++程序,.m是Matlab,linux文件是.sh,写对后缀表示的文件类型,才有对应的语法高亮效果. 2)选中需要的 ...

  3. C# 和 c++的语法不同点

    GC  Garbage Collection 垃圾回收器 自动释放资源 关键字: new 1.创建对象 2.隐藏从父类继承的同名函数 using 1.引用命名空间 2. using(FileStrea ...

  4. linux虚拟机桥接网络配置

    版权声明:经验之谈,不知能否换包辣条,另,转载请注明出处. https://blog.csdn.net/zhezhebie/article/details/75035997 前言:我是最小化安装cen ...

  5. Laravel Providers——服务提供者的注册与启动源码解析

      本文 GitBook 地址: https://www.gitbook.com/book/leoyang90/laravel-source-analysishttps://learnku.com/a ...

  6. Day 4-10 logging模块

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

  7. Eclipse的智能提示的设置

    智能提示修改方式是: Windows——>Preferences——>Java-->Editor-->Content Asist,在Auto activation trigge ...

  8. linux上如何让other用户访问没有other权限的目录

    目前遇到一个问题,一个other用户要访问一个目录,他需要在这个目录下创建文件,因此这个目录需要一个写权限,于是就给了这个目录777的权限,这样这个权限有点太大了,很容易出现安全问题,那我们应该怎么办 ...

  9. Springboot中使用Xstream进行XML与Bean 相互转换

    在现今的项目开发中,虽然数据的传输大部分都是用json格式来进行传输,但是xml毕竟也会有一些老的项目在进行使用,正常的老式方法是通过获取节点来进行一系列操作,个人感觉太过于复杂.繁琐.推荐一套简单的 ...

  10. DataSet 取值,DataSet行数,DataSet列数 从DataSet中取出特定值

    1 DataSet.Table[0].Rows[ i ][ j ] 其中i 代表第 i 行数, j 代表第 j 列数 2 DataSet.Table[0].Rows[ i ].ItemArray[ j ...