【问题标题】:Setting height back to 0 after toggling a class切换班级后将高度设置回0
【发布时间】:2014-01-22 02:30:24
【问题描述】:

我有以下 HTML 和 JS。当您单击.slidedown-toggle 时,它会在其父级 (.slidedown) 上切换类“打开”并将高度应用于其兄弟级 (.nav-sub)。这是有效的,但是当“开放”类不存在时,将高度设置回 0 是无效的。我错过了什么?

HTML

<li class="slidedown">
  <a href="#">Parent Link</a>
  <!-- Dropdown arrow -->
  <span class="slidedown-toggle">
    <span class="caret"></span>
  </span>
  <!-- Submenu -->
  <ul class="nav nav-sub">
    <li>
      <a href="#">Child Menu Item 1</a>
    </li>
  </ul>
</li>

JS

$(function navCollapse(){

  var slidedownToggle = $( '#global-nav .slidedown-toggle' );

  slidedownToggle.click( function() {
    var slidedown = $(this).parent( '.slidedown' );
    var navOpen = $( '#global-nav li.open' );
    var subnav = $(this).siblings( '.nav-sub' );
    var subnavHeight = subnav.height();

    slidedown.toggleClass( 'open' );

    if (navOpen){
      subnav.height( subnavHeight );
    }else{
      subnav.height( 0 );
    }

  });

});

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    $( '#global-nav li.open' ) 将返回一个 jQuery 对象,该对象将始终为真,您需要检查当前切换元素所属的 li 是否打开了该类。

    您可以使用 .closest() 查找 li 元素,然后使用 .hasClass() 检查该类是否存在

    $(function navCollapse() {
    
        var slidedownToggle = $('#global-nav .slidedown-toggle');
    
        slidedownToggle.click(function () {
            var slidedown = $(this).parent('.slidedown');
            var $li = $(this).closest('li');
            var subnav = $(this).siblings('.nav-sub');
            var subnavHeight = subnav.height();
    
            slidedown.toggleClass('open');
    
            if ($li.hasClass('open')) {
                subnav.height(0);
            } else {
                subnav.height(subnavHeight);
            }
    
        });
    
    });
    

    【讨论】:

    • 谢谢。我刚刚意识到:a)如果我将 CSS 中的高度设置为 0,那么此脚本会将高度计算为 0。b)脚本在第二次单击时将高度设置为 0 后,它只会将其计算为0 从此开始。也许回到绘图板。
    【解决方案2】:

    LIVE DEMO

      var $gNav = ('#global-nav');
    
      $('.slidedown-toggle', $gNav).click( function( e ) { 
    
        var myLI = $(this).closest('.slidedown');
        var isON = myLI.hasClass('open');
    
        // ALL
        $('li.open', $gNav).removeClass('open').find('.nav-sub').slideUp();
    
        // THIS
        myLI.toggleClass('open', !isON).find('.nav-sub').stop().slideToggle();  
    
      });
    

    【讨论】:

    • 问的不是这个问题吗?我不想通过 JS 做任何动画,这就是我计算高度的原因。
    • @davidpauljunior 身高是多少? subnav = $(this).siblings( '.nav-sub' );你所有的.subnav elements?干什么用的?
    • 我想要“.nav-sub”的高度,它是被点击的向下滑动切换的兄弟。我想要这样,所以我可以用 CSS 转换它。我的后备是使用最大高度,但我不想猜测最长列表的最大高度。
    • 但我刚刚意识到为什么这不起作用,因为使用 JS 计算高度并在 CSS 中将其设置为 0。回到第一格。
    • @davidpauljunior CSS 是我们在您的问题中遗漏的唯一可能帮助您解决问题的东西。在扩展演示中向我们展示你在做什么可能永远不会迟到
    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2020-05-10
    • 2018-06-07
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多