Bootstrap 3.0 - Жидкостная сетка, которая включает в себя фиксированные размеры колонок

Я изучаю, как использовать Bootstrap. В настоящее время я пробираюсь через макеты. Хотя Bootstrap довольно круто, все, что я вижу, кажется датированным. Для жизни меня у меня есть то, что я думаю, это базовый макет, который я не могу понять. Мой макет выглядит следующим образом:

---------------------------------------------------------------------------
|       |       |                                                         |
|       |       |                                                         |
| 240px | 160px | All Remaining Width of the Window                       |
|       |       |                                                         |
|       |       |                                                         |
--------------------------------------------------------------------------|

Эта сетка должна занимать всю высоту окна. По моему мнению, мне нужно смешивать фиксированную и жидкую ширину. Однако у Bootstrap 3.0 больше нет класса жидкости. Даже если бы это было так, я не могу понять, как смешивать жидкости и фиксированные размеры колонок. Кто-нибудь знает, как это сделать в Bootstrap 3.0?

Спасибо

Ответ 1

На самом деле нет простого способа смешать флюид и фиксированную ширину с помощью Bootstrap 3. Это означает, что это так, так как сетчатая система спроектирована как жидкая, отзывчивая вещь. Вы можете попробовать взломать что-то, но это будет противоречить тому, что пытается выполнить система реагирующей сетки, цель которой - сделать этот макет для разных типов устройств.

Если вам нужно придерживаться этого макета, я бы подумал о том, чтобы выложить свою страницу с помощью специального CSS и не использовать сетку.

Ответ 2

edit: Поскольку многие люди, похоже, хотят это сделать, я написал короткий путеводитель с более общим прецедентом здесь https://www.atlascode.com/bootstrap-fixed-width-sidebars/. Надеюсь, что это поможет.

Система сетки bootstrap3 поддерживает вложенность строк, которая позволяет вам отрегулировать корневую строку, чтобы разрешить меню с фиксированной шириной.

Вам нужно добавить в корневую строку padding-left, затем иметь дочернюю строку, содержащую ваши обычные элементы макета сетки.

Вот как я обычно это делаю http://jsfiddle.net/u9gjjebj/

HTML

<div class="container">
    <div class="row">
        <div class="col-fixed-240">Fixed 240px</div>
        <div class="col-fixed-160">Fixed 160px</div>
        <div class="col-md-12 col-offset-400">
            <div class="row">
            Standard grid system content here
            </div>
        </div>
    </div>
</div>

CSS

.col-fixed-240{
    width:240px;
    background:red;
    position:fixed;
    height:100%;
    z-index:1;
}

.col-fixed-160{
    margin-left:240px;
    width:160px;
    background:blue;
    position:fixed;
    height:100%;
    z-index:1;
}

.col-offset-400{
    padding-left:415px;
    z-index:0;
}

Ответ 3

или использовать свойство display с табличной ячейкой;

CSS

.table-layout {
    display:table;
    width:100%;
}
.table-layout .table-cell {
    display:table-cell;
    border:solid 1px #ccc;
}

.fixed-width-200 {
    width:200px;
}

HTML

<div class="table-layout">
    <div class="table-cell fixed-width-200">
        <p>fixed width div</p>
    </div>
    <div class="table-cell">
        <p>fluid width div</p>    
    </div>
</div>

http://jsfiddle.net/DnGDz/

Ответ 4

У меня была немного другая проблема:

  • Мне нужно было объединить фиксированные и текучие столбцы как часть таблицы, а не как часть полноэкранного макета
  • Мне нужно было иметь столбцы, фиксированные как слева, так и справа.
  • Я не беспокоился о фоновых столбцах, используя полную высоту содержащейся строки

В результате я прибегал к float для левого и правого столбцов, а затем использовал Bootstrap row для промежуточных столбцов.

<div>
    <div class="pull-left" style="width:240px">Fixed 240px</div>
    <div class="pull-right" style="width:120px">Fixed 120px</div>
    <div style="margin-left:240px;margin-right:120px">
        <div class="row" style="margin:0px">
            Standard grid system content here
        </div>
    </div>
</div>

Ответ 5

IMO, лучший способ приблизиться к этому в Bootstrap 3 будет использовать медиа-запросы, которые согласуются с точками останова Bootstrap, так что вы используете только столбцы с фиксированной шириной - это большие экраны, а затем пусть макет будет реагировать на меньшие экраны. Таким образом, вы сохраняете отзывчивость...

@media (min-width:768px) {
  #sidebar {
      width: inherit;
      min-width: 240px;
      max-width: 240px;
      min-height: 100%;
      position:relative;
  }
  #sidebar2 {
      min-width: 160px;
      max-width: 160px;
      min-height: 100%;
      position:relative;
  }
  #main {
      width:calc(100% - 400px);
  }
}

Рабочий бутстрап Фиксированная жидкость Демо

UPDATE: поскольку Bootstrap 4 будет иметь flexbox макеты, подобные этому, будет намного проще: http://www.codeply.com/go/eAYKvDkiGw

Ответ 6

ОБНОВЛЕНИЕ 2014-11-14: Нижеприведенное решение слишком старое, я рекомендую использовать метод компоновки гибкой коробки. Вот обзор: http://learnlayout.com/flexbox.html


Мое решение

HTML

<li class="grid-list-header row-cw row-cw-msg-list ...">
  <div class="col-md-1 col-cw col-cw-name">
  <div class="col-md-1 col-cw col-cw-keyword">
  <div class="col-md-1 col-cw col-cw-reply">
  <div class="col-md-1 col-cw col-cw-action">
</li>

<li class="grid-list-item row-cw row-cw-msg-list ...">
  <div class="col-md-1 col-cw col-cw-name">
  <div class="col-md-1 col-cw col-cw-keyword">
  <div class="col-md-1 col-cw col-cw-reply">
  <div class="col-md-1 col-cw col-cw-action">
</li>

СКС

.row-cw {
  position: relative;
}

.col-cw {
  position: absolute;
  top: 0;
}


.ir-msg-list {

  $col-reply-width: 140px;
  $col-action-width: 130px;

  .row-cw-msg-list {
    padding-right: $col-reply-width + $col-action-width;
  }

  .col-cw-name {
    width: 50%;
  }

  .col-cw-keyword {
    width: 50%;
  }

  .col-cw-reply {
    width: $col-reply-width;
    right: $col-action-width;
  }

  .col-cw-action {
    width: $col-action-width;
    right: 0;
  }
}

Не изменяйте слишком большой код макета начальной загрузки.


Обновить (не от OP): добавление фрагмента кода ниже, чтобы облегчить понимание этого ответа. Но он работает не так, как ожидалось.

ul {
  list-style: none;
}
.row-cw {
  position: relative;
  height: 20px;
}
.col-cw {
  position: absolute;
  top: 0;
  background-color: rgba(150, 150, 150, .5);
}
.row-cw-msg-list {
  padding-right: 270px;
}
.col-cw-name {
  width: 50%;
  background-color: rgba(150, 0, 0, .5);
}
.col-cw-keyword {
  width: 50%;
  background-color: rgba(0, 150, 0, .5);
}
.col-cw-reply {
  width: 140px;
  right: 130px;
  background-color: rgba(0, 0, 150, .5);
}
.col-cw-action {
  width: 130px;
  right: 0;
  background-color: rgba(150, 150, 0, .5);
}
<ul class="ir-msg-list">
  <li class="grid-list-header row-cw row-cw-msg-list">
    <div class="col-md-1 col-cw col-cw-name">name</div>
    <div class="col-md-1 col-cw col-cw-keyword">keyword</div>
    <div class="col-md-1 col-cw col-cw-reply">reply</div>
    <div class="col-md-1 col-cw col-cw-action">action</div>
  </li>

  <li class="grid-list-item row-cw row-cw-msg-list">
    <div class="col-md-1 col-cw col-cw-name">name</div>
    <div class="col-md-1 col-cw col-cw-keyword">keyword</div>
    <div class="col-md-1 col-cw col-cw-reply">reply</div>
    <div class="col-md-1 col-cw col-cw-action">action</div>
  </li>
</ul>

Ответ 7

Хорошо, мой ответ супер приятный:

<style>
    #wrapper {
        display:flex;    
        width:100%;
        align-content: streach;
        justify-content: space-between;
    }    

    #wrapper div {
        height:100px;
    }

    .static240 {
        flex: 0 0 240px;
    }
    .static160 {
        flex: 0 0 160px;
    }

    .growMax {
        flex-grow: 1;
    }

</style>

<div id="wrapper">
  <div class="static240" style="background:red;" > </div>
  <div class="static160"  style="background: green;" > </div> 
  <div class="growMax"  style="background:yellow;"  ></div>
</div>

игровая площадка jsfiddle

если вы хотите поддерживать браузер, используйте https://github.com/10up/flexibility

Ответ 8

Почему бы просто не установить два левых столбца на фиксированный с помощью собственного css, а затем создать новый макет сетки из всех 12 столбцов для остальной части контента?

<div class="row">
    <div class="fixed-1">Left 1</div>
    <div class="fixed-2">Left 2</div>
    <div class="row">
        <div class="col-md-1"></div>
        <div class="col-md-11"></div>
    </div>
</div>