javascript - Bootstrap 导航栏在调整大小时隐藏菜单元素

标签 javascript html css bootstrap-4

我有包含许多元素的标准 bootstrap 菜单,当我更改屏幕大小时,我想将这些菜单元素移动到堆栈(其中有 3 行按钮)按钮中。

  <nav class="navbar navbar-expand-md navbar-dark bg-dark mb-4">
  <a class="navbar-brand" href="#">Top navbar</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarCollapse">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">Link</a>
      </li>
      <li class="nav-item">
        <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
      </li>
    </ul>
    <form class="form-inline mt-2 mt-md-0">
      <input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search">
      <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
    </form>
  </div>
</nav>

有人知道怎么做吗?

最佳答案

响应式 Bootstrap Navbar 只有两种“状态”...

  • 折叠(垂直)
  • 非折叠(水平)

navbar-expand-* 类用于改变两种状态之间的断点。

在您的情况下,您希望保持“非折叠”水平导航栏状态,但根据需要逐渐将导航项移动到折叠菜单。 Bootstrap 4 没有为此提供“开箱即用”的解决方案。

但是,使用 Bootstrap 下拉菜单和一些 jQuery 逻辑,您可以逐步将溢出的导航栏元素移至下拉菜单。这是我为此编写的 jQuery 逻辑:

var autocollapse = function (menu,maxHeight) {
    
    var nav = $(menu);
    var navHeight = nav.innerHeight();
    if (navHeight >= maxHeight) {
        $(menu + ' .dropdown').removeClass('d-none');
        $(".navbar-nav").removeClass('w-auto').addClass("w-100");
        while (navHeight > maxHeight) {
            //  add child to dropdown
            var children = nav.children(menu + ' li:not(:last-child)');
            var count = children.length;
            $(children[count - 1]).prependTo(menu + ' .dropdown-menu');
            navHeight = nav.innerHeight();
        }
        $(".navbar-nav").addClass("w-auto").removeClass('w-100');
    }
    else {
        var collapsed = $(menu + ' .dropdown-menu').children(menu + ' li');
      
        if (collapsed.length===0) {
          $(menu + ' .dropdown').addClass('d-none');
        }
      
        while (navHeight < maxHeight && (nav.children(menu + ' li').length > 0) && collapsed.length > 0) {
            //  remove child from dropdown
            collapsed = $(menu + ' .dropdown-menu').children('li');
            $(collapsed[0]).insertBefore(nav.children(menu + ' li:last-child'));
            navHeight = nav.innerHeight();
        }

        if (navHeight > maxHeight) { 
            autocollapse(menu,maxHeight);
        }
    }
}

演示:https://codeply.com/go/IETSah3bFG

这通过在调整屏幕大小(或加载页面)时检查导航栏的高度来实现。当高度增加时,导航元素已经换行,然后元素被移动到下拉列表中。当没有包装导航元素时,这些元素将从下拉列表中删除。


另见:"Mashable" style navbar

关于javascript - Bootstrap 导航栏在调整大小时隐藏菜单元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54693628/

相关文章:

javascript - JQuery 无法识别的表达式 [href=#undefined]

javascript - JQuery: Accordion 高度样式:填充导致垂直滚动条

html - 如何 "left-center"在 div 中对齐包装的内联 block

html - 如何减少表单水平 Bootstrap 中表单控件之间的空间?

javascript - IE。通过属性 "disabled"<Select> block 滚动条禁用

javascript - 战斗 : hasOwnProperty vs obj. Prop

javascript - highcharts 3d 列 - 显示 "beta axis title"和 "beta axis label"

python - 增加抓取链接的 html/css 中的字体大小(创建 html 文件的 python 代码)

html - 悬停后鼠标移开时反转不透明度动画

javascript - Gulp 任务复制目录中的所有文件,编译所有 SCSS 文件,让其他文件保持不变?