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?

Node Newbie
fonte
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.

Steve K.
fonte
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;
}
Dean North
fonte
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/

Frankey
fonte
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>
Paddy Mann
fonte
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

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

Dariusz Filipiak
fonte
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.

jfxiao
fonte
-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>
mikeschuld
fonte
No Bootstrap, apenas as colunas podem ser filhos imediatos das linhas.
Sai Dubbaka 21/03/2015