欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS實(shí)現(xiàn)自定義彈窗功能

 更新時(shí)間:2018年08月08日 09:58:41   作者:山海之間  
瀏覽器自帶的原生彈窗很不美觀(guān),而且功能比較單一,絕大部分時(shí)候我們都會(huì)按照設(shè)計(jì)圖自定義彈窗或者直接使用注入layer的彈窗等等。下面小編給大家?guī)?lái)了JS實(shí)現(xiàn)自定義彈窗,感興趣的朋友一起看看吧

眾所周知,瀏覽器自帶的原生彈窗很不美觀(guān),而且功能比較單一,絕大部分時(shí)候我們都會(huì)按照設(shè)計(jì)圖自定義彈窗或者直接使用注入layer的彈窗等等。前段時(shí)間在 慕課網(wǎng) 上看到了一個(gè)自定義彈窗的實(shí)現(xiàn),自己順便就學(xué)習(xí)嘗試寫(xiě)了下,下面是主要的實(shí)現(xiàn)代碼并添加了比較詳細(xì)的注釋?zhuān)窒沓鰜?lái)供大家參考。(代碼用了ES6部分寫(xiě)法如需兼容低版本瀏覽器請(qǐng)把相關(guān)代碼轉(zhuǎn)成es5寫(xiě)法,后面有時(shí)間更新為一個(gè)兼容性較好的es5版本)

HTML部分:(沒(méi)什么內(nèi)容 放置一個(gè)按鈕調(diào)用函數(shù),js中調(diào)用實(shí)例即可供參考)

<!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:"我是取消后的回調(diào)"
       })
      },
      confirm:function(){
       new $Msg({content:"我是確定后的回調(diào)"})
      }
     })
    })
   </script>
</body>
</html>

樣式部分:也放出來(lái)供參考,樣式可以根據(jù)自己的設(shè)計(jì)圖自行更改即可

/* 彈出框最外層 */
.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;
 }
 /* 圖標(biāo) */
 .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: "注";
 }
 /* 內(nèi)容 */
 .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方法及交互。自己封裝自定義組件均可以此為參考,封裝自己的組件。

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

到此,一個(gè)完整的自定義彈窗組件已完成,只需要引入該js以及css或者直接把相關(guān)代碼加到自己的公共js中即可直接調(diào)用,注意,構(gòu)造函數(shù)調(diào)用要用new.

總結(jié)

以上所述是小編給大家介紹的JS實(shí)現(xiàn)自定義彈窗功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • JavaScript深拷貝的幾種實(shí)現(xiàn)方法實(shí)例

    JavaScript深拷貝的幾種實(shí)現(xiàn)方法實(shí)例

    javascript深拷貝是初學(xué)者甚至有經(jīng)驗(yàn)的開(kāi)發(fā)著,都會(huì)經(jīng)常遇到問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于JavaScript深拷貝的幾種實(shí)現(xiàn)方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • 微信小程序使用picker實(shí)現(xiàn)時(shí)間和日期選擇框功能【附源碼下載】

    微信小程序使用picker實(shí)現(xiàn)時(shí)間和日期選擇框功能【附源碼下載】

    這篇文章主要介紹了微信小程序使用picker實(shí)現(xiàn)時(shí)間和日期選擇框功能,結(jié)合實(shí)例形式分析了微信小程序picker組件進(jìn)行日期與時(shí)間選擇的相關(guān)操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2017-12-12
  • 微信小程序路由跳轉(zhuǎn)兩種方式示例解析

    微信小程序路由跳轉(zhuǎn)兩種方式示例解析

    這篇文章主要為大家介紹了微信小程序路由跳轉(zhuǎn)兩種方式示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 微信小程序開(kāi)發(fā)指南之圖片壓縮解決方案

    微信小程序開(kāi)發(fā)指南之圖片壓縮解決方案

    在項(xiàng)目開(kāi)發(fā)過(guò)程中遇到一個(gè)需要從小程序上傳圖片的需求,此需求實(shí)現(xiàn)起來(lái)并不難,下面這篇文章主要給大家介紹了關(guān)于微信小程序開(kāi)發(fā)指南之圖片壓縮解決方案的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • JavaScript 有用的代碼片段和 trick

    JavaScript 有用的代碼片段和 trick

    這篇文章主要介紹了JavaScript 有用的代碼片段和 trick的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • PHP 502bad gateway原因及解決方案

    PHP 502bad gateway原因及解決方案

    這篇文章主要介紹了PHP 502bad gateway原因及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Javascript實(shí)現(xiàn)Vue跨組件通信的方法詳解

    Javascript實(shí)現(xiàn)Vue跨組件通信的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue的跨組件通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 微信小程序websocket實(shí)現(xiàn)即時(shí)聊天功能

    微信小程序websocket實(shí)現(xiàn)即時(shí)聊天功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序websocket實(shí)現(xiàn)即時(shí)聊天功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 詳解如何在JavaScript中創(chuàng)建線(xiàn)性?xún)x表圖

    詳解如何在JavaScript中創(chuàng)建線(xiàn)性?xún)x表圖

    線(xiàn)性?xún)x表圖表示顯示所需值的垂直或水平線(xiàn)性刻度,帶有顏色刻度以及單個(gè)或多個(gè)指針。本文將詳細(xì)講解如何利用JavaScript創(chuàng)建線(xiàn)性?xún)x表圖,需要的可以參考一下
    2022-03-03
  • 如何利用echarts畫(huà)雷達(dá)圖和折柱混合

    如何利用echarts畫(huà)雷達(dá)圖和折柱混合

    最近使用echarts做的一個(gè)H5的成績(jī)數(shù)據(jù)報(bào)告,里面使用了雷達(dá)圖已經(jīng)折線(xiàn)圖和柱狀圖,下面這篇文章主要給大家介紹了關(guān)于如何利用echarts畫(huà)雷達(dá)圖和折柱混合的相關(guān)資料,需要的朋友可以參考下
    2022-04-04

最新評(píng)論