Бутстрап 3 Динамический сбой Navbar

Я ищу решение проблемы с изменением размера с помощью bootstrap navbar.

В настоящее время navbar может иметь своего рода "перекрывающийся" эффект перед уплотнением. (Я знаю, что это связано с медиа-запросами)

example from bootstraps site

Здесь используются медиа-запросы, чтобы диктовать, когда нужно идти компактно, однако я ищу решение, которое приведет к изменению размера навигатора только тогда, когда между ".navbar-nav" и ".navbar-right" нет места..

Это важно, потому что ".navbar-nav" и ".navbar-right" имеют динамическую ширину. (другими словами, иногда ".navbar-nav" будет содержать от 1 элемента списка до 5 элементов списка. ".navbar-right" аналогичен тому, что это строка текста, которая может быть от 3 до 100 символов длинный или даже длинный.

enter image description here

Ниже приведен пример plunker, где, изменяя размер области предварительного просмотра, вы видите, что происходит непреднамеренное "перекрытие" (поскольку он ожидает выполнения запроса максимальной ширины).

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

Как я могу его уплотнить только тогда, когда ".navbar-nav" и ".navbar-right" не имеют места между собой (например, 5px пространства между собой или что-то подобное)?

(учтите, что для достижения этого недостаточно корректировки точек останова)

Ответ 1

Вы должны добавить пользовательский класс на свой навигатор и изменить стиль при достижении высоты:

<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

Ответ 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');
    }
});

Ответ 3

Невозможно определить CSS для самообучения, поэтому вам нужно переопределить стили для определенной ширины носителя. Кажется, что вы обертываете строку вокруг 910px;

Twitter Bootstrap (3) по умолчанию применяет display:none к .collapse, а затем повторно использует значение display:block, используя медиа-запрос для определения ширины окна просмотра шириной больше или равной 768 пикселей:

/* 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;
    }

Ответ 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 для краха. Там круглая проблема, когда вы применяете Zoom к исследователю. Например, высота навигатора может составлять 53 пикселя, а затем меню рушится. Я предлагаю изменить значение 50 пикселей на 70 пикселей. Поэтому я предлагаю:

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
        }