js实现modal
使用纯JavaScript实现Modal
创建HTML结构
<div class="modal" id="myModal">
<div class="modal-content">
<span class="close">×</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 = '×';
// 添加内容
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 = '×';
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控制动画

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);
}
}






