
本教程详细介绍了如何使用bootstrap的collapse组件和原生javascript,根据多个开关(checkbox)的选中状态来动态控制一个特定div元素的显示与隐藏。通过监听开关的`change`事件,并利用`array.prototype.some()`方法判断至少一个开关是否被选中,从而实现联动效果,提升用户界面的交互性。
在现代Web应用中,动态地根据用户交互调整页面元素的可见性是一种常见的需求。例如,当用户勾选或取消勾选某些选项时,可能需要显示或隐藏相关的配置区域或提示信息。本教程将指导您如何结合Bootstrap的Collapse组件和简单的JavaScript代码,实现一个高级的联动效果:当且仅当所有关联的开关(checkbox)都处于未选中状态时,隐藏一个特定的DIV元素。
假设您有两个Bootstrap风格的开关按钮,每个开关控制着表单中一个独立的折叠区域(例如,两个不同的复选框组)。此外,页面上还有一个包含额外选项的段落或DIV,我们希望这个段落仅在两个开关都未被激活(即都未选中)时才隐藏。当至少一个开关被激活时,该段落应保持可见。
我们将采用以下策略来实现这一功能:
首先,确保您的HTML文件引入了Bootstrap的CSS和JS文件。然后,构建以下核心HTML结构:
立即学习“Java免费学习笔记(深入)”;
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bootstrap多开关联动</title>
<!-- 引入Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container mt-4">
<h3>开关控制示例</h3>
<!-- 开关1 -->
<label class="switch mt-2">
<input class="form-check-input" type="checkbox" role="switch" id="ds-activate" data-bs-toggle='collapse' data-bs-target='#dsForm' aria-expanded="false" aria-controls="dsForm" checked>
<div class="slider round"></div>
</label>
<span class="ms-2">激活DS表单</span>
<!-- 开关2 -->
<label class="switch mt-2">
<input class="form-check-input" type="checkbox" role="switch" id="email-activate" data-bs-toggle='collapse' data-bs-target='#emailForm' aria-expanded="false">
<div class="slider round"></div>
</label>
<span class="ms-2">激活Email表单</span>
<!-- 目标隐藏/显示DIV -->
<div id="hideWhenBothSwitchOff" aria-expanded="false" class="collapse show mt-3">
<label class="form-label">更多选项</label>
<p>这里是对后续选项的解释说明。</p>
</div>
<!-- 开关1控制的折叠内容 -->
<div id="dsForm" aria-expanded="false" class="collapse show">
<div class="form-check mt-2 mb-2">
<input class="form-check-input" type="checkbox" value="" id="all-documents">
<label class="form-check-label" for="all-documents">
复选框1标签
</label>
</div>
</div>
<!-- 开关2控制的折叠内容 -->
<div id="emailForm" aria-expanded="false" class="collapse">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="all-emails">
<label class="form-check-label" for="all-emails">
复选框2标签
</label>
</div>
</div>
</div>
<!-- 引入Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jA3Q0hK4A3G3H3F3D3C3B3A3B3C3D3E3F3G3H3I3J3K3L3M3N3O3P3Q3R3S3T3U3V3W3X3Y3Z" crossorigin="anonymous"></script>
<script>
// 在这里添加JavaScript代码
</script>
</body>
</html>关键点说明:
现在,我们将添加JavaScript代码来处理开关的change事件并控制目标DIV的可见性。
// 获取目标DIV的Bootstrap Collapse实例
// toggle: false 表示不通过data属性自动切换,完全由JS控制
const collapsible = new bootstrap.Collapse('#hideWhenBothSwitchOff', {
toggle: false,
});
// 获取所有需要监听的开关元素
const checkboxes = [
document.getElementById('ds-activate'),
document.getElementById('email-activate'),
];
// 为每个开关添加事件监听器
checkboxes.forEach((checkbox) => {
checkbox.addEventListener('change', () => {
// 检查是否有至少一个开关被选中
// Array.prototype.some() 方法会测试数组中的某个元素是否通过了指定函数的测试。
// 如果有任何一个元素的checked属性为true,则返回true。
const atLeastOneChecked = checkboxes.some(({ checked }) => checked);
// 根据条件决定是显示还是隐藏目标DIV
const operation = atLeastOneChecked ? 'show' : 'hide';
// 调用Collapse实例的show()或hide()方法
collapsible[operation]();
});
});
// 页面加载后,根据初始状态执行一次检查
// 确保页面加载时,目标DIV的显示状态是正确的
document.addEventListener('DOMContentLoaded', () => {
const atLeastOneChecked = checkboxes.some(({ checked }) => checked);
const operation = atLeastOneChecked ? 'show' : 'hide';
collapsible[operation]();
});代码解释:
将上述HTML和JavaScript代码整合在一起,您将得到一个功能完整的示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bootstrap多开关联动隐藏元素</title>
<!-- 引入Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
<style>
/* 可选:为开关添加一些基本样式,如果Bootstrap默认样式不满足 */
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #2196F3;
}
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
</style>
</head>
<body>
<div class="container mt-4">
<h3>开关控制示例</h3>
<!-- 开关1 -->
<label class="switch mt-2">
<input class="form-check-input" type="checkbox" role="switch" id="ds-activate" data-bs-toggle='collapse' data-bs-target='#dsForm' aria-expanded="false" aria-controls="dsForm" checked>
<div class="slider round"></div>
</label>
<span class="ms-2">激活DS表单</span>
<!-- 开关2 -->
<label class="switch mt-2">
<input class="form-check-input" type="checkbox" role="switch" id="email-activate" data-bs-toggle='collapse' data-bs-target='#emailForm' aria-expanded="false">
<div class="slider round"></div>
</label>
<span class="ms-2">激活Email表单</span>
<!-- 目标隐藏/显示DIV -->
<div id="hideWhenBothSwitchOff" aria-expanded="false" class="collapse show mt-3">
<label class="form-label">更多选项</label>
<p>这里是对后续选项的解释说明。</p>
</div>
<!-- 开关1控制的折叠内容 -->
<div id="dsForm" aria-expanded="false" class="collapse show">
<div class="form-check mt-2 mb-2">
<input class="form-check-input" type="checkbox" value="" id="all-documents">
<label class="form-check-label" for="all-documents">
复选框1标签
</label>
</div>
</div>
<!-- 开关2控制的折叠内容 -->
<div id="emailForm" aria-expanded="false" class="collapse">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="all-emails">
<label class="form-check-label" for="all-emails">
复选框2标签
</label>
</div>
</div>
</div>
<!-- 引入Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jA3Q0hK4A3G3H3F3D3C3B3A3B3C3D3E3F3G3H3I3J3K3L3M3N3O3P3Q3R3S3T3U3V3W3X3Y3Z" crossorigin="anonymous"></script>
<script>
// 获取目标DIV的Bootstrap Collapse实例
const collapsible = new bootstrap.Collapse('#hideWhenBothSwitchOff', {
toggle: false,
});
// 获取所有需要监听的开关元素
const checkboxes = [
document.getElementById('ds-activate'),
document.getElementById('email-activate'),
];
// 为每个开关添加事件监听器
checkboxes.forEach((checkbox) => {
checkbox.addEventListener('change', () => {
// 检查是否有至少一个开关被选中
const atLeastOneChecked = checkboxes.some(({ checked }) => checked);
// 根据条件决定是显示还是隐藏目标DIV
const operation = atLeastOneChecked ? 'show' : 'hide';
// 调用Collapse实例的show()或hide()方法
collapsible[operation]();
});
});
// 页面加载后,根据初始状态执行一次检查
document.addEventListener('DOMContentLoaded', () => {
const atLeastOneChecked = checkboxes.some(({ checked }) => checked);
const operation = atLeastOneChecked ? 'show' : 'hide';
collapsible[operation]();
});
</script>
</body>
</html>通过结合Bootstrap的强大组件和灵活的JavaScript,我们可以轻松实现复杂的UI交互逻辑。这种方法不仅功能强大,而且代码结构清晰,易于维护和扩展。
以上就是利用JavaScript和Bootstrap实现多开关联动隐藏元素的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号