前端开发社区前端开发社区
  • 首页
  • VUE.js
  • React.js
  • HTML
  • CSS
  • JavaScript
  • PHP
  • jquery
  • Java
  • MySQL
  • uniapp
前端开发社区
当前位置:首页 > JavaScript

js实现modal

2026-03-14 05:51:18JavaScript

使用纯JavaScript实现Modal

创建HTML结构

<div class="modal" id="myModal">
  <div class="modal-content">
    <span class="close">&times;</span>
    <p>这里是模态框内容</p>
  </div>
</div>
<button id="openModal">打开模态框</button>

添加CSS样式

.modal {
  display: none;
  position: fixed;
  z-index: 1;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0,0,0,0.4);
}

.modal-content {
  background-color: #fefefe;
  margin: 15% auto;
  padding: 20px;
  border: 1px solid #888;
  width: 80%;
}

.close {
  color: #aaa;
  float: right;
  font-size: 28px;
  font-weight: bold;
  cursor: pointer;
}

JavaScript实现功能

// 获取DOM元素
const modal = document.getElementById("myModal");
const btn = document.getElementById("openModal");
const span = document.getElementsByClassName("close")[0];

// 打开模态框
btn.onclick = function() {
  modal.style.display = "block";
}

// 关闭模态框
span.onclick = function() {
  modal.style.display = "none";
}

// 点击模态框外部关闭
window.onclick = function(event) {
  if (event.target == modal) {
    modal.style.display = "none";
  }
}

动态创建Modal组件

封装成可重用函数

function createModal(content) {
  // 创建modal元素
  const modal = document.createElement('div');
  modal.className = 'modal';

  // 创建modal内容
  const modalContent = document.createElement('div');
  modalContent.className = 'modal-content';

  // 创建关闭按钮
  const closeBtn = document.createElement('span');
  closeBtn.className = 'close';
  closeBtn.innerHTML = '&times;';

  // 添加内容
  modalContent.appendChild(closeBtn);
  modalContent.appendChild(document.createTextNode(content));
  modal.appendChild(modalContent);

  // 添加到body
  document.body.appendChild(modal);

  // 事件监听
  closeBtn.onclick = function() {
    document.body.removeChild(modal);
  };

  window.onclick = function(event) {
    if (event.target === modal) {
      document.body.removeChild(modal);
    }
  };

  return modal;
}

// 使用示例
document.getElementById('openModal').addEventListener('click', function() {
  createModal('这是一个动态创建的模态框');
});

支持Promise的Modal实现

实现异步操作

function showModal(options) {
  return new Promise((resolve) => {
    const modal = document.createElement('div');
    modal.className = 'modal';

    const modalContent = document.createElement('div');
    modalContent.className = 'modal-content';

    const closeBtn = document.createElement('span');
    closeBtn.className = 'close';
    closeBtn.innerHTML = '&times;';

    const content = document.createElement('p');
    content.textContent = options.content || '';

    modalContent.appendChild(closeBtn);
    modalContent.appendChild(content);
    modal.appendChild(modalContent);
    document.body.appendChild(modal);

    // 关闭处理函数
    function close() {
      document.body.removeChild(modal);
      resolve(options.returnValue || true);
    }

    closeBtn.onclick = close;

    window.onclick = function(event) {
      if (event.target === modal) {
        close();
      }
    };

    // 如果有按钮选项
    if (options.buttons) {
      const btnContainer = document.createElement('div');
      btnContainer.className = 'modal-buttons';

      options.buttons.forEach(btn => {
        const button = document.createElement('button');
        button.textContent = btn.text;
        button.onclick = function() {
          document.body.removeChild(modal);
          resolve(btn.value);
        };
        btnContainer.appendChild(button);
      });

      modalContent.appendChild(btnContainer);
    }
  });
}

// 使用示例
document.getElementById('openModal').addEventListener('click', async function() {
  const result = await showModal({
    content: '请确认您的操作',
    buttons: [
      { text: '确定', value: true },
      { text: '取消', value: false }
    ]
  });
  console.log('用户选择:', result);
});

动画效果增强

添加CSS动画

.modal-content {
  animation: modalopen 0.4s;
}

@keyframes modalopen {
  from {opacity: 0; transform: translateY(-50px);}
  to {opacity: 1; transform: translateY(0);}
}

JavaScript控制动画

js实现modal

function animateModal(modal, show) {
  if (show) {
    modal.style.display = 'block';
    setTimeout(() => {
      modal.querySelector('.modal-content').style.opacity = '1';
      modal.querySelector('.modal-content').style.transform = 'translateY(0)';
    }, 10);
  } else {
    modal.querySelector('.modal-content').style.opacity = '0';
    modal.querySelector('.modal-content').style.transform = 'translateY(-50px)';
    setTimeout(() => {
      modal.style.display = 'none';
    }, 400);
  }
}

标签: jsmodal
分享给朋友:

相关文章

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

最新文章
  • java子类如何调用父类的方法

    2026-04-09 08:54:50

  • java如何定义一个类

    2026-04-09 08:51:25

  • java 如何四舍五入

    2026-04-09 08:49:47

  • java如何四舍五入

    2026-04-09 08:48:15

  • java如何输出数组中的数组

    2026-04-09 08:45:31

标签列表
  • vue (13931)
  • 原理 (626)
  • 分页 (603)
  • 跳转 (582)
  • 页面 (1094)
  • 路由 (650)
  • 列表 (473)
  • 功能 (1256)
  • 文件 (456)
  • 项目 (532)
  • 菜单 (444)
  • 组件 (1026)
  • 表格 (673)
  • 数据 (497)
  • 图片 (790)
  • js (4916)
  • 如何实现 (1693)
  • 效果 (625)
  • react (3311)
  • jquery (2238)
  • css (2728)
  • php (4572)
  • java (3021)
  • uniapp (1363)
  • elementui (828)

陕ICP备2023000799号  网站地图

Powered By Z-BlogPHP. Theme by TOYEAN.