Bootstrap 3.0 - Griglia fluida che include dimensioni di colonna fisse


126

Sto imparando come usare Bootstrap. Attualmente, mi faccio strada tra i layout. Mentre Bootstrap è piuttosto interessante, tutto ciò che vedo sembra datato. Per la mia vita, ho quello che penso sia un layout di base che non riesco a capire. Il mio layout è simile al seguente:

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

Questa griglia deve occupare l'intera altezza della finestra. Da quanto ho capito, ho bisogno di mescolare larghezze fisse e fluide. Tuttavia, Bootstrap 3.0 non sembra più avere la classe fluid. Anche se così fosse, non riesco a capire come mescolare fluidi e dimensioni fisse delle colonne. Qualcuno sa come farlo in Bootstrap 3.0?


Cerca di utilizzare le tabelle accanto a righe e colonne.
kalu,

Ecco un esempio di fluido fisso per Bootstrap 3: codeply.com/go/GN4QinVrjI
Zim

Risposte:


32

Non c'è davvero un modo semplice per mescolare fluide e larghezze fisse con Bootstrap 3. È pensato per essere così, poiché il sistema a griglia è progettato per essere fluido e reattivo. Potresti provare a hackerare qualcosa, ma andrebbe contro ciò che il sistema Responsive Grid sta cercando di fare, con l'intento di far fluire quel layout attraverso diversi tipi di dispositivi.

Se è necessario attenersi a questo layout, prenderei in considerazione la disposizione della pagina con CSS personalizzato e non l'utilizzo della griglia.


5
Immagino che questo genere di cose dovrà aspettare che Flexbox abbia il pieno supporto, ma è ancora davvero zoppo. Il modello di Bootstrap è eccezionale quando il numero di colonne è statico, ma, ad esempio, se puoi nascondere e mostrare dinamicamente le colonne, avere il supporto per almeno una colonna per essere fluido inizia a dare molto più senso.
Nate Bundy,

1
Modifica la tua risposta per includere un riferimento a questo link con la soluzione. Saluti: stackoverflow.com/questions/8740779/…
Morty,

151

modifica: poiché molte persone sembrano voler fare questo, ho scritto una breve guida con un caso d'uso più generale qui https://www.atlascode.com/bootstrap-fixed-width-sidebars/ . Spero che sia d'aiuto.

Il sistema a griglia bootstrap3 supporta l'annidamento delle righe che consente di regolare la riga principale per consentire menu laterali a larghezza fissa.

Devi inserire un'imbottitura a sinistra nella riga principale, quindi avere una riga figlio che contenga i tuoi normali elementi di layout della griglia.

Ecco come faccio di solito questo 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;
}

Questo è carino ma se lo metti all'interno della colonna fissa, ad es. Questo <p> <a class="btn btn-default" href="#" role="button"> Visualizza i dettagli & raquo; </a> </p> o menu a discesa Bootstrap, questi non funzionano nella colonna fissa. C'è qualche soluzione per questo?
Vaclav Elias,

@VaclavElias prova a inserire un diff full-size in esso con position: relative e quindi il menu a discesa? Aiuta se fai un jsfiddle per mostrare il problema
w00t

Devo ancora vedere come funziona in tutti i browser ma per il resto, buon lavoro, ben fatto.
Phil Cooper,

C'è un modo per farlo con le colonne fisse sul lato destro?
Sean,

3
position: fixedsignifica che quando si scorre il contenuto di quella colonna galleggia sopra il resto della pagina. Nel mio caso l'ho risolto usando position: absolute.
Laurent,

26

oppure usa la proprietà display con table-cell;

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
il problema è quando si utilizza ex. `.visible-xs , becouse display: table-cell` diventa display:block...
Dariusz Filipiak

21

Ho avuto un problema leggermente diverso:

  • Avevo bisogno di combinare colonne fisse e fluide come parte di una tabella piuttosto che come parte di un layout a finestra intera
  • Avevo bisogno di avere colonne fissate sia a sinistra che a destra
  • Non ero preoccupato per gli sfondi delle colonne usando l'intera altezza della riga di contenimento

Di conseguenza, ho fatto ricorso a floatper le colonne sinistra e destra, e quindi ho potuto usare Bootstrap rowper fare le colonne fluide in mezzo.

<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
@Schemetrical Non avevo una domanda. Ho spiegato che avevo un problema leggermente diverso e ho aggiunto la soluzione a cui sono venuto per aiutare altre persone che arrivano qui da Google.
Paddy Mann,

1
la tua risposta è preziosa. Abbastanza semplice ma risolvendo il mio problema. Molte grazie.
Charles,

Perché non puoi dare alla div div i margini che il div contenente ha nella tua risposta?
GreenAsJade,

Questa risposta è seriamente legittima. Se devi utilizzare le colonne bootstrap ma non vuoi che si comprimano a determinate larghezze dello schermo, questo è ciò di cui hai bisogno (usa pull-left / pull-right invece di col-md-3, per esempio).
Sam,

Questa sembra un'ottima risposta. Sto avendo dei problemi con me margine paddingnella mia fila nel mezzo, ma questo dovrebbe essere un problema risolvibile. Quali sono le conseguenze non intenzionali di questo approccio?
Vishal,

15

Aggiornato 2018

IMO, il modo migliore per avvicinarsi a questo in Bootstrap 3 sarebbe usare le media query che si allineano con i punti di interruzione di Bootstrap in modo che tu usi solo le colonne a larghezza fissa siano schermi più grandi e quindi lascia che il layout si impili in modo reattivo su schermi più piccoli. In questo modo mantieni la reattività ...

@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

Bootstrap 4 avrà flexbox, quindi layout come questo saranno molto più facili: http://www.codeply.com/go/eAYKvDkiGw


3

OK, la mia risposta è super carina:

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

parco giochi jsfiddle

se vuoi supportare tutto il browser, usa https://github.com/10up/flexibility


1

AGGIORNAMENTO 2014-11-14: La soluzione di seguito è troppo vecchia, consiglio di utilizzare il metodo di layout della scatola flessibile. Ecco una panoramica: http://learnlayout.com/flexbox.html


La mia soluzione

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

Senza modificare troppo il codice del layout bootstrap.


Aggiornamento (non dall'OP): aggiunta dello snippet di codice di seguito per facilitare la comprensione di questa risposta. Ma non sembra funzionare come previsto.


-1 Questa risposta non ha alcun senso per me. Le colonne non si sommano a 12. Le colonne nome e tastiera si sovrappongono. Non capisco come abbia +2 voti.
Mariano Desanze,

-3

Perché non solo impostare le due colonne di sinistra su un fisso con nel proprio CSS e quindi creare un nuovo layout di griglia delle 12 colonne complete per il resto del contenuto?

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

In Bootstrap solo le colonne possono essere figlie immediate delle righe.
Sai Dubbaka,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.