Як змінити поріг згортання навігаційної панелі, використовуючи Twitter-bootstrap-responsive?


94

Я використовую Twitter Bootstrap 2.0.1 у проекті Rails 3.1.2, реалізованому за допомогою bootstrap-sass. Я завантаження обидва bootstrap.cssі ті bootstrap-responsive.cssфайли, а також bootstrap-collapse.jsJavascript.

У мене рідинний макет із панеллю навігації, подібною до прикладу . Це слідує інструкціям на панелі навігації щодо "адаптивних змін" тут . Це чудово працює: якщо сторінка вужча, ніж приблизно 940 пікселів, панель навігації згортається і відображається "кнопка", яку я можу натиснути, щоб розгорнути.

Однак моя панель навігації виглядає приблизно до 550 пікселів в ширину, тобто її не потрібно згортати, якщо екран не дуже вузький.

Як сказати Bootstrap згортати панель навігації, лише якщо екран має ширину менше 550 пікселів?

Зауважте, що в цей момент я не хочу модифікувати інші чуйні способи поведінки, наприклад, складання елементів замість того, щоб відображати їх поруч.


Чудове питання! З інформації, яку ви дали у своєму запитанні, я зміг реалізувати розбірну навігаційну панель, починаючи з нічого. Дякую!
methodMan

Відповіді:


41

Ви шукаєте рядок 239 з bootstrap-responsive.css

@media (max-width: 979px) {...}

Де max-widthзначення викликає адаптивну навігацію. Змініть його на 550 пікселів або близько того, і він повинен змінити розмір.


12
Дякую. bootstrap-responsive.cssпохований у самоцвіті bootstrap-sass. Так, я міг це відредагувати, але тоді, коли дорогоцінний камінь буде оновлений, мені доведеться це зробити ще раз. Чи є спосіб замінити запит @media, подібний до перевизначення інших елементів CSS?
Mark Berry

Я не можу придумати жодного способу досягти перевизначення без перезавантаження всіх оголошень CSS.
методофакція

Добре, дякую. Я спробував цей підхід, замінивши цей рядок у коді gem, і це як би працює, але я отримую додаткові горизонтальні відступи на панелі навігації нижче ширини 767px, мабуть, через CSS в @media (max-width: 767px)блоці. Здається, мені доведеться зробити більш масштабне перевизначення, як пропонується у відповіді Андреса Іліча.
Марк Беррі

2
Як згадувалось у моєму коментарі до відповіді @Andres Ilich, безпосереднє оновлення вихідного коду здається меншим із двох зол, коли справа стосується ремонтопридатності, тож поки що я прийму це рішення. Я можу жити з 767 пікселів як мінімальний поріг, хоча я міг би, можливо, ще більше зменшити це, створивши спеціальний контейнер для панелі навігації, на який це не вплинуло @media (max-width: 767px). Сподіваємось, Bootstrap (або bootstrap-sass) колись включить засіб для використання змінних для встановлення порогових значень, але я думаю, що для цього потрібна інтерполяція у селекторах медіа .
Mark Berry

1
Точка зупинки навігаційної панелі замінила CSS для Bootstrap 3 - ось робочий приклад для 3.1: bootply.com/120604
Зім,

73

Bootstrap> 2.1 && <3

  • Використовуйте менш версію bootstrap
  • Змініть змінну @navbarCollapseWidth у variables.less
  • Перекомпілювати.

Оновлення 2013: простий спосіб

(THX до Archonic через коментар)

Оновлення 2014: Bootstrap 3.1.1 та 3.2 (вони навіть додали це до документації )

Якщо ви налаштовуєте або перевизначаєте / редагуєте .lessзмінні, ви шукаєте:

//** Point at which the navbar becomes uncollapsed.
@grid-float-breakpoint:     @screen-sm-min;
//** Point at which the navbar begins collapsing.
@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);

6
Ви можете відвідати twitter.github.com/bootstrap/customize.html#variables та змінити ширину та завантажити. Компіляція не потрібна.
Архонік

Текст посилання та кнопки оновлено: getbootstrap.com/customize/#less-variables & "Компіляція та завантаження"
digitalextremist

Це працює і з самоцвітом twitter-bootstrap-rails, якщо ви поміщаєте щось на зразок @navbarCollapseWidth: 600px;boostrap_and_overrides.css.less.
sffc

Здається, це більше не стосується Bootstrap 3. :(
CodingWithSpike

А як щодо Bootstrap 4?
Аарон Франке,

11

Ви можете встановити новий @mediaзапит, щоб скинути елементи навігаційної панелі вниз, як вам подобається. Все, що вам потрібно зробити, це скинути попередній, щоб розмістити ваш новий запит із бажаною шириною краплі. Візьмемо це для прикладу:

CSS

/** Modified Responsive CSS **/

@media (max-width: 979px) {
    .btn-navbar {
        display: none;
    }
    .navbar .nav-collapse {
        clear: none;
    }

    .nav-collapse {
        height: auto;
        overflow: auto;
    }

    .navbar .nav {
        float: left;
        margin: 0 10px 0 0;
    }

    .navbar .brand {
        margin-left: -20px;
        padding: 8px 20px 12px;
    }

    .navbar .dropdown-menu:before, .navbar .dropdown-menu:after {
        display: block;
    }

    .navbar .nav > li > a, .navbar .dropdown-menu a {
        border-radius: 0;
        color: #999999;
        font-weight: normal;
        padding: 10px 10px 11px;
    }

    .navbar .nav > li {
        float: left;
    }

    .navbar .dropdown-menu {
        background-clip: padding-box;
        background-color: #FFFFFF;
        border-color: rgba(0, 0, 0, 0.2);
        border-radius: 0 0 5px 5px;
        border-style: solid;
        border-width: 1px;
        box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
        display: none;
        float: left;
        left: 0;
        list-style: none outside none;
        margin: 0;
        min-width: 160px;
        padding: 4px 0;
        position: absolute;
        top: 100%;
        z-index: 1000;
    }

    .navbar-form, .navbar-search {
        border:none;
        box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1) inset, 0 1px 0 rgba(255, 255, 255, 0.1);
        float: left;
        margin-bottom: 0;
        margin-top:6px;
        padding: 9px 15px;
    }

    .navbar .nav.pull-right {
        float: right;
        margin-left: auto;
    }
}

@media (max-width: 550px) {
    .btn-navbar {
        display: block;
    }
    .navbar .nav-collapse {
        clear: left;
    }

    .nav-collapse {
        height: 0;
        overflow: hidden;
    }

    .navbar .nav {
        float: none;
        margin: 0 0 9px;
    }

    .navbar .brand {
        margin: 0 0 0 -5px;
        padding-left: 10px;
        padding-right: 10px;
    }

    .navbar .dropdown-menu:before, .navbar .dropdown-menu:after {
        display: none;
    }

    .navbar .nav > li > a, .navbar .dropdown-menu a {
        border-radius: 3px 3px 3px 3px;
        color: #999999;
        font-weight: bold;
        padding: 6px 15px;
    }

    .navbar .nav > li {
        float: none;
    }

    .navbar .dropdown-menu {
        background-color: transparent;
        border: medium none;
        border-radius: 0 0 0 0;
        box-shadow: none;
        display: block;
        float: none;
        left: auto;
        margin: 0 15px;
        max-width: none;
        padding: 0;
        position: static;
        top: auto;
    }

    .navbar-form, .navbar-search {
        border-bottom: 1px solid #222222;
        border-top: 1px solid #222222;
        box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1) inset, 0 1px 0 rgba(255, 255, 255, 0.1);
        float: none;
        margin: 9px 0;
        padding: 9px 15px;
    }

    .navbar .nav.pull-right {
        float: none;
        margin-left: 0;
    }

}

У наступному коді ви можете побачити, як я включив оригінальний @mediaзапит, який обробляє падіння перед 979pxпозначкою, і новий запит для підтримки бажаної точки скидання 550px. Я змінив оригінальний запит безпосередньо з реагуючого на завантажувальний файл css, щоб скинути всі стилі, застосовані до цього конкретного запиту для елементів навігаційної панелі, і переніс їх у новий запит, який замість цього містить потрібну вам точку скидання. Таким чином, ми можемо замінювати всі стилі від початкового запиту до нового запиту, не возившись у таблиці стилів, що реагує на завантаження, таким чином значення за замовчуванням все ще застосовуватимуться до інших елементів у вашому документі.

Ось коротка демонстраційна версія із медіа-запитом, встановленим 550pxяк вам потрібно: http://jsfiddle.net/wU8MW/

Примітка: Я розмістив зазначені вище модифіковані @mediaзапити нижче під фреймом css, оскільки новий модифікований css повинен бути завантажений першим, ніж адаптивний css.


Дякуємо за детальну відповідь. Здається, це працює - я все ще намагаюся зрозуміти, як. Якщо я вас правильно розумію, ви (1) клонували початковий @media (max-width: 979px)запит, щоб зробити новий @media (max-width: 550px)запит. Тоді (2) ви вручну закодували новий запит 979px, щоб замінити ефекти запиту 979px в основному bootstrap-responsive.css? Послідовність тегів у вашому CSS, здається, не відповідає послідовності в bootstrap-responsive.css, тому мені важко порівнювати їх, щоб побачити, що ви зробили.
Mark Berry

@MarkBerry Ви на правильному шляху. @media (max-width: 550px)Запит я написав не слід початкового @media (max-width: 979px)синтаксису запитів , тому що все , що я зробив швидкий приклад перевизначення його вручну через палій і копіювати / вставити, став ледачим на те, але правильний спосіб зробити це , як ви згадали про вашому другому точка.
Андрес Іліч

1
Що стосується ремонтопридатності, це жорсткий заклик. Я боюся, що такий різновид великої заміни, хоча і забезпечує абсолютний контроль, означатиме багато ручної перевірки після кожного оновлення Bootstrap порівняно з безпосереднім оновленням одного чи двох рядків вихідного коду відповідно до пропозиції @Duopixel. Я частково використовую Bootstrap, тому що я не чувак CSS, тому я думаю, що поки що піду на більш просте рішення.
Mark Berry

6

bootstrap-sass підтримуватиме змінну $ navbarCollapseWidth у наступній версії (2.2.1.0). Ви зможете оновити його, щоб робити саме те, що ви хочете, як тільки ця версія з’явиться!


Будь ласка, поясніть, куди ви помістили цю змінну?
Andy Hayden

До будь-якого імпорту Bootstrap, наприклад@import "bootstrap";
Ешлі


4

Я підозрюю (і сподіваюся) це незабаром буде запроваджено офіційно. Тим часом я просто роблю простий злом css, використовуючи visible-phone на кнопці спадного меню і visible-tablet на другому наборі кнопок, які я розмістив на панелі навігації. Тому раніше це виглядало так:

<div class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a href="<%= root_url %>" class="brand brandtag"></a>
      <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>
      <div class="nav-collapse">
        <ul class="nav">
          <li>Navigation 1</li>
          <li>Navigation 2</li>
          <li>Navigation 3</li>
        </ul>
      </div>
    </div>
  </div>
</div>

А тепер це виглядає так:

<div class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a href="<%= root_url %>" class="brand brandtag"></a>
      <a class="btn btn-navbar visible-phone" data-toggle="collapse" data-target=".nav-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>
      <div class="visible-tablet">
        <ul class="nav">
          <li>Navigation 1</li>
          <li>Navigation 2</li>
          <li>Navigation 3</li>
        </ul>
      </div>
      <div class="nav-collapse">
        <ul class="nav">
          <li>Navigation 1</li>
          <li>Navigation 2</li>
          <li>Navigation 3</li>
        </ul>
      </div>
    </div>
  </div>
</div>

Зверніть увагу, що порядок елементів важливий, інакше можуть виникнути проблеми з елементами, що переходять у наступний рядок


3

Я створив окремий файл SCSS, в якому перераховані всі частинки, які потрібні завантажувальному файлу, таким чином я можу вмикати та вимикати частинки залежно від того, що потрібно нашому сайту. Таким чином, я можу легко перевизначити змінну точки зупинку. Ось що я отримав:

// Core variables and mixins
$grid-float-breakpoint: 991px;
@import "bootstrap/variables";
@import "bootstrap/mixins";

// Reset
@import "bootstrap/normalize";
//@import "bootstrap/print";

// Core CSS
@import "bootstrap/scaffolding";
@import "bootstrap/type";
//@import "bootstrap/code";
@import "bootstrap/grid";
@import "bootstrap/tables";
@import "bootstrap/forms";
@import "bootstrap/buttons";

// Components
@import "bootstrap/component-animations";
@import "bootstrap/glyphicons";
@import "bootstrap/dropdowns";
//@import "bootstrap/button-groups";
//@import "bootstrap/input-groups";
@import "bootstrap/navs";
@import "bootstrap/navbar";
@import "bootstrap/breadcrumbs";
@import "bootstrap/pagination";
@import "bootstrap/pager";
@import "bootstrap/labels";
@import "bootstrap/badges";
//@import "bootstrap/jumbotron";
//@import "bootstrap/thumbnails";
@import "bootstrap/alerts";
//@import "bootstrap/progress-bars";
//@import "bootstrap/media";
//@import "bootstrap/list-group";
@import "bootstrap/panels";
//@import "bootstrap/wells";
@import "bootstrap/close";

// Components w/ JavaScript
@import "bootstrap/modals";
@import "bootstrap/tooltip";
//@import "bootstrap/popovers";
//@import "bootstrap/carousel";

// Utility classes
@import "bootstrap/utilities";
@import "bootstrap/responsive-utilities";

2

Ось мій код (Усі інші рішення показали прикольну смугу прокрутки, коли навігаційна панель опустилася, тому я відредагував код, щоб він цього не зробив). Я не міг розмістити іншу відповідь, тому я зроблю це тут, щоб інші могли знайти. Я використовую рейки для цього з Bootstrap 3.0.

активи / таблиці стилів / фреймворк та перевизначення вставляють це: (Налаштуйте максимальну ширину до будь-якого значення, щоб досягти своєї мети.)

@media (max-width: 2500px) {
.navbar-header {
    float: none;
}
.navbar-toggle {
    display: block;
}
.navbar-collapse {
    border-top: 1px solid transparent;
    box-shadow: inset 0 1px 0 rgba(255,255,255,0.1);
}
.navbar-collapse.collapse {
    display: none!important;
}
.navbar-collapse.collapse.in {
    display: block!important;
}
.navbar-nav {
    float: none!important;
}
.navbar-nav>li {
    float: none;
}
.navbar-nav>li>a {
    padding-top: 10px;
    padding-bottom: 10px;
}

1

Запуск 3.x

використовуючи LESS , ви можете змінити значення, @screen-smallщоб встановити мінімальний розмір

приклад: @screen-small: 600px;

я використовую це, щоб перейти в режим «крихітного пристрою» лише тоді, коли ширина менше 600 пікселів


Чи знаєте ви, як це зробити за допомогою SCSS?
bcackerman

вибачте, я не маю. я думав, що bootstrap був розроблений із використанням LESS, тому вам, можливо, доведеться зробити це .css способом (див. bootstrap 2 відповіді вище)
JasonS

1

Запуск 3.x

використовуючи SASS, ви можете змінити значення $ screen-sm, щоб визначити ваш мінімальний розмір

приклад: $ screen-sm: 600px;

Вам потрібно помістити це значення у файл application.scss перед початком @import "bootstrap";

$screen-sm:600px;
@import "bootstrap";

Менше змінних починається з "@", просто змінивши їх на "$", щоб замінити їх перед імпортом.

Ось список змінних.


Це порушує функціональність
blnc

1

Bootstrap 4.x

Змінити поріг згортання в Bootstrap 4.x можна лише швидко. Є 6 випадків:

  1. Завжди розширюйте, ніколи не згортайте (тобто точка зупинки 0px): <nav class="navbar navbar-expand">...</nav>
  2. Точка зупинки - sm (576px):<nav class="navbar navbar-expand-sm">...</nav>
  3. Точка зупинки - MD (768 пікселів):<nav class="navbar navbar-expand-md">...</nav>
  4. Точка зупинки - LG (992 пікселів):<nav class="navbar navbar-expand-lg">...</nav>
  5. Точка зупинки - xl (1200 пікселів):<nav class="navbar navbar-expand-xl">.../nav>
  6. Завжди руйнуйся, ніколи не розширюй (тобто точка зупинки ∞px). : <nav class="navbar">...</nav>(Просто видаліть navbar-expand-*клас. Спочатку для мобільних пристроїв, як у Bootstrap 4.x)

Похвала цій статті Керол Скеллі, яку я знайшов https://medium.com/wdstack/examples-bootstrap-4-navbar-b3c9dc0edc1a


0

Це чудовий приклад того, де ви могли використовувати МЕНШУ версію файлів CSS Bootstrap. Як це зробити - нижче.

Ще краще було б надіслати це як запит на витяг на Github, щоб усі могли отримати вигоду, і ваш "користувацький код", сподіваємось, буде частиною Bootstrap, що рухається вперед.

  • Додайте змінну, variables.lessяка визначає час згортання панелі навігації. Щось на зразок:@navCollapseWidth: 979px
  • Потім змініть responsive-navbar.less...
    • Вгору зверху змінити @media (max-width: 979px)на@media (max-width: @navCollapseWidth)
    • Унизу змініть @media (min-width: 980px)на@media (max-width: @navCollapseWidth - 1)

Звичайно ... вам доведеться компілювати МЕНШЕ за допомогою одного із запропонованих методів .


Очевидно, Bootstrap 2.0.4 змінив структуру файлів для адаптивних матеріалів. Див. Коментар автора bootstrap-sass @Thomas McDonald. Ще не заглиблювався в це, але це може дозволити легше модифікувати поріг навіть у версії SASS.
Mark Berry

Вибачте; Я повністю пропустив коментар Sass у питанні ... Я просто зосередився на Bootstrap на основі категорії. Однак структура файлів виглядає так само, як і те, що я дивився в Bootstrap ... в будь-якому випадку я оновлю відповідь на це, відповідаючи на запитання.
Джейсон Капріотті,

Не хвилюйтесь. І я цілком згоден з тим, що найкращим рішенням було б, щоб завантажувальний файл власним чином пропонував змінну або серію змінних, яка контролює пороги згортання навігаційної панелі. Я недостатньо досвідчений у CSS, LESS, SASS або медіа-запитах, щоб писати це вдосконалення;).
Mark Berry

0

Поглибивши хакерство Тайлера ще більше, додавши класифікований блок із видимим телефоном та клас прихованого телефону до елемента в основній навігації, що розкладається, ви можете "витягнути" один або два згорнутих елемента для відображення навіть на панелі навігації телефону.

<div class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a href="<%= root_url %>" class="brand brandtag"></a>
      <a class="btn btn-navbar visible-phone" data-toggle="collapse" data-target=".nav-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>
      <div class="visible-tablet">
        <ul class="nav">
          <li>Navigation 1</li>
          <li>Navigation 2</li>
          <li>Navigation 3</li>
        </ul>
      </div>
      <div class="visible-phone">
        <ul class="nav">
          <li>Navigation 1</li>
        </ul>
      </div>
      <div class="nav-collapse">
        <ul class="nav">
          <li class="hidden-phone">Navigation 1</li>
          <li>Navigation 2</li>
          <li>Navigation 3</li>
        </ul>
      </div>
    </div>
  </div>
</div>

0

Просто запишіть цей код у свій власний файл style.css, і він буде працювати

@media (min-width: 768px) and (max-width: 991px) {
        .navbar-collapse.collapse {
            display: none !important;
        }
        .navbar-collapse.collapse.in {
            display: block !important;
        }
        .navbar-header .collapse, .navbar-toggle {
            display:block !important;
        }
        .navbar-header {
            float:none;
        }
        .navbar-nav {
            float: none !important;
            margin: 0px;
        }
        .navbar-nav {
            margin: 7.5px -15px;
        }
        .nav > li {
            position: relative;
            display: block;
        }
        .navbar-nav > li {
            float: none !important;
        }
        .nav > li > a {
            position: relative;
            display: block;
            padding: 10px 15px;
        }
        .navbar-collapse {
            padding-right: 15px;
            padding-left: 15px;
            overflow-x: visible;
            border-top: 1px solid transparent;
            box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.1) inset;
        }
        .nav {
            padding-left: 0px;
            margin-bottom: 0px;
            list-style: outside none none;
        }
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.