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日

相关文章

  • jQuery给元素添加样式的方法详解

    下面我将为你详细讲解 “jQuery给元素添加样式的方法详解”,包含以下内容: 一、几种jQuery给元素添加样式的方法详解 1. 使用css方法 通过css()方法可以给元素设置CSS样式,示例代码如下: $("#test").css("color", "red"); 上述代码的含义是设置id为”…

    css 2023年6月10日
    00
  • CSS轮廓设置方法详解

    CSS轮廓(outline)是一种可以在元素周围创建可定制的线条型边框的属性,足以完全独立于元素自带的border属性。与 CSS边框不同,轮廓不影响元素的大小和定位。轮廓还支持在轮廓上应用阴影和图像等效果。 基本语法 CSS轮廓如下所示: outline: [outline-color] [outline-style] [outline-width] 其中…

    Web开发基础 2023年3月20日
    00
  • 转载:On having layout

    转载:On having layout详细攻略 什么是On having layout? On having layout是一篇介绍如何给网页添加布局的文章。它主要介绍了CSS的盒模型及其相关属性,如何实现常见的布局方式,如列式布局、栅格布局等。 如何开始On having layout? 要开始On having layout,你应该首先了解HTML和CS…

    css 2023年6月9日
    00
  • 基于jQuery实现以手风琴方式展开和折叠导航菜单

    实现手风琴方式展开和折叠导航菜单的基本思路是利用jQuery控制CSS属性,以此来控制导航菜单的展开与折叠。具体方法如下: 1. 确定HTML结构 首先需要在HTML中编写出具有手风琴效果的导航菜单的基本结构,一般情况下,导航菜单的HTML结构如下: <ul class="accordion-menu"> <li cla…

    css 2023年6月9日
    00
  • react的滑动图片验证码组件的示例代码

    下面就为大家讲解一下“react的滑动图片验证码组件的示例代码”的完整攻略。 1. 引入组件 首先,我们需要安装并引入react滑动图片验证码组件。在命令行中执行以下代码安装: npm install –save react-slide-captcha 在需要使用的页面中引入组件: import SlideCaptcha from ‘react-slide…

    css 2023年6月10日
    00
  • CSS网页设计:百分比进行背景图片定位

    当我们制作网页时,经常需要用到背景图片,但是如何精确定位背景图片却是一件比较棘手的问题。这时候,我们可以使用CSS百分比进行背景图片定位。以下是进行背景图片定位的详细攻略。 1. 设置背景图片 首先,在CSS中设置背景图片,代码如下: body { background-image: url(background.jpg); background-repea…

    css 2023年6月9日
    00
  • 带大家了解一下JavaScript常见的五个内存错误

    带大家了解一下JavaScript常见的五个内存错误 在JavaScript中,内存错误是常见的开发问题之一。当我们开发大型应用程序时,内存错误可能会对应用程序的性能和稳定性造成负面影响。本文将介绍JavaScript中常见的五种内存错误,以及如何解决它们。 1. 内存泄漏 内存泄漏是指未释放不再使用的内存。它可能是由于变量的值一直存在,而没有被垃圾回收机制…

    css 2023年6月10日
    00
  • IE下css常见问题总结及解决

    IE下CSS常见问题总结及解决 问题一:盒模型不一致 问题描述 IE浏览器的盒模型与其他现代浏览器不同,根据W3C标准,盒模型由content、padding、border、margin组成,而IE浏览器中的盒模型包含border和padding部分的宽度,因此在写样式时需要特别注意。 解决方案 使用CSS3的box-sizing属性,设置值为”border…

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