利用JavaScript和Bootstrap实现多开关联动隐藏元素

雨瑶小哥_4868

雨瑶小哥_4868

2025-10-18

595人浏览

原创

利用JavaScript和Bootstrap实现多开关联动隐藏元素

本教程详细介绍了如何使用bootstrap的collapse组件和原生javascript,根据多个开关(checkbox)的选中状态来动态控制一个特定div元素的显示与隐藏。通过监听开关的`change`事件,并利用`array.prototype.some()`方法判断至少一个开关是否被选中,从而实现联动效果,提升用户界面的交互性。

在现代Web应用中,动态地根据用户交互调整页面元素的可见性是一种常见的需求。例如,当用户勾选或取消勾选某些选项时,可能需要显示或隐藏相关的配置区域或提示信息。本教程将指导您如何结合Bootstrap的Collapse组件和简单的JavaScript代码,实现一个高级的联动效果:当且仅当所有关联的开关(checkbox)都处于未选中状态时,隐藏一个特定的DIV元素。

场景描述

假设您有两个Bootstrap风格的开关按钮,每个开关控制着表单中一个独立的折叠区域(例如,两个不同的复选框组)。此外,页面上还有一个包含额外选项的段落或DIV,我们希望这个段落仅在两个开关都未被激活(即都未选中)时才隐藏。当至少一个开关被激活时,该段落应保持可见。

实现原理

我们将采用以下策略来实现这一功能:

  1. HTML结构准备:确保所有相关的开关(input type="checkbox" role="switch")和目标隐藏/显示DIV都有唯一的ID。目标DIV应包含Bootstrap的collapse类,但不需要data-bs-toggle和data-bs-target属性,因为我们将通过JavaScript手动控制其状态。
  2. JavaScript控制:
    • 使用bootstrap.Collapse的JavaScript API来实例化目标DIV的折叠组件,并禁用其默认的切换行为(toggle: false)。
    • 获取所有相关开关的引用。
    • 为每个开关添加change事件监听器。
    • 在事件监听器中,检查所有开关的选中状态。
    • 根据检查结果,调用collapsible.show()或collapsible.hide()方法来控制目标DIV的可见性。

详细实现步骤

1. HTML结构

首先,确保您的HTML文件引入了Bootstrap的CSS和JS文件。然后,构建以下核心HTML结构:



    <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"><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>

关键点说明:

财经HTML高端海报生成
财经HTML高端海报生成

复杂得财经如何变成清晰,适合手机看的海报?如何加上你的IP

下载
  • id="ds-activate" 和 id="email-activate" 是我们用于控制的目标开关。
  • id="hideWhenBothSwitchOff" 是我们希望根据开关状态动态显示或隐藏的DIV。它包含 collapse 类,并且初始状态为 show(可见),因为在示例中 ds-activate 初始是 checked。
  • data-bs-toggle 和 data-bs-target 属性用于 ds-activate 和 email-activate 开关,以控制它们各自的折叠区域 (dsForm 和 emailForm)。这与我们即将实现的联动逻辑是独立的,但展示了Bootstrap开关的典型用法。

2. JavaScript逻辑

现在,我们将添加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]();
});

代码解释:

  1. new bootstrap.Collapse('#hideWhenBothSwitchOff', { toggle: false });
    • 这行代码创建了一个bootstrap.Collapse实例,它绑定到ID为hideWhenBothSwitchOff的DIV。
    • toggle: false 是关键,它告诉Bootstrap不要根据HTML中的data-*属性自动切换此组件的状态,而是完全由JavaScript代码来控制。
  2. const checkboxes = [...]
    • 我们通过ID获取了两个开关的DOM元素,并将它们存储在一个数组中,方便后续迭代处理。
  3. checkboxes.forEach((checkbox) => { ... });
    • 遍历checkboxes数组,为每个开关添加一个change事件监听器。这意味着每当任何一个开关的状态发生变化时,回调函数都会被执行。
  4. const atLeastOneChecked = checkboxes.some(({ checked }) => checked);
    • 这是实现联动逻辑的核心。Array.prototype.some()方法会遍历数组中的每个元素。
    • ({ checked }) => checked 是一个箭头函数,它解构出每个checkbox对象的checked属性,并返回其布尔值。
    • 如果数组中至少有一个开关的checked属性为true,那么some()方法就会返回true,atLeastOneChecked变量也将为true。
    • 如果所有开关都未选中,some()将返回false。
  5. const operation = atLeastOneChecked ? 'show' : 'hide';
    • 这是一个三元运算符,根据atLeastOneChecked的值,确定要执行的操作是'show'(显示)还是'hide'(隐藏)。
  6. collapsible[operation]();
    • 动态调用collapsible对象上的show()或hide()方法,从而控制hideWhenBothSwitchOff这个DIV的可见性。
  7. document.addEventListener('DOMContentLoaded', () => { ... });
    • 这个额外的事件监听器确保在页面完全加载后,会立即执行一次状态检查。这对于处理页面初始加载时开关的默认选中状态非常重要,以保证目标DIV的初始可见性是正确的。

完整代码示例

将上述HTML和JavaScript代码整合在一起,您将得到一个功能完整的示例:



    <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><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>

注意事项与总结

  • Bootstrap版本:本教程基于Bootstrap 5.x版本。如果您使用的是旧版本,JavaScript API可能会有所不同。
  • JavaScript加载顺序:确保您的自定义JavaScript代码在Bootstrap的JavaScript文件(bootstrap.bundle.min.js)之后加载,因为bootstrap.Collapse对象需要Bootstrap库的支持。
  • 初始状态处理:在JavaScript代码中,我们特意添加了DOMContentLoaded事件监听器,以确保页面加载时,目标DIV的显示状态能够正确反映初始的开关选中状态。
  • 可扩展性:如果您需要控制更多开关,只需将它们添加到checkboxes数组中即可,无需修改核心逻辑。Array.prototype.some()方法能够优雅地处理任意数量的开关。
  • 可访问性:Bootstrap的Collapse组件本身提供了良好的可访问性支持。当元素隐藏时,aria-expanded属性会自动更新,告知屏幕阅读器该元素的状态。

通过结合Bootstrap的强大组件和灵活的JavaScript,我们可以轻松实现复杂的UI交互逻辑。这种方法不仅功能强大,而且代码结构清晰,易于维护和扩展。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
bootstrap框架介绍
bootstrap框架介绍

本专题整合了bootstrap框架相关介绍,阅读专题下面的文章了解更多详细内容。

2026.03.18

765

21

bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

2026.03.18

199

9

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6284

49

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

3324

5

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

1892

13

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

1892

13

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

2023.09.21

1071

6

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

2024.03.13

1437

13

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

2025.12.04

818

13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.6万人学习