亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JS實現自定義彈窗功能

2019-11-19 13:19:20
字體:
來源:轉載
供稿:網友

眾所周知,瀏覽器自帶的原生彈窗很不美觀,而且功能比較單一,絕大部分時候我們都會按照設計圖自定義彈窗或者直接使用注入layer的彈窗等等。前段時間在 慕課網 上看到了一個自定義彈窗的實現,自己順便就學習嘗試寫了下,下面是主要的實現代碼并添加了比較詳細的注釋,分享出來供大家參考。(代碼用了ES6部分寫法如需兼容低版本瀏覽器請把相關代碼轉成es5寫法,后面有時間更新為一個兼容性較好的es5版本)

HTML部分:(沒什么內容 放置一個按鈕調用函數,js中調用實例即可供參考)

<!DOCTYPE html><html><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <meta http-equiv="X-UA-Compatible" content="ie=edge">  <title>自定義彈窗</title>  <link rel="stylesheet" href="alert.css" rel="external nofollow" ></head><body>   <button>Click me</button>   <script src="index.js"></script>   <script>    document.querySelector("button").addEventListener("click",()=>{     new $Msg({      content:"我的自定義彈窗好了",      type:"success",      cancle:function(){       let cancle = new $Msg({        content:"我是取消后的回調"       })      },      confirm:function(){       new $Msg({content:"我是確定后的回調"})      }     })    })   </script></body></html>

樣式部分:也放出來供參考,樣式可以根據自己的設計圖自行更改即可

/* 彈出框最外層 */.msg__wrap {  position: fixed;  top: 50%;  left: 50%;  z-index: 10;  transition: all .3s;  transform: translate(-50%, -50%) scale(0, 0);  max-width: 50%;  background: #fff;  box-shadow: 0 0 10px #eee;  font-size: 10px; } /* 彈出框頭部 */ .msg__wrap .msg-header {  padding: 10px 10px 0 10px;  font-size: 1.8em; } .msg__wrap .msg-header .msg-header-close-button {  float: right;  cursor: pointer; } /* 彈出框中部 */ .msg__wrap .msg-body {  padding: 10px 10px 10px 10px;  display: flex; } /* 圖標 */ .msg__wrap .msg-body .msg-body-icon{  width: 80px; } .msg__wrap .msg-body .msg-body-icon div{  width: 45px;  height: 45px;  margin: 0 auto;  line-height: 45px;  color: #fff;  border-radius: 50% 50%;  font-size: 2em; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-success{  background: #32a323;  text-align: center; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-success::after{  content: "成"; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-wrong{  background: #ff8080;  text-align: center; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-wrong::after{  content: "誤"; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-info{  background: #80b7ff;  text-align: center; } .msg__wrap .msg-body .msg-body-icon .msg-body-icon-info::after{  content: "注"; } /* 內容 */ .msg__wrap .msg-body .msg-body-content{  min-width: 200px;  font-size: 1.5em;  word-break: break-all;  display: flex;  align-items: center;  padding-left: 10px;  box-sizing: border-box; } /* 彈出框底部 */ .msg__wrap .msg-footer {  padding: 0 10px 10px 10px;  display: flex;  flex-direction: row-reverse; } .msg__wrap .msg-footer .msg-footer-btn {  width: 50px;  height: 30px;  border: 0 none;  color: #fff;  outline: none;  font-size: 1em;  border-radius: 2px;  margin-left: 5px;  cursor: pointer; } .msg__wrap .msg-footer .msg-footer-cancel-button{  background-color: #ff3b3b; } .msg__wrap .msg-footer .msg-footer-cancel-button:active{  background-color: #ff6f6f; } .msg__wrap .msg-footer .msg-footer-confirm-button{  background-color: #4896f0; } .msg__wrap .msg-footer .msg-footer-confirm-button:active{  background-color: #1d5fac; } /* 遮罩層 */ .msg__overlay {  position: fixed;  top: 0;  right: 0;  bottom: 0;  left: 0;  z-index: 5;  background-color: rgba(0, 0, 0, .4);  transition: all .3s;  opacity: 0; }

JS部分:下面是最主要的部分,js方法及交互。自己封裝自定義組件均可以此為參考,封裝自己的組件。

/* *自定義彈窗 *///自執行函數 形成封閉的作用域 避免全局污染 //傳入windwo和document對象 相當于將window和document作為了作用域中的局部變量,//就不需要內部函數沿著作用域鏈再查找到最頂層的window 提高運行效率。(function (window, document) {  //定義一個構造函數Msg 作為彈窗實例的構造函數。  let Msg = function (options) {    //執行初始化操作    this._init(options);  }  //定義初始化方法 并對方法傳遞的參數進行初始化  Msg.prototype = {    _init({      content = "", //文本內容      type = "info", //信息類型      useHTML = false, //是否解析html字符串      showIcon = true, //是否展示彈窗圖標      confirm = null, //確認后得回調      cancle = null, //取消后得回調      footer = true, //是否顯示底部的確認按鈕      header = true, //是否顯示頭部信息及關閉按鈕      title = "提示", //彈窗標題      contentStyle = {}, //內容樣式      contentFontSize = "1.5em", //內容字體大小      btnName = ["確定", "取消"] //按鈕文字內容    }) {      //將傳入的值綁定到this上       this.content = content;      this.type = type;      this.useHTML = useHTML;      this.showIcon = showIcon;      this.confirm = confirm;      this.cancle = cancle;      this.footer = footer;      this.header = header;      this.title = title;      this.contentStyle = contentStyle;      this.contentFontSize = contentFontSize;      this.btnName = btnName;      //執行創建元素方法      this._creatElement();      //顯示彈窗及遮罩      this._show({        el: this._el,        overlay: this._overlay      });      //綁定事件處理函數      this._bind({        el: this._el,        overlay: this._overlay      });    },    //創建彈窗元素方法    _creatElement() {      //創建最外層得包裹元素      let wrap = document.createElement("div");      wrap.className = "msg__wrap";      //定義彈窗得兩個按鈕      const [confirmBtnName, cancelBtnName] = this.btnName;      //判斷是否顯示彈窗標題      const headerHTML = this.header ?        `<div class="msg-header">            <span>${this.title}</span>            <span class="msg-header-close-button">×</span>          </div>` : "";      //判斷是否顯示圖標      const iconHTML = this.showIcon ?        `<div class="msg-body-icon">          <div class="msg-body-icon-${this.type}"></div>        </div>` : "";      //判斷是否顯示彈窗底部按鈕      const footerHTML = this.footer ?        `<div class="msg-footer">            <button class="msg-footer-btn msg-footer-cancel-button">${cancelBtnName}</button>            <button class="msg-footer-btn msg-footer-confirm-button">${confirmBtnName}</button>          </div>` : "";      //拼接完整html      const innerHTML = `${headerHTML}      <div class="msg-body">        ${iconHTML}        <div class="msg-body-content"></div>      </div>      ${footerHTML}`;      //將拼接的html賦值到wrap中      wrap.innerHTML = innerHTML;      //把自定義的樣式進行合并      const contentStyle = {        fontSize: this.contentFontSize,        ...this.contentStyle      }      //獲取內容所屬DOM      let content = wrap.querySelector(".msg-body .msg-body-content");      //將傳過來的樣式添加到contentDOM      for (const key in contentStyle) {        if (contentStyle.hasOwnProperty(key)) {          content.style[key] = contentStyle[key];        }      }      //給彈窗的conntent賦值      if (this.useHTML) {        content.innerHTML = this.content;      } else {        content.innerText = this.content;      }      //創建遮罩層      let overlay = document.createElement("div");      overlay.className = "msg__overlay";      //把dom掛載到當前實例上      this._overlay = overlay;      this._el = wrap;    },    //彈窗展現方法    _show({      el,      overlay    }) {      //把彈窗的dom和遮罩插入到頁面中      document.body.appendChild(el);      document.body.appendChild(overlay);      //將彈窗顯示出來 timeout進行異步處理顯示動畫      setTimeout(() => {        el.style.transform = "translate(-50%,-50%) scale(1,1)";        overlay.style.opacity = "1";      })    },    //關閉彈窗方法    _close({      el,      overlay    }) {      //隱藏dom       el.style.transform = "translate(-50%,-50%) scale(0,0)";      overlay.style.opcity = "0";      //根據動畫時間 動畫完成再移除      setTimeout(() => {        //把彈窗的dom和遮罩移除        document.body.removeChild(el)        document.body.removeChild(overlay);      }, 300);    },    //事件處理函數,為DOM綁定事件    _bind({      el,      overlay    }) {      //保存當前this      //const _this = this;      const cancle = (e) => {        this.cancle && this.cancle.call(this, e);        //隱藏彈窗        //hideMsg();        this._close({          el,          overlay        });      }      //確認彈窗      const confirm = (e) => {        this.confirm && this.confirm.call(this, e);        this._close({          el,          overlay        });      }      //頂部關閉按鈕綁定事件      if (this.header) {        el.querySelector(".msg-header-close-button").addEventListener("click", cancle);      }      //彈窗底部兩個按鈕事件監聽      if (this.footer) {        el.querySelector(".msg-footer-cancel-button").addEventListener("click", cancle);        el.querySelector(".msg-footer-confirm-button").addEventListener("click", confirm)      }    }  }  //將構造函數暴露到window,這樣才能在全局作用域下直接調用   window.$Msg = Msg;})(window, document);

到此,一個完整的自定義彈窗組件已完成,只需要引入該js以及css或者直接把相關代碼加到自己的公共js中即可直接調用,注意,構造函數調用要用new.

總結

以上所述是小編給大家介紹的JS實現自定義彈窗功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产拍精品一二三| 久久久视频精品| 青青草成人在线| 亚洲精品98久久久久久中文字幕| 国产午夜精品久久久| 久久亚洲春色中文字幕| 欧美美女操人视频| 精品国产91久久久| 秋霞午夜一区二区| 精品国产91乱高清在线观看| 亚洲第一精品久久忘忧草社区| 亚洲第一区中文99精品| 亚洲人成在线免费观看| 国产欧美在线看| 国产一区二区av| 亚洲久久久久久久久久| 欧洲亚洲妇女av| 伊人精品在线观看| 九色成人免费视频| 亚洲激情在线观看视频免费| 日韩av综合网站| 欧美裸体男粗大视频在线观看| 亚洲欧美制服第一页| 久久97久久97精品免视看| 久久久国产一区二区| 国产亚洲精品美女久久久| 欧美极品欧美精品欧美视频| 国产精品一区二区久久精品| 亚洲高清av在线| 91国产精品视频在线| 成人有码在线视频| 亚洲天堂成人在线视频| 中文字幕亚洲专区| 国产精品久久久久91| 亚洲最大成人免费视频| 日韩中文字幕不卡视频| 98精品国产自产在线观看| 国产不卡在线观看| 亚洲天堂影视av| 亚洲免费视频观看| 国产亚洲精品美女久久久久| 国产综合在线观看视频| 日韩国产精品一区| 日韩h在线观看| 国产亚洲欧美日韩一区二区| 日本午夜在线亚洲.国产| 久久伊人91精品综合网站| 欧美最顶级丰满的aⅴ艳星| 日本精品久久久| 91av在线播放视频| 国产日韩在线免费| 日韩日本欧美亚洲| 国产精品欧美日韩| 久久久久中文字幕2018| 日韩在线播放视频| 秋霞成人午夜鲁丝一区二区三区| 亚洲精品免费在线视频| 色综合久久中文字幕综合网小说| 国产成人高潮免费观看精品| 亚洲欧美一区二区精品久久久| 日韩中文在线中文网在线观看| 亚洲 日韩 国产第一| 一本色道久久88精品综合| 日韩高清电影免费观看完整版| 久久久噜噜噜久久久| 日韩电影中文字幕在线| 亚洲国内精品视频| 久热爱精品视频线路一| 亲子乱一区二区三区电影| 国产欧美最新羞羞视频在线观看| 国产精品入口夜色视频大尺度| 欧美激情第1页| 在线色欧美三级视频| 国产精品草莓在线免费观看| 亚洲毛片在线观看| 亚洲午夜未满十八勿入免费观看全集| 欧美情侣性视频| 国产精品一区二区久久国产| 国产精品96久久久久久又黄又硬| 国产精品亚洲美女av网站| 亚洲人成网站在线播| 欧美一区二粉嫩精品国产一线天| 成人av在线天堂| 在线观看国产精品91| 久久亚洲精品网站| 中文字幕精品一区二区精品| 在线视频精品一| 久久成年人视频| 欧美激情一级欧美精品| 97欧美精品一区二区三区| 最新国产成人av网站网址麻豆| 亚洲理论在线a中文字幕| 亚洲国产三级网| 久久精品亚洲热| 国产美女搞久久| 日韩精品免费综合视频在线播放| 久久久中文字幕| 久久综合电影一区| 久操成人在线视频| 国产精品偷伦一区二区| www高清在线视频日韩欧美| 91精品国产综合久久香蕉的用户体验| 精品视频在线播放色网色视频| 91在线视频导航| 亚洲成av人影院在线观看| 日本久久久久久| 日韩欧美在线视频日韩欧美在线视频| 日韩电影中文字幕av| 亚洲成人精品视频在线观看| 国产欧美一区二区| 国内精品伊人久久| 国内精品视频在线| 亚洲欧美国产日韩中文字幕| 国产精品精品一区二区三区午夜版| 日韩欧美国产高清91| 亚洲综合在线中文字幕| 欧美高清性猛交| 亚洲精品免费网站| 久久精品福利视频| 亚洲第一级黄色片| 国产精品黄视频| 高清在线视频日韩欧美| 日本精品性网站在线观看| 日韩一区二区欧美| 亚洲欧美精品在线| 青草青草久热精品视频在线网站| 久久精品福利视频| 成人福利免费观看| 国产视频福利一区| 日韩高清中文字幕| 狠狠躁18三区二区一区| 欧美精品免费看| 欧美在线一级va免费观看| 中文字幕精品一区二区精品| 久久成人18免费网站| 亚洲欧美国产日韩天堂区| 国产一区二区日韩精品欧美精品| 97涩涩爰在线观看亚洲| 91色精品视频在线| 欧美激情免费视频| 911国产网站尤物在线观看| 日本最新高清不卡中文字幕| 美女精品视频一区| 亚洲自拍欧美色图| 精品一区二区三区四区| 亚洲国产精品专区久久| 欧美一级在线播放| 亚洲午夜性刺激影院| 国产成人综合精品| 91丨九色丨国产在线| 欧美精品18videosex性欧美| 久久综合88中文色鬼| 在线国产精品播放| 不卡在线观看电视剧完整版| 亚洲国产欧美一区二区丝袜黑人| 欧美区二区三区| 亚洲精品国产电影| 久久精品91久久香蕉加勒比| 亚洲图中文字幕| 久久艳片www.17c.com| 成人h视频在线观看播放| 亚洲国产精品久久久久久| 亚洲自拍偷拍在线| 26uuu另类亚洲欧美日本老年|