JS簡易彈出層


目標

實現簡易的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

  1 $.extend({
  2         // alert框 {msg:要提示的信息,[timeout]:關閉時間(2000毫秒),[location]:位置(tl,tm,tr,ml,mr,bl,bm,br)}
  3         msgboxalert: function (msg, timeout, location)
  4         {
  5             $('body .msgbox-modal').remove();
  6             // alert組件彈出層Dom
  7             let dom = '<div class="msgbox-modal $location"><div class="msgbox-alert">$msg</div></div>';
  8             dom = dom.replace("$msg", msg || '');
  9             dom = dom.replace("$location", location || '');
 10             //
 11             $('body').append(dom);
 12             // 自動消失
 13             setTimeout(() =>
 14             {
 15                 $('body .msgbox-modal').remove();
 16             }, timeout || 2000)
 17         },
 18         // 清除所有彈出框,還原body滾動條狀態 {closeE:fun}
 19         msgboxClear: function (closeE)
 20         {
 21             $('body').find('.msgbox-shadow,.msgbox-modal').remove();
 22             $('body').removeClass('overflowhide');
 23             if (typeof closeE == 'function')
 24             {
 25                 closeE();
 26             }
 27         }
 28     });
 29 $.fn.extend({
 30         // 模態框 {beforeShow:fun,afterShow:fun,afterClose:fun,escClose:false,backClose:false,location:''}
 31         modal: function (config)
 32         {
 33             //=== 彈出層父級類名:為方便引用()
 34             let modalClsName = 'msgbox-modal';
 35             //=== init config
 36             let cfg = {};
 37             if (config)
 38             {
 39                 // 顯示之前執行
 40                 cfg.beforeShow = config.beforeShow || null;
 41                 // 顯示后執行
 42                 cfg.afterShow = config.afterShow || null;
 43                 // 關閉后執行
 44                 cfg.afterClose = config.afterClose || null;
 45                 // 按esc關閉
 46                 cfg.escClose = config.escClose || false;
 47                 // 點擊背景(彈出層父級)關閉
 48                 cfg.backClose = config.backClose || false;
 49                 // 位置
 50                 cfg.location = config.location || '';
 51             }
 52 
 53             //===
 54             // body禁用滾動條
 55             // 刪除舊的遮罩層
 56             $('body').addClass('overflowhide').find('.msgbox-shadow,.msgbox-modal').remove();
 57 
 58             //=== 彈出層准備: dom生成,相關事件執行
 59             // 將彈出層包含在彈出層父級DOM中
 60             let modal = $('<div class="' + modalClsName + ' ' + cfg.location + '" tabindex="-1"></div>');
 61             modal.append($(this));
 62             // x按鈕事件:點擊關閉彈出框
 63             modal.find('.msgbox-close').on('click', function ()
 64             {
 65                 $.msgboxClear(cfg.afterClose);
 66             })
 67             // 按ESC關閉
 68             if (cfg.escClose == true)
 69             {
 70                 modal.on("keyup", function (event)
 71                 {
 72                     //alert(event.target.className + event.which );
 73                     if (event.which != 27 || event.target.className.indexOf(modalClsName)==-1)
 74                         return;
 75                     $.msgboxClear(cfg.afterClose);
 76                 });
 77             }
 78             // 點擊背景關閉
 79             if (cfg.backClose == true)
 80             {
 81                 modal.on('click', function (event)
 82                 {
 83                     if (event.target.className.indexOf(modalClsName) == -1)
 84                         return;
 85                     $.msgboxClear(cfg.afterClose);
 86                 });
 87             }
 88             // 顯示之前執行
 89             if (typeof cfg.beforeShow == 'function')
 90             {
 91                 cfg.beforeShow($(this));
 92             }
 93             // 顯示遮罩
 94             $('body').append('<div class="msgbox-shadow"></div>');
 95             // 顯示彈出框
 96             $('body').append(modal);
 97             // 讓彈出層父級獲得焦點
 98             modal.focus();
 99             // 顯示之后執行
100             if (typeof cfg.afterShow == 'function')
101             {
102                 cfg.afterShow($(this));
103             }
104         }
105     })
msgbox

 css

//=== 關鍵部分css樣式
// 彈出框時,body設為無滾動條
.overflowhide
{ overflow: hidden; } // 遮罩層/ .msgbox-shadow { position: fixed; left: 0; top: 0; right: 0; bottom: 0; // 黑色背景,透明度 opacity: .4; background-color: #000; // 層級位於彈出層父級之下 z-index: 10000; } // 彈出層父級 .msgbox-modal { // 使用flex布局,默認彈出層水平垂直居中 display: flex; justify-content: center; align-items: center; // 固定定位 position: fixed; left: 0; top: 0; right: 0; bottom: 0; overflow-x: hidden; overflow-y: auto; // 在遮罩層之上 z-index: 10001; }

 


詳細示例代碼,修改后的

https://github.com/mirrortom/webcoms/tree/master/msgbox

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM