js modal实现
实现模态框(Modal)的几种方法
使用原生JavaScript和CSS
创建一个基本的模态框需要HTML结构、CSS样式和JavaScript控制逻辑。
HTML结构
<div id="modal" class="modal">
<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控制
const modal = document.getElementById("modal");
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";
}
}
使用Bootstrap框架
Bootstrap提供了现成的模态框组件,只需引入相关库文件即可使用。
HTML结构
<!-- 触发按钮 -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
打开模态框
</button>
<!-- 模态框结构 -->
<div class="modal fade" id="exampleModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">标题</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<p>模态框内容</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
<button type="button" class="btn btn-primary">保存</button>
</div>
</div>
</div>
</div>
所需引入
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
使用第三方库
一些轻量级的JavaScript库如Micromodal.js专门用于创建可访问的模态框。
安装
npm install micromodal
使用示例
MicroModal.init({
onShow: modal => console.log(`${modal.id} is shown`),
onClose: modal => console.log(`${modal.id} is hidden`),
openTrigger: 'data-micromodal-trigger',
closeTrigger: 'data-micromodal-close',
disableScroll: true,
awaitCloseAnimation: false
});
HTML结构
<div class="modal micromodal-slide" id="modal-1" aria-hidden="true">
<div class="modal__overlay" tabindex="-1" data-micromodal-close>
<div class="modal__container" role="dialog" aria-modal="true">
<header class="modal__header">
<h2 class="modal__title">标题</h2>
<button class="modal__close" aria-label="Close modal" data-micromodal-close></button>
</header>
<main class="modal__content">
<p>内容区域</p>
</main>
<footer class="modal__footer">
<button class="modal__btn" data-micromodal-close>关闭</button>
</footer>
</div>
</div>
</div>
使用React实现模态框
在React中可以使用状态控制模态框的显示与隐藏。
示例代码
import { useState } from 'react';
function ModalExample() {
const [isOpen, setIsOpen] = useState(false);
return (
<div>
<button onClick={() => setIsOpen(true)}>打开模态框</button>
{isOpen && (
<div className="modal">
<div className="modal-content">
<span className="close" onClick={() => setIsOpen(false)}>×</span>
<p>React模态框内容</p>
</div>
</div>
)}
</div>
);
}
CSS样式
.modal {
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;
}
使用Vue实现模态框
Vue中可以通过v-if或v-show指令控制模态框显示。
示例代码
<template>
<div>
<button @click="showModal = true">打开模态框</button>
<div v-if="showModal" class="modal">
<div class="modal-content">
<span class="close" @click="showModal = false">×</span>
<p>Vue模态框内容</p>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
showModal: false
}
}
}
</script>
<style scoped>
.modal {
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;
}
</style>






