【问题标题】:Bootstrap 3 Navbar Dynamic CollapseBootstrap 3 导航栏动态折叠
【发布时间】:2013-12-13 10:02:07
【问题描述】:

我正在寻找解决引导程序导航栏调整大小问题的方法。

目前,导航栏在被压缩之前可以具有某种“重叠”效果。 (我知道这是由于媒体查询)

这里使用媒体查询来指示何时压缩,但是我正在寻找一种解决方案,该解决方案仅在 '​​.navbar-nav' 和 '.navbar-right 之间没有剩余空间时才会导致导航栏调整大小'。

这很重要,因为“.navbar-nav”和“.navbar-right”具有动态宽度。 (换句话说,有时 '.navbar-nav' 将包含从 1 个列表项到 5 个列表项的任何位置。'.navbar-right' 的相似之处在于它是一个文本字符串,可以是 3 个字符到可能 100 个字符之间的任何位置很长,甚至更长。

下面是一个笨拙的示例,通过调整预览窗格的大小,您可以看到发生了意外的“重叠”(因为它等待满足最大宽度媒体查询)。

http://plnkr.co/edit/7r5fNX2JyJUuT0PvVPDf?p=preview

只有当 '.navbar-nav' 和 '.navbar-right' 彼此之间没有空间时(例如 .. 彼此之间有 5px 的空间或类似的空间),我怎样才能让它变得紧凑?

(请注意,调整断点是不够的)

【问题讨论】:

  • Javascript 是一个选项?

标签: jquery html css twitter-bootstrap twitter-bootstrap-3


【解决方案1】:

CSS 无法自行检测换行,因此您需要为特定宽度的媒体重新定义样式。您的换行似乎发生在 910 像素左右;

Twitter Bootstrap (3) 默认将display:none 应用于.collapse,然后使用媒体查询重新应用display:block 值以检测大于或等于768px 宽度的视口宽度:

/* beginning at line 4412 in bootstrap.css,  v3.0.2 */  
@media (min-width: 768px) {

    ... /*other declarations ommitted here */

    .navbar-collapse.collapse {
        display: block !important;
        height: auto !important;
        padding-bottom: 0;
        overflow: visible !important;
    }

    ... /*other declarations ommitted here */
}

因此,您可以为您的导航栏使用一些更具体的媒体查询来覆盖它,以获取您需要隐藏它的值范围(768px 和 910px 之间):

@media (min-width: 768px)  and max-width (max-width: 910px){

    #bs-example-navbar-collapse-1{

        display:none !important;
    }

【讨论】:

  • 有一个更简单的答案。有几个地方 min-width:768px 接管了 BS3 菜单,包括小条,因此您可以使用 less 并编辑 variables.less 文件或使用定制器并粘贴您想要切换的任何宽度到切换开关。
  • 但这将重新定义每种可能用法的行为。我通常建议不要编辑库 CSS (LESS) 文件本身,因为它会在升级到新版本时带来麻烦,以及跟踪您所做的更改(源代码是数千行代码)
  • 我现在明白了。永远不要使用定制器,只是认为那会是最快的。导航栏的断点应与 IMO 分开。
  • 这不是媒体查询的问题,正如船长两次提到的那样。我认为您将需要 javascript 来进行调整,
【解决方案2】:

可能值得一试 jQuery:

$(document).ready(function() {
    var width_full = $('.navbar-collapse').innerWidth();
    var width_left = $('.navbar-nav').outerWidth(true);
    var width_right = $('.navbar-right').outerWidth(true);
    if (width_full - (width_left + width_right) < 0)
    {
        // trigger collapse, you have to figure out what css changes
        // exactly are needed, for example:
        $('.navbar-toggle').css('display', 'inline');
    }
});

【讨论】:

  • 哦,抱歉……显然它必须是 = 0,现在改了。
  • 是的,如果菜单项是动态的并且你真的希望调整大小是动态的,那么这个 jQuery 示例可能是最简单的解决方案
【解决方案3】:

您应该在导航栏上添加一个自定义类,并在它获得高度时更改样式:

<nav id="autocollapse" class="navbar navbar-default" role="navigation">
    ...
</nav>
function autocollapse() {
    var navbar = $('#autocollapse');
    navbar.removeClass('collapsed'); // set standart view
    if(navbar.innerHeight() > 50) // check if we've got 2 lines
        navbar.addClass('collapsed'); // force collapse mode
}

$(document).on('ready', autocollapse);
$(window).on('resize', autocollapse);
#autocollapse.collapsed .navbar-header {
    float: none;
}
#autocollapse.collapsed .navbar-toggle {
    display: block;
}
#autocollapse.collapsed .navbar-collapse {
    border-top: 1px solid transparent;
    box-shadow: inset 0 1px 0 rgba(255,255,255,0.1);
}
#autocollapse.collapsed .navbar-collapse.collapse {
    display: none!important;
}
#autocollapse.collapsed .navbar-nav {
    float: none!important;
    margin: 7.5px -15px;
}
#autocollapse.collapsed .navbar-nav>li {
    float: none;
}
#autocollapse.collapsed .navbar-nav>li>a {
    padding-top: 10px;
    padding-bottom: 10px;
}

Bootply
Forked Plunker

【讨论】:

  • 简单明了!谢谢大佬!
  • 快速和....我会说有点脏。好吧,我猜导航栏的预期高度 50px 不会经常改变,但为了完善它,我会与菜单元素的高度而不是硬编码的 50px 进行比较。 :)
  • @burebistaruler 它仍然适用于 BT 3.1.1:Bootply。您可能还有另一个问题。
  • @zessx 您的示例仅适用于 chrome 浏览器、firefox 和 ie10 无法正常工作:|
  • 当我在谷歌浏览器中尝试上面 bootply(120904) 的链接时,我将窗口变小以使其折叠,当我单击以获取菜单时,它再次消失。所以它不起作用,因为您无法选择菜单项。在 Ipad 中的行为相同,而不是在 Iphone 上。知道有什么问题吗?
【解决方案4】:

对于引导程序 3.3.5,zessx 答案缺少某些样式。改用这些:

    #autocollapse.collapsed .navbar-header {
        float: none;
    }
    #autocollapse.collapsed .navbar-left,.navbar-right {
        float: none !important;
    }
    #autocollapse.collapsed .navbar-toggle {
        display: block;
    }       
    #autocollapse.collapsed .navbar-fixed-top {
        top: 0;
        border-width: 0 0 1px;
    }       
    #autocollapse.collapsed .navbar-collapse.collapse {
        display: none!important;
    }
    #autocollapse.collapsed .navbar-nav {
        float: none!important;
        margin-top: 7.5px;
    }
    #autocollapse.collapsed .navbar-nav>li {
        float: none;
    }
    #autocollapse.collapsed .navbar-nav>li>a {
        padding-top: 10px;
        padding-bottom: 10px;
    }
    #autocollapse.collapsed .collapse.in{
        display:block !important;
    }

还有一件事。 zessx 使用 50px 进行折叠。当您将缩放应用到资源管理器时,会出现一个圆形问题。例如,导航高度可以是 53 像素,然后菜单将折叠。我建议将 50px 值更改为 70px。所以这是我的建议:

function autocollapse() {
            var navbar = $('#autocollapse');
            navbar.removeClass('collapsed'); // set standart view
            if (navbar.innerHeight() > 70) // check if we've got 2 lines
                navbar.addClass('collapsed'); // force collapse mode
        }

【讨论】:

    猜你喜欢
    • 2017-06-06
    • 2020-08-16
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2013-12-07
    • 2015-07-06
    • 2014-05-09
    相关资源
    最近更新 更多