具有多个数据目标的 Bootstrap v3 导航栏切换不会切换类“折叠”

Posted

技术标签:

【中文标题】具有多个数据目标的 Bootstrap v3 导航栏切换不会切换类“折叠”【英文标题】:Bootstrap v3 Navbar-toggle with multiple data-targets don't toggle class "collapsed" 【发布时间】:2017-09-01 08:09:27 【问题描述】:

data-target 属性接受多个 CSS 选择器来应用折叠。如果只使用一个选择器,则 navbar-toggle 的“collapsed”类将通过 uncollapsing 进行切换。但如果使用多个选择器,则此行为不起作用。在这种情况下,类“collapsed”总是存在的。但我需要在导航栏切换中更改“折叠”类。

如果有人能帮忙就好了。

<div id="mainNav">
<nav class="navbar navbar-inverse">
    <div class="navbar-header">
        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar, #userPanel" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar top-bar"></span>
            <span class="icon-bar middle-bar"></span>
            <span class="icon-bar bottom-bar"></span>
        </button>
    </div>

    <div id="navbar" class="navbar-collapse collapse">
        <ul class="nav navbar-nav">
            <li class="active">
                <a href="#">
                    <span class="navicon glyphicon glyphicon-th" aria-hidden="true"></span>
                    <span class="navtext">Dashboard</span>
                </a>
            </li>
            <li>
                <a href="#">
                    <span class="navicon glyphicon glyphicon-fire" aria-hidden="true"></span>
                    <span class="navtext">About</span>
                </a>
            </li>
        </ul>
    </div>
</nav>
</div>

<div id="userPanel" class="navbar-collapse collapse">
<ul>
    <li>Max Muster | 101945</li>
    <li><a href="#"><span class="glyphicon glyphicon-off" aria-hidden="true"></span> Logout</a></li>
</ul>

【问题讨论】:

您可以使用class 并分配相同的class 然后data-target="same_class" 我已经试过了。折叠适用于两个目标,但导航栏切换中的“折叠”类不会在折叠/取消折叠时切换。看来这仅适用于一个 ID 作为数据目标... 【参考方案1】:

我找到了一个无需重构元素的解决方案:

我使用类选择器(“.navbar-collapse”)作为数据目标,它工作正常,但我在切换按钮时遇到了同样的问题。即未删除“collapsed”类 - 指定多个目标时脚本找不到触发元素。

根据GitHub 上的源代码,他们查找触发器元素如下:

this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
                  '[data-toggle="collapse"][data-target="#' + element.id + '"]')

如果我们在 data-target 属性中使用逗号分隔的元素 ID 列表或类选择器,显然它不会起作用。它将遍历所有元素,但不会找到匹配的触发按钮。幸运的是,我刚刚发现了一个技巧。触发器选择器同时检查 data-targethref 属性(使用 OR 逻辑运算符),因此我们可以通过向切换按钮添加 href 属性来欺骗它,指向现有 ID 之一( #navbar#userPanel)在我的示例代码中我使用了第一个:

所以没有重组的解决方案是:

<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse" href="#navbar" aria-expanded="false" aria-controls="navbar,userPanel">
    ...
</button>

仅更改触发按钮的属性,其余代码保持不变。

【讨论】:

【参考方案2】:

使用id 将两者包装在一个 div 中,并使用class 作为给定代码的两个数据尝试使用 data-parent 折叠两者,让我知道它是否适合您,

<div id="wraper"> 
   <div id="mainNav">
      <nav class="navbar navbar-inverse">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-parent="#wraper" data-target=".navbar_collapsed_data" aria-expanded="false" aria-controls="navbar">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar top-bar"></span>
                <span class="icon-bar middle-bar"></span>
                <span class="icon-bar bottom-bar"></span>
            </button>
        </div>

        <div class="navbar_collapsed_data navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li class="active">
                    <a href="#">
                        <span class="navicon glyphicon glyphicon-th" aria-hidden="true"></span>
                        <span class="navtext">Dashboard</span>
                    </a>
                </li>
                <li>
                    <a href="#">
                        <span class="navicon glyphicon glyphicon-fire" aria-hidden="true"></span>
                        <span class="navtext">About</span>
                    </a>
                </li>
            </ul>
        </div>
      </nav>
    </div>

<div class="navbar_collapsed_data navbar-collapse collapse">
    <ul>
        <li>Max Muster | 101945</li>
        <li><a href="#"><span class="glyphicon glyphicon-off" aria-hidden="true"></span> Logout</a></li>
    </ul>
  </div>

【讨论】:

折叠工作,但导航栏切换中的“折叠”类不会在折叠/取消折叠时切换。【参考方案3】:

现在我做了一个小的重组并将折叠元素包装在一个容器中。就我而言,它有效:

<nav class="navbar navbar-inverse">
   <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-target="#collapseArea" data-toggle="collapse" aria-expanded="false" aria-controls="navbar">
       ...
      </button>
   </div>

   <div id="collapseArea" class="navbar-collapse collapse">
       <ul id="mainNav" class="nav navbar-nav">
          <li>...</li>
          <li>...</li>
       </ul>

       <div id="userPanel">
           <ul>
               <li>...</li>
               <li>...</li>
           </ul>
       </div>
   </div>
</nav>

【讨论】:

以上是关于具有多个数据目标的 Bootstrap v3 导航栏切换不会切换类“折叠”的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap 4打开多个导航栏下拉菜单,无需切换

Bootstrap - 具有相同结构的导航栏和页脚

四十五使用bootstrap制作导航条

如何使用 Twitter Bootstrap v3.0 构建两列流体布局

Bootstrap 3.0 导航栏中的多个折叠按钮

跨多个模板将项目添加到 Bootstrap 导航栏