Come posso fare in modo che il mio layout flexbox occupi il 100% di spazio verticale?


102

Come faccio a sapere che una riga di layout flexbox consuma lo spazio verticale rimanente in una finestra del browser?

Ho un layout flexbox a 3 file. Le prime due righe sono ad altezza fissa, ma la terza è dinamica e vorrei che raggiungesse l'altezza completa del browser.

inserisci qui la descrizione dell'immagine

Ho un altro flexbox nella riga 3 che crea un insieme di colonne. Per regolare correttamente gli elementi all'interno di queste colonne, ho bisogno che comprendano l'altezza completa del browser, per cose come il colore di sfondo e gli allineamenti degli elementi alla base. Il layout principale alla fine sarebbe simile a questo:

inserisci qui la descrizione dell'immagine

.vwrapper {
    display: flex;
    flex-direction: column;
    flex-wrap: nowrap;
    justify-content: flex-start;
    align-items: stretch;
    align-content: stretch;
    //height: 1000px;
}
.vwrapper #row1 {
    background-color: red;
}
.vwrapper #row2 {
    background-color: blue;
}
.vwrapper #row3 {
    background-color: green;
    flex 1 1 auto;
    display: flex;
}
.vwrapper #row3 #col1 {
    background-color: yellow;
    flex 0 0 240px;
}
.vwrapper #row3 #col2 {
    background-color: orange;
    flex 1 1;
}
.vwrapper #row3 #col3 {
    background-color: purple;
    flex 0 0 240px;
}
<body>
    <div class="vwrapper">
        <div id="row1">
            this is the header
        </div>
        <div id="row2">
            this is the second line
        </div>
        <div id="row3">
            <div id="col1">
                col1
            </div>
            <div id="col2">
                col2
            </div>
            <div id="col3">
                col3
            </div>
        </div>
    </div>
</body>

Ho provato ad aggiungere un heightattributo, che funziona quando l'ho impostato su un numero rigido ma non quando l'ho impostato su 100%. Capisco che height: 100%non funziona, perché il contenuto non riempie la finestra del browser, ma posso replicare l'idea utilizzando il layout flexbox?


2
Voto positivo per le immagini, come le hai create?
Jonathan

2
OmniGraffle e Pixelmator per i ritocchi.
Evil Closet Monkey

Risposte:


115

È necessario impostare heightdi html, body, .wrappera 100%(al fine di ereditare tutta altezza) e poi basta impostare un flexmaggior valore rispetto 1a .row3e non sugli altri.

.wrapper, html, body {
    height: 100%;
    margin: 0;
}
.wrapper {
    display: flex;
    flex-direction: column;
}
#row1 {
    background-color: red;
}
#row2 {
    background-color: blue;
}
#row3 {
    background-color: green;
    flex:2;
    display: flex;
}
#col1 {
    background-color: yellow;
    flex: 0 0 240px;
    min-height: 100%;/* chrome needed it a question time , not anymore */
}
#col2 {
    background-color: orange;
    flex: 1 1;
    min-height: 100%;/* chrome needed it a question time , not anymore */
}
#col3 {
    background-color: purple;
    flex: 0 0 240px;
    min-height: 100%;/* chrome needed it a question time , not anymore */
}
<div class="wrapper">
    <div id="row1">this is the header</div>
    <div id="row2">this is the second line</div>
    <div id="row3">
        <div id="col1">col1</div>
        <div id="col2">col2</div>
        <div id="col3">col3</div>
    </div>
</div>

DEMO


Qualche modo per farlo mentre i div di contenuto si espandono per riempire i loro contenuti? Hai biforcato il tuo esempio qui .
iameli

@iameli, usa min-height per chrome invece di height fiddle.jshell.net/Lhhh3wde/1
G-Cyrillus

2
Il JSFiddle è rotto
Joel Peltonen

Ecco il lavoro demo codepen: codepen.io/mprinc/pen/JjGQvae e spiegazione nella domanda simile: stackoverflow.com/a/63174085/257561
mPrinC

violino sostituito da un codepen che non dovrebbe svanire, è una copia dello snippet. Nota che l'altezza minima non è più necessaria nella versione cromata odierna.
G-Cyrillus il

18

imposta il wrapper all'altezza del 100%

.vwrapper {
  display: flex;
  flex-direction: column;

  flex-wrap: nowrap;
  justify-content: flex-start;
  align-items: stretch;
  align-content: stretch;

  height: 100%;
}

e imposta la 3a fila su flex-grow

#row3 {
   background-color: green;
   flex: 1 1 auto;
   display: flex;
}

demo


3
Nel mio caso html, body, .wrapper {height: 100%; } sta lavorando. non solo lavorazione del wrapper.
gnganapath

1

Lascia che ti mostri un altro modo che funziona al 100%. Aggiungerò anche un po 'di imbottitura per l'esempio.

<div class = "container">
  <div class = "flex-pad-x">
    <div class = "flex-pad-y">
      <div class = "flex-pad-y">
        <div class = "flex-grow-y">
         Content Centered
        </div>
      </div>
    </div>
  </div>
</div>

.container {
  position: fixed;
  top: 0px;
  left: 0px;
  bottom: 0px;
  right: 0px;
  width: 100%;
  height: 100%;
}

  .flex-pad-x {
    padding: 0px 20px;
    height: 100%;
    display: flex;
  }

  .flex-pad-y {
    padding: 20px 0px;
    width: 100%;
    display: flex;
    flex-direction: column;
  }

  .flex-grow-y {
    flex-grow: 1;
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
   }

Come puoi vedere, possiamo ottenere questo risultato con alcuni wrapper per il controllo mentre utilizziamo l'attributo flex-grow e flex-direction.

1: Quando il genitore "flex-direction" è una "riga", il suo figlio "flex-grow" funziona orizzontalmente. 2: Quando il genitore "flex-direction" è "colonne", il suo figlio "flex-grow" lavora verticalmente.

Spero che questo ti aiuti

Daniel


1
diveccessivo.
Giovanni

Puoi rimuovere uno dei tuoi flex-pad-y:)
Eoin

1
Bello..! Questo è l'unico esempio che è riuscito a far sì che il mio "contenuto" <div> (tra la mia intestazione e il mio piè di pagina) occupi l'intera altezza dello schermo. Tutti gli altri esempi sembrano ignorare l'attributo "altezza: 100%".
Mike Gledhill,

È una soluzione interessante. So che John dice sopra DIV eccessivo, ma non sono d'accordo. Hai bisogno dei quattro div per utilizzare il flex crescere sia orizzontalmente che verticalmente (verticalmente è stato quello importante!). Sono contento di aver potuto aiutare! Avere i quattro DIV ti dà molta flessibilità. Una volta che inizi a provare a rimuovere DIV, quella flessibilità inizia a svanire!
GaddMaster,
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.