js自定义弹框插件的封装

接下来我会详细讲解一下 JavaScript 自定义弹框插件的封装攻略。

1. 弹框插件的封装

1.1. 功能概述

一般情况下,弹框插件需要实现以下功能:

  • 显示弹框
  • 隐藏弹框
  • 设置弹框标题
  • 设置弹框内容
  • 设置弹框按钮及其点击事件
  • 点击淡入淡出效果
  • 点击遮罩层隐藏弹框

1.2. 思路分析

  • 弹框插件应当具备可扩展性,考虑采用面向对象思想进行封装。
  • 弹框插件的 DOM 结构应当在插件中生成,而不是在 HTML 中写死。
  • 采用添加和删除类名的方式控制弹框的显示和隐藏。
  • 采用事件委托的方式,监听按钮的点击事件,实现多个按钮共用一个点击事件函数。

1.3. 代码实现

下面是一个简单的示例代码:

class Modal {
  constructor() {
    this.modal = document.createElement('div');
    this.modal.classList.add('modal');
  }

  setTitle(title) {
    const el = document.createElement('h2');
    el.textContent = title;
    this.modal.appendChild(el);
  }

  setContent(content) {
    const el = document.createElement('p');
    el.textContent = content;
    this.modal.appendChild(el);
  }

  addButton(text, callback) {
    const el = document.createElement('button');
    el.textContent = text;
    el.addEventListener('click', callback);
    this.modal.appendChild(el);
  }

  show() {
    document.body.appendChild(this.modal);
    setTimeout(() => {
      this.modal.classList.add('modal--visible');
    }, 0);
  }

  hide() {
    this.modal.classList.remove('modal--visible');
    setTimeout(() => {
      document.body.removeChild(this.modal);
    }, 300);
  }
}

上述代码中,Modal 类封装了弹框的显示、隐藏、设置标题、设置内容、添加按钮等功能,同时支持多按钮共用一个点击事件函数。

2. 使用示例

2.1. 简单示例

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Modal Demo</title>
    <style>
      .modal {
        display: none;
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background-color: rgba(0, 0, 0, 0.5);
      }

      .modal--visible {
        display: flex;
        align-items: center;
        justify-content: center;
      }

      .modal__wrapper {
        width: 400px;
        background-color: white;
        padding: 20px;
        border-radius: 5px;
      }

      .modal__title {
        font-size: 20px;
        margin-bottom: 10px;
      }

      .modal__content {
        margin-bottom: 20px;
      }

      .modal__button {
        font-size: 16px;
        padding: 5px 10px;
        border-radius: 5px;
        color: white;
        background-color: #3f51b5;
        cursor: pointer;
      }
    </style>
  </head>
  <body>
    <button id="btn">Show Modal</button>
    <script>
      const modal = new Modal();

      modal.setTitle('提示');
      modal.setContent('您确定要删除吗?');
      modal.addButton('确定', () => {
        alert('删除成功!');
        modal.hide();
      });
      modal.addButton('取消', () => {
        modal.hide();
      });

      document.querySelector('#btn').addEventListener('click', () => {
        modal.show();
      });
    </script>
  </body>
</html>

2.2. 优化示例

上面的示例代码实现了一个简单的弹框插件,但是如果要实现更强大的功能,还需进一步优化。下面是一个优化示例,这个示例为弹框插件增加了以下特性:

  • 采用 Promise 实现点击按钮后的异步处理;
  • 支持配置多个按钮,且按钮可以设置不同的样式;
  • 支持配置点击遮罩层是否隐藏弹框;
  • 支持配置是否点击按钮后自动隐藏弹框;
  • 采用 CSS3 实现弹出和关闭动画效果。
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Modal Demo</title>
    <style>
      /* 弹框样式 */
      .modal {
        box-sizing: border-box;
        position: fixed;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        background-color: rgba(0, 0, 0, 0.5);
        transition: opacity 0.3s, visibility 0s 0.3s;
        opacity: 0;
        visibility: hidden;
        z-index: 999;
      }

      .modal.modal--visible {
        visibility: visible;
        opacity: 1;
        transition-delay: 0s;
      }

      .modal__dialog {
        box-sizing: border-box;
        position: relative;
        margin: 10vh auto;
        padding: 10px;
        width: 400px;
        max-height: 80vh;
        background-color: #fff;
        overflow: auto;
        border-radius: 5px;
        box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
      }

      .modal__header,
      .modal__footer {
        text-align: center;
        padding: 5px 0;
      }

      .modal__close {
        position: absolute;
        top: 5px;
        right: 5px;
        color: rgba(0, 0, 0, 0.5);
        font-size: 24px;
        line-height: 1;
        cursor: pointer;
      }

      .modal__title {
        font-size: 20px;
        margin: 0;
      }

      .modal__content {
        margin: 10px 0;
      }

      .modal__button {
        margin-right: 10px;
        padding: 5px 10px;
        border-radius: 5px;
        font-size: 14px;
        cursor: pointer;
      }

      /* 按钮样式 */
      .modal__button--primary {
        color: #fff;
        background-color: #3f51b5;
      }

      .modal__button--info {
        color: #fff;
        background-color: #2196f3;
      }

      .modal__button--success {
        color: #fff;
        background-color: #4caf50;
      }

      .modal__button--warning {
        color: #fff;
        background-color: #ff9800;
      }

      .modal__button--danger {
        color: #fff;
        background-color: #f44336;
      }

      /* 遮罩层样式 */
      .modal--no-mask .modal {
        background-color: transparent;
      }
    </style>
  </head>
  <body>
    <button id="btn">Show Modal</button>
    <script>
      const modal = new Modal();

      modal.setTitle('提示');
      modal.setContent('您确定要删除吗?');
      modal.addButton({
        text: '确定',
        style: 'modal__button--primary',
        callback: () => {
          return new Promise((resolve) => {
            setTimeout(() => {
              alert('删除成功!');
              resolve();
            }, 1000);
          });
        }
      });
      modal.addButton({
        text: '取消',
        style: 'modal__button--warning',
        autoHide: true,
        callback: () => {
          console.log('取消');
        }
      });
      modal.addButton({
        text: '自定义按钮',
        style: 'modal__button--info',
        callback: () => {
          console.log('自定义按钮');
        }
      });

      modal.show();

      document.querySelector('#btn').addEventListener('click', () => {
        modal.show();
      });
    </script>
  </body>
</html>

上述代码中,我们优化了弹框的样式,同时实现了点击按钮后的异步处理和更多样式按钮的配置,还支持配置是否点击遮罩层是否隐藏弹框,是否点击按钮后自动隐藏弹框。

这个示例的效果应该比前面的简单示例要好很多。同时,这个示例也展示了弹框插件封装的可扩展性和易用性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js自定义弹框插件的封装 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 表格的头部固定效果通过css及jquery分别实现

    表格的头部固定效果是指当表格数据很多时,页面滚动时表头始终显示在页面顶部,便于查看数据。这个效果可以通过CSS和jQuery分别实现。 通过CSS实现表头固定效果 实现原理 通过CSS中的position: sticky与top属性实现,将表头固定在一定位置上,当表格区域滚动到一定位置时,表头就会被固定在页面顶部。 实现步骤 在CSS中定义表格头部样式 th…

    css 2023年6月10日
    00
  • css实现气泡框效果(实例加图解)

    CSS实现气泡框效果 气泡框效果是一种常见的CSS效果,可以为元素添加一个类似于气泡的框,用于强调或提示内容。本攻略将详细讲解如何使用CSS实现气泡框效果,包括基本原理、制作方法和示例说明。 1. 基本原理 气泡框效果的基本原理是使用CSS的伪元素:before和:after来模拟气泡和箭头,然后使用position和z-index属性将伪元素放置在元素的上…

    css 2023年5月18日
    00
  • 简单掌握CSS3将文字描边及填充文字颜色的方法

    下面是关于“简单掌握CSS3将文字描边及填充文字颜色的方法”的攻略: CSS3文字描边及填充方法 在CSS3中,我们可以通过使用text-stroke和-webkit-text-stroke属性轻松地为文字添加轮廓线和外部描边。 1. 描边 要添加轮廓线或描边,我们可以使用以下CSS样式: /* 加粗文本 */ bold { stroke: black; s…

    css 2023年6月9日
    00
  • css样式important规则的正确使用方式

    下面是“CSS样式important规则的正确使用方式”的完整攻略: 正确使用important规则 仅在必要时使用important规则 在开发网站时,有时可能会遇到无法通过其他方式覆盖特定CSS样式的情况。这时候可以考虑使用important规则来强制使用该样式。但是,important规则应该只在必要时使用。如果在大量使用important规则,将变得…

    css 2023年6月9日
    00
  • 怎样在html文档里做隔行换色的多行方法

    要在HTML文档中做隔行换色,我们可以使用CSS中的伪类选择器nth-child()来实现。以下是详细的攻略: 步骤一:在HTML中为需要隔行换色的元素添加class或id属性 在HTML中找到需要隔行换色的元素,可以是table中的tr元素或是ul/li列表中的li元素,为其添加class或id属性。例如: <table> <tr cla…

    css 2023年6月10日
    00
  • jQuery validata插件实现方法

    如何使用jQuery Validata插件来实现表单验证呢?下面是完整的攻略。 1. 下载和引入jQuery Validata插件 首先需要下载jQuery Validata插件,并在页面中引入相关的JS和CSS文件。可以通过script和link标签来分别引入相关文件,具体方法如下所示: <!– 引入jQuery文件 –> <scri…

    css 2023年6月10日
    00
  • 利用纯css实现table固定列与表头中间横向滚动的思路和实例

    下面我来详细讲解“利用纯CSS实现table固定列与表头中间横向滚动”的思路和实现步骤。 思路 要实现表头和固定列的横向滚动,需要将表格分为三部分:左侧固定列、中间表头、右侧内容。而为了保证左侧固定列的位置不会改变,需要给该列添加固定的宽度。 在滚动时,需要通过对表头和右侧内容的scroll事件进行监听,来同步滚动位置,保证左侧固定列的位置不变。 实现步骤 …

    css 2023年6月10日
    00
  • input 标签实现输入框带提示文字效果(两种方法)

    方法一:使用 placeholder 属性 在 HTML5 中,input 标签增加了 placeholder 属性,用于在输入框中显示提示文字。该属性的值会在输入框获得焦点时自动消失。 ## 实现方式一:使用 placeholder 属性 1. 使用示例: “`html <input type="text" placeholde…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部