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" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">模态框标题</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="关闭"></button>
</div>
<div class="modal-body">
模态框内容...
</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>静态背景
html
<div class="modal fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabel">模态框标题</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="关闭"></button>
</div>
<div class="modal-body">
点击背景不会关闭此模态框。
</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>滚动长内容
html
<!-- 模态框内滚动 -->
<div class="modal fade" id="exampleModalLong" tabindex="-1" aria-labelledby="exampleModalLongTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitle">模态框标题</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="关闭"></button>
</div>
<div class="modal-body">
<p>很长的内容...</p>
<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>垂直居中
html
<div class="modal fade" id="exampleModalCenter" tabindex="-1" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalCenterTitle">垂直居中模态框</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="关闭"></button>
</div>
<div class="modal-body">
此模态框垂直居中显示。
</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>尺寸
html
<!-- 小模态框 -->
<div class="modal fade" id="exampleModalSm" tabindex="-1" aria-labelledby="exampleModalSmLabel" aria-hidden="true">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<!-- 内容 -->
</div>
</div>
</div>
<!-- 默认模态框 -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<!-- 内容 -->
</div>
</div>
</div>
<!-- 大模态框 -->
<div class="modal fade" id="exampleModalLg" tabindex="-1" aria-labelledby="exampleModalLgLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<!-- 内容 -->
</div>
</div>
</div>
<!-- 超大模态框 -->
<div class="modal fade" id="exampleModalXl" tabindex="-1" aria-labelledby="exampleModalXlLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<!-- 内容 -->
</div>
</div>
</div>
<!-- 全屏模态框 -->
<div class="modal fade" id="exampleModalFullscreen" tabindex="-1" aria-labelledby="exampleModalFullscreenLabel" aria-hidden="true">
<div class="modal-dialog modal-fullscreen">
<div class="modal-content">
<!-- 内容 -->
</div>
</div>
</div>全屏模态框
html
<!-- 始终全屏 -->
<div class="modal-dialog modal-fullscreen">
...
</div>
<!-- 在小于 sm 时全屏 -->
<div class="modal-dialog modal-fullscreen-sm-down">
...
</div>
<!-- 在小于 md 时全屏 -->
<div class="modal-dialog modal-fullscreen-md-down">
...
</div>
<!-- 在小于 lg 时全屏 -->
<div class="modal-dialog modal-fullscreen-lg-down">
...
</div>
<!-- 在小于 xl 时全屏 -->
<div class="modal-dialog modal-fullscreen-xl-down">
...
</div>
<!-- 在小于 xxl 时全屏 -->
<div class="modal-dialog modal-fullscreen-xxl-down">
...
</div>实际示例
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap 模态框示例</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container my-5">
<h1>Bootstrap 模态框示例</h1>
<!-- 确认对话框 -->
<h2>确认对话框</h2>
<button type="button" class="btn btn-danger mb-4" data-bs-toggle="modal" data-bs-target="#confirmModal">
删除项目
</button>
<div class="modal fade" id="confirmModal" tabindex="-1" aria-labelledby="confirmModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="confirmModalLabel">确认删除</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="关闭"></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-danger">确认删除</button>
</div>
</div>
</div>
</div>
<!-- 表单模态框 -->
<h2>表单模态框</h2>
<button type="button" class="btn btn-primary mb-4" data-bs-toggle="modal" data-bs-target="#formModal">
添加用户
</button>
<div class="modal fade" id="formModal" tabindex="-1" aria-labelledby="formModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="formModalLabel">添加新用户</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="关闭"></button>
</div>
<div class="modal-body">
<form>
<div class="mb-3">
<label for="userName" class="form-label">用户名</label>
<input type="text" class="form-control" id="userName" required>
</div>
<div class="mb-3">
<label for="userEmail" class="form-label">邮箱</label>
<input type="email" class="form-control" id="userEmail" required>
</div>
<div class="mb-3">
<label for="userRole" class="form-label">角色</label>
<select class="form-select" id="userRole">
<option selected>选择角色...</option>
<option value="1">管理员</option>
<option value="2">编辑</option>
<option value="3">查看者</option>
</select>
</div>
</form>
</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>
<!-- 信息模态框 -->
<h2>信息模态框</h2>
<button type="button" class="btn btn-info mb-4" data-bs-toggle="modal" data-bs-target="#infoModal">
查看详情
</button>
<div class="modal fade" id="infoModal" tabindex="-1" aria-labelledby="infoModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="infoModalLabel">产品详情</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="关闭"></button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-6">
<img src="https://via.placeholder.com/400x300" class="img-fluid rounded" alt="产品图片">
</div>
<div class="col-md-6">
<h4>产品名称</h4>
<p class="text-muted">产品编号:#12345</p>
<p>这是产品的详细描述信息。包含产品的特点、规格和使用说明。</p>
<h5 class="text-primary">¥299.00</h5>
<ul>
<li>特点 1</li>
<li>特点 2</li>
<li>特点 3</li>
</ul>
</div>
</div>
</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>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>JavaScript 方法
javascript
// 创建模态框实例
const myModal = new bootstrap.Modal(document.getElementById('myModal'), options)
// 显示模态框
myModal.show()
// 隐藏模态框
myModal.hide()
// 切换模态框
myModal.toggle()
// 销毁模态框
myModal.dispose()
// 手动调整模态框位置
myModal.handleUpdate()事件
javascript
const myModalEl = document.getElementById('myModal')
myModalEl.addEventListener('show.bs.modal', event => {
// 模态框即将显示
})
myModalEl.addEventListener('shown.bs.modal', event => {
// 模态框已显示
})
myModalEl.addEventListener('hide.bs.modal', event => {
// 模态框即将隐藏
})
myModalEl.addEventListener('hidden.bs.modal', event => {
// 模态框已隐藏
})
myModalEl.addEventListener('hidePrevented.bs.modal', event => {
// 模态框隐藏被阻止
})最佳实践
1. 可访问性
html
<div class="modal fade" id="myModal" tabindex="-1" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="myModalLabel">模态框标题</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="关闭"></button>
</div>
<!-- 内容 -->
</div>
</div>
</div>2. 焦点管理
javascript
const myModal = document.getElementById('myModal')
myModal.addEventListener('shown.bs.modal', () => {
document.getElementById('myInput').focus()
})