【问题标题】:Expand/Collapse several blocks at the same time?同时展开/折叠几个块?
【发布时间】:2017-10-02 23:46:47
【问题描述】:

我的页面中有几个块。我使用 bootstrap 4 alpha 6 版本。我想通过单击一个按钮来展开/折叠这些块。知道我使用下一个 js 代码,它只打开所有块但如何关闭它们?!如何解决这个问题?

HTML:

<div class="card">
   <div class="card-header">
      <button id='expand-collapse' type="button" data-parent="#blocks"  data-toggle="collapse" data-target=".block" aria-expanded="false" aria-controls=".block">
      </button>
   </div>

   <div class="card-block">
       <div id="blocks">
          <div class="list-group">

             <div class="list-group-item">
                <a data-toggle="collapse" href="#block-1" aria-expanded="false" aria-controls="block-1"OPEN FIRST</a>
                <div class="collapse block" id="block-1">
                   <!--FIRST BLOCK BLOCK-->
                </div>
             </div>

             <div class="list-group-item">
                <a data-toggle="collapse" href="#block-2" aria-expanded="false" aria-controls="block-2">OPEN SECOND</a>
                <div class="collapse block" id="block-2">
                   <!--SECOND BLOCK-->
                </div>
            </div>

            <div class="list-group-item">
                <a data-toggle="collapse" href="#block-3" aria-expanded="false" aria-controls="block-3">OPEN THIRD</a>
                <div class="collapse block" id="block-3">
                   <!--THIRD BLOCK-->
                </div>
            </div>

         </div>
      </div>
   </div>
</div>

JAVASCRIPT:

$(function() {
  $('#expand-collapse').on('click', function() { // We capture the click event
    var target = $(this).attr('data-target'); // We get teh target element selector
    $(target).each(function() { // Loop through each element
      if ($(this).hasClass('show')) { // Check if it's already visible or not
        $(this).collapse('hide'); // Show and hide accordingly
      } else {
        $(this).collapse('show');
      }

    });
  });
});

$(document).ready(function () {
    $('.collapse')
        .on('shown.bs.collapse', function(event) {
          event.stopPropagation();
            $(this)
                .parent().parent()
                .find(".fa-commenting-o")
                .removeClass("fa-commenting-o")
                .addClass("fa-commenting");
        }).on('hidden.bs.collapse', function(event) {
         event.stopPropagation();
            $(this)
                .parent().parent()
                .find(".fa-commenting")
                .removeClass("fa-commenting")
                .addClass("fa-commenting-o");
        });
});

【问题讨论】:

    标签: javascript jquery html twitter-bootstrap twitter-bootstrap-4


    【解决方案1】:

    添加 else 语句以处理所有其他不符合显示条件的情况。试试这个:

    $(function () {
    
           $('#expand-collapse').on('click',function(){
             $('[data-toggle="collapse"]').each(function(){
                var objectID=$(this).attr('data-target');
                if($(objectID).hasClass('.collapse')===false)
                {
                    $(objectID).collapse('show');
                } else {
                    $(objectID).collapse('hide');
                }
              });
           });
    });
    

    【讨论】:

    • 您好!我尝试了这段代码,但没有关闭所有块。您还有其他想法吗?
    • 我之前也试过这个。没用。有点困惑。
    • 在我的中,删除类似 Sumit 推荐的内容。试试看
    【解决方案2】:

    Bootstrap v4.0.0-alpha.6 版本存在错误,过渡将在下一个版本中解决。

    查看问题 22256 并拉取 21743 链接以获取更多信息。

    【讨论】:

    • 好的,但是如何关闭块?你对此有什么想法吗?
    【解决方案3】:

    由于当时处理崩溃的方式,您使用的代码将在 bootstrap3 中按预期工作(您可以使用 bootstrap V3 的 JS 和 CSS 进行验证)

    为了解决您的问题,以下 sn-p 将按预期工作:

    $(function() {
      $('#expand-collapse').on('click', function() { // We capture the click event
        var target = $(this).attr('data-target'); // We get teh target element selector
        $(target).each(function() { // Loop through each element
          if ($(this).hasClass('show')) { // Check if it's already visible or not
            $(this).collapse('hide'); // Show and hide accordingly
          } else {
            $(this).collapse('show');
          }
    
        });
      });
    });
    

    提示:

    我们也可以将toggle 参数传递给collapse 函数并去掉if-else 条件

    $(this).collapse('toggle');可以用来代替if-else

    但我没有在我的示例中使用它来表明您可以在其中添加额外的计算

    工作Fiddle

    更新: 更新后的问题要求单独控制该块

    为了实现这一点,我们可以使用通过按钮元素触发动作的默认方法。

          <div class="list-group-item">
            <div class="collapse block" id="block-1">
              FIRST BLOCK
            </div>
          </div>
          <button class="btn btn-primary" type="button" data-toggle="collapse" data-target="#block-1">
            Block 1
          </button>
    

    您可以在此处找到更新后的jsFidde

    【讨论】:

    • 我有下一个问题。奇怪的行为。每个块都有自己的按钮来展开/折叠块。这意味着所有 3 个块都有 3 个按钮,可以打开/关闭混凝土块。我也有打开所有块的主按钮。当我打开时,让我们说第一个块,然后单击主按钮打开其他块,然后您的代码关闭第一个块并打开其他块。你对此有什么想法吗?你也可以再看看我的帖子吗?我正在尝试更改主按钮的图标,但它没有用。我不明白为什么它以前工作过。
    • 您好!您是否尝试添加单个按钮。只需尝试添加它们并测试请。您如何看待这种行为?
    • 您好!你到底改变了什么?似乎您只添加了单个按钮。我偷看到那个奇怪的行为。尝试打开第一个块,然后通过主按钮打开其他块。您将看到第一个块关闭和其他块打开。试试吧。
    • @NurzhanNogerbek,这是意料之中的吧?四个按钮中的每一个都应该切换由它控制的块状态。所以主按钮切换三个块的状态,每三个按钮切换相应块的状态
    • 这不对。可以说,如果您打开第一个块,然后尝试通过主按钮打开其他块,则第一个块必须被偷开。我说的。事实上,第一个区块关闭,其他区块打开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 2013-06-06
    • 2012-05-30
    • 2017-02-12
    • 1970-01-01
    相关资源
    最近更新 更多