Bootstrap 3.0 - Grade de fluido que inclui tamanhos de coluna fixos


126

Estou aprendendo a usar o Bootstrap. Atualmente, estou percorrendo meus layouts. Enquanto o Bootstrap é bem legal, tudo o que vejo parece datado. Para a minha vida, tenho o que penso ser um layout básico que não consigo entender. Meu layout é semelhante ao seguinte:

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

Essa grade precisa ocupar toda a altura da janela. Pelo meu entendimento, preciso misturar larguras fixas e fluidas. No entanto, o Bootstrap 3.0 parece não ter mais a classe fluida. Mesmo assim, parece que não consigo descobrir como misturar tamanhos de coluna fluidos e fixos. Alguém sabe como fazer isso no Bootstrap 3.0?


Examine o uso de tabelas ao lado de linhas e colunas.
— kalu 12/08

Aqui está um exemplo de fluido fixo para o Bootstrap 3: codeply.com/go/GN4QinVrjI
— Zim

Respostas:


32

Não há realmente nenhuma maneira fácil de misturar larguras fluidas e fixas com o Bootstrap 3. É para ser assim, pois o sistema de grade foi projetado para ser uma coisa fluida e responsiva. Você pode tentar hackear alguma coisa, mas isso vai contra o que o sistema de grade responsiva está tentando fazer, cuja intenção é fazer esse layout fluir entre diferentes tipos de dispositivos.

Se você precisa seguir esse layout, considere colocar sua página com CSS personalizado e não usar a grade.


5
Eu acho que esse tipo de coisa terá que esperar o Flexbox ter suporte total, mas ainda é muito ruim. O modelo do Bootstrap é ótimo quando o número de colunas é estático, mas, por exemplo, se você pode ocultar e mostrar dinamicamente colunas, ter suporte para que pelo menos uma coluna seja fluida começa a fazer muito mais sentido.
— Nate Bundy

1
Edite sua resposta para incluir uma referência a este link com a solução. Atenciosamente: stackoverflow.com/questions/8740779/…
— Morty

151

edit: Como muitas pessoas parecem querer fazer isso, escrevi um pequeno guia com um caso de uso mais geral aqui https://www.atlascode.com/bootstrap-fixed-width-sidebars/ . Espero que ajude.

O sistema de grade bootstrap3 suporta aninhamento de linhas, o que permite ajustar a linha raiz para permitir menus laterais com largura fixa.

Você precisa colocar um preenchimento à esquerda na linha raiz e, em seguida, ter uma linha filha que contenha seus elementos normais de layout de grade.

Aqui está como eu costumo fazer isso 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;
}

Essa é boa, mas se você colocar dentro da coluna fixa, por exemplo, <p> <a class="btn btn-default" href="#" role="button"> Exibir detalhes & raquo; </a> </p> ou no menu suspenso Bootstrap, eles não estão funcionando na coluna fixa. Existe alguma correção para isso?
— Vaclav Elias

@VaclavElias tente colocar um diff em tamanho real com a posição: relativa e depois o menu suspenso? Ela ajuda se você fizer um jsFiddle para mostrar o problema
— w00t

Ainda estou para ver como isso funciona em todos os navegadores, mas, caso contrário, bom trabalho, bem feito.
— Phil Cooper

Existe uma maneira de fazer isso com as colunas fixas no lado direito?
— 20515 Sean

3
position: fixedsignifica que, ao rolar o conteúdo dessa coluna, flutua acima do restante da página. No meu caso, eu o consertei usando position: absolute.
— 21716 laurent

26

ou use a propriedade display com célula de tabela;

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/


1
o problema é quando você está usando ex. `.visible-xs , becouse display: table-cell` se torna display:block...
— Dariusz Filipiak

21

Eu tive um problema um pouco diferente:

  • Eu precisava combinar colunas fixas e fluidas como parte de uma tabela e não como parte de um layout de janela inteira
  • Eu precisava ter colunas fixas à esquerda e à direita
  • Eu não estava preocupado com os fundos da coluna usando a altura total da linha que continha

Como resultado, recorri às floatcolunas esquerda e direita e, em seguida, pude usar o Bootstrap rowpara fazer as colunas fluidas no meio.

<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>

4
@ Schmetrical Eu não tenho uma pergunta. Expliquei que tinha um problema um pouco diferente e adicionei a solução que encontrei para ajudar outras pessoas que chegam do Google.
— Paddy Mann

1
sua resposta é inestimável. Muito simples, mas resolvendo meu problema. Muito obrigado.
— Charles

Por que você não pode dar à linha div as margens que a div que contém possui em sua resposta?
— GreenAsJade

Esta resposta é seriamente legítima. Se você precisar utilizar colunas de autoinicialização, mas não quiser que elas ocorram em determinadas larguras de tela, é isso que você precisa (use pull-left / pull-right em vez de col-md-3, por exemplo).
— Sam

Esta parece ser uma ótima resposta. Estou tendo alguns problemas com o meu margine paddingna minha linha no meio, mas isso deve ser um problema solucionável. Quais são as consequências não intencionais de adotar essa abordagem?
— Vishal

15

Atualizado 2018

Na IMO, a melhor maneira de abordar isso no Bootstrap 3 seria usando consultas de mídia alinhadas com os pontos de interrupção do Bootstrap, para que você use apenas as colunas de largura fixa, sejam telas maiores e, em seguida, deixe o layout empilhar responsivamente em telas menores. Dessa forma, você mantém a capacidade de resposta ...

@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);
  }
}

Working Bootstrap Fixed-Fluid Demo

O Bootstrap 4 possui flexbox, portanto, layouts como esse serão muito mais fáceis: http://www.codeply.com/go/eAYKvDkiGw


3

OK, minha resposta é super legal:

<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 playground

se você quiser suporte para todos os navegadores, use https://github.com/10up/flexibility


1

ATUALIZAÇÃO 14/11/2014: A solução abaixo é muito antiga, eu recomendo o uso do método de layout da caixa flexível. Aqui está uma visão geral: http://learnlayout.com/flexbox.html


Minha solução

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>

scss

.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;
  }
}

Sem modificar muito o código do layout de auto-inicialização.


Atualização (não do OP): adicionando o trecho de código abaixo para facilitar o entendimento desta resposta. Mas isso não parece funcionar como esperado.


-1 Esta resposta não faz sentido para mim. As colunas não somam 12. As colunas de nome e teclado se sobrepõem. Não entendo como tem +2 votos.
— Mariano Desanze

-3

Por que não definir as duas colunas da esquerda como fixas em seu próprio CSS e criar um novo layout de grade das 12 colunas completas para o restante do conteúdo?

<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>

No Bootstrap, apenas as colunas podem ser filhos imediatos das linhas.
— Sai Dubbaka 21/03/2015
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.