2017-05-19 5 views
0

Ich habe die folgenden Links ... aber es macht mir immer noch nicht helfen ...Flexbox 100% Höhe Ausgabe

how to make nested flexboxes work
Height 100% on flexbox column child
How to make flexbox children 100% height of their parent?

ich eine ganze Seite benötigen, das ist reagieren, wie das folgende Bild: full page Mit Kopf- und Fußzeile und die mittleren 5 Spalten füllen die Höhe gleichmäßig in den verbleibenden Raum, und wenn ich dann Medienabfragen, füllen Sie den Bildschirm des mobilen Geräts wie folgt:

mobile view

Hier ist der Code, den ich bisher habe ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
<style type="text/css"> 
html, 
body { 
    height: 100%; 
    margin: 0 
} 

.box { 
    display: flex; 
    flex-flow: column; 
    height: 100%; 
} 

.box .row { 
    border: 1px dotted grey; 
} 

.box .row.header { 
    flex: 0 1 auto; 
    /* The above is shorthand for: 
    flex-grow: 0, 
    flex-shrink: 1, 
    flex-basis: auto 
    */ 
} 

.box .row.content { 
    flex: 1 1 auto; 
} 

.box .row.footer { 
    flex: 0 1 40px; 
} 

.yellow-back { 
    background: #ffe001; 
} 

.red-back { 
    background: #e31e25; 
} 

.green-back { 
    background: #66af45; 
} 

.purple-back { 
    background: #954294; 
} 

.containerFull         { position: relative; width: 100%; margin: 0 auto; padding: 0;} 
.containerFull .column, 
.containerFull .columns       { float: left; display: inline; margin-left: 0px; margin-right: 0px; } 
.containerFull .one-fifth.column    { width: 20%; } 
</style> 
</head> 

<body> 

<div class="box"> 

    <div class="row header"> 
    <p><b>header</b> 
     <br /> 
     <br />(sized to content)</p> 
    </div> 

    <div class="row content"> 

     <div class="containerFull">  
      <div class="one-fifth column green-back">Here</div> 
      <div class="one-fifth column red-back">Here</div> 
      <div class="one-fifth column">Here</div> 
      <div class="one-fifth column yellow-back">Here</div> 
      <div class="one-fifth column purple-back">Here</div> 
     </div><!-- ContainerFull --> 

    </div> 

    <div class="row footer"> 
    <p><b>footer</b> (fixed height)</p> 
    </div> 
</div> 

</body> 
</html> 

html, 
 
body { 
 
    height: 100%; 
 
    margin: 0 
 
} 
 

 
.box { 
 
    display: flex; 
 
    flex-flow: column; 
 
    height: 100%; 
 
} 
 

 
.box .row { 
 
    border: 1px dotted grey; 
 
} 
 

 
.box .row.header { 
 
    flex: 0 1 auto; 
 
    /* The above is shorthand for: 
 
     flex-grow: 0, 
 
     flex-shrink: 1, 
 
     flex-basis: auto 
 
     */ 
 
} 
 

 
.box .row.content { 
 
    flex: 1 1 auto; 
 
} 
 

 
.box .row.footer { 
 
    flex: 0 1 40px; 
 
} 
 

 
.yellow-back { 
 
    background: #ffe001; 
 
} 
 

 
.red-back { 
 
    background: #e31e25; 
 
} 
 

 
.green-back { 
 
    background: #66af45; 
 
} 
 

 
.purple-back { 
 
    background: #954294; 
 
} 
 

 
.containerFull { 
 
    position: relative; 
 
    width: 100%; 
 
    margin: 0 auto; 
 
    padding: 0; 
 
} 
 

 
.containerFull .column, 
 
.containerFull .columns { 
 
    float: left; 
 
    display: inline; 
 
    margin-left: 0px; 
 
    margin-right: 0px; 
 
} 
 

 
.containerFull .one-fifth.column { 
 
    width: 20%; 
 
}
<div class="box"> 
 

 
    <div class="row header"> 
 
    <p><b>header</b> 
 
     <br /> 
 
     <br />(sized to content)</p> 
 
    </div> 
 

 
    <div class="row content"> 
 

 
    <div class="containerFull"> 
 
     <div class="one-fifth column green-back">Here</div> 
 
     <div class="one-fifth column red-back">Here</div> 
 
     <div class="one-fifth column">Here</div> 
 
     <div class="one-fifth column yellow-back">Here</div> 
 
     <div class="one-fifth column purple-back">Here</div> 
 
    </div> 
 
    <!-- ContainerFull --> 
 

 
    </div> 
 

 
    <div class="row footer"> 
 
    <p><b>footer</b> (fixed height)</p> 
 
    </div> 
 
</div>

+0

ich hinzufügen, vergessen, dass ich das Hintergrundbild oder Farbe wünschen den Raum zu füllen ... Vielen Dank! –

+0

Vielleicht könnte dieser Beitrag Ihnen helfen. [Der Inhalt in div füllt den verfügbaren Platz nicht, ohne die Höhe anzugeben] (http://stackoverflow.com/questions/43922077/content-within-div-wont-fill-available-space-without-specifying-height/43922584#43922584), Stellen Sie sicher, dass Sie Ihre Körpergröße auf 100vh einstellen, dann ist es einfacher, den Rest Ihrer Inhaltshöhe einzustellen. Verwenden Sie auch eine CSS-Reset-Datei, um seltsame Verhaltensweisen zu vermeiden. –

Antwort

2

Neben Michael Coker Antwort, wenn man den ganzen Weg mit Flexbox gehen, können Sie reduzieren sowohl Ihr Markup und CSS ziemlich viel und dieses erstaunliche Ergebnis.

Ich habe auch das Hintergrundbild und die Medienabfrage, die Sie kommentiert/gefragt haben, hinzugefügt, um zu zeigen, wie einfach das gemacht werden kann.

Einige Notizen in der CSS gemacht. Wenn es um die Kopf- und Fußzeile geht, können Sie ihnen eine Höhe geben, wenn Sie wollen, aber das ist nicht nötig, also habe ich sie weggelassen, damit man sehen kann, wie Flexbox den Inhalt verteilt ... ich wünschte, ich hätte es diese Technik vor 20 Jahren :)

html, body { 
 
    margin: 0; 
 
} 
 
.box { 
 
    display: flex; 
 
    flex-direction: column; 
 
    height: 100vh;   /* instead of using 100% all over, use viewport units once */ 
 
    background-size: cover; 
 
    background: black url(http://lorempixel.com/500/500/nature/4/) no-repeat center; 
 
} 
 
.box .row.content, 
 
.content .one-fifth.column { 
 
    flex: 1;    /* fill the space equal, no matter row or column direction */ 
 
    display: flex; 
 
} 
 

 
.box .row.header, 
 
.box .row.footer { color: white; } 
 
.box .row.content { background: #fff; } 
 
.yellow-back { background: #ffe001; } 
 
.red-back { background: #e31e25; } 
 
.green-back { background: #66af45; } 
 
.purple-back { background: #954294; } 
 

 
@media screen and (max-width: 600px) { 
 
    /* smaller screens */ 
 
    .box .row.content { 
 
    flex-direction: column; /* by simply swap direction it work on smaller screen */ 
 
    } 
 
}
<div class="box"> 
 
    <div class="row header"> 
 
    <p><b>header</b><br /><br />(sized to content)</p> 
 
    </div> 
 

 
    <div class="row content"> 
 
    <div class="one-fifth column green-back">Here</div> 
 
    <div class="one-fifth column red-back">Here</div> 
 
    <div class="one-fifth column">Here</div> 
 
    <div class="one-fifth column yellow-back">Here</div> 
 
    <div class="one-fifth column purple-back">Here</div> 
 
    </div> 
 

 
    <div class="row footer"> 
 
    <p><b>footer</b> (fixed height)</p> 
 
    </div> 
 
</div>

+1

großartige Antwort, weniger Code ist immer besser! –

+0

@lgson Das ist genial und funktioniert wie ein Charme! Jetzt ... brauche ich nur noch das Symbol (PNG) und die Überschrift darunter, um in der Mitte der Flexhöhen-Box zu bleiben, und dann, wenn es sich auf einem mobilen Gerät befindet, muss das Icon nach links und die Überschrift nach rechts verschoben werden des Symbols. Machbar? –

+0

@JPGreeff So meinst du? ... https://jsfiddle.net/00yok8gt/ – LGSon

2

Ich würde den Säulenabschnitt ein flexibles Layout, machen. Sie können .content und .containerFull auf display: flex setzen, dann wird .containerFull "strecken", um die Höhe von .content zu füllen, und dann können Sie flex-basis auf den Spalten verwenden, um die Breite zu steuern.

html, 
 
body { 
 
    height: 100%; 
 
    margin: 0 
 
} 
 

 
.box { 
 
    display: flex; 
 
    flex-flow: column; 
 
    height: 100%; 
 
} 
 

 
.box .row { 
 
    border: 1px dotted grey; 
 
} 
 

 
.box .row.header { 
 
    flex: 0 1 auto; 
 
    /* The above is shorthand for: 
 
    flex-grow: 0, 
 
    flex-shrink: 1, 
 
    flex-basis: auto 
 
    */ 
 
} 
 

 
.box .row.content { 
 
    display: flex; 
 
} 
 

 
.box .row.content { 
 
    flex: 1 1 auto; 
 
} 
 

 
.containerFull { 
 
    display: flex; 
 
} 
 

 
.box .row.footer { 
 
    flex: 0 1 40px; 
 
} 
 

 
.yellow-back { 
 
    background: #ffe001; 
 
} 
 

 
.red-back { 
 
    background: #e31e25; 
 
} 
 

 
.green-back { 
 
    background: #66af45; 
 
} 
 

 
.purple-back { 
 
    background: #954294; 
 
} 
 

 
.containerFull { 
 
    position: relative; 
 
    width: 100%; 
 
    margin: 0 auto; 
 
    padding: 0; 
 
} 
 

 
.containerFull .column, 
 
.containerFull .columns { 
 
    margin-left: 0px; 
 
    margin-right: 0px; 
 
} 
 

 
.containerFull .one-fifth.column { 
 
    flex-basis: 20%; 
 
}
<div class="box"> 
 

 
    <div class="row header"> 
 
    <p><b>header</b> 
 
     <br /> 
 
     <br />(sized to content)</p> 
 
    </div> 
 

 
    <div class="row content"> 
 

 
     <div class="containerFull">  
 
      <div class="one-fifth column green-back">Here</div> 
 
      <div class="one-fifth column red-back">Here</div> 
 
      <div class="one-fifth column">Here</div> 
 
      <div class="one-fifth column yellow-back">Here</div> 
 
      <div class="one-fifth column purple-back">Here</div> 
 
     </div><!-- ContainerFull --> 
 

 
    </div> 
 

 
    <div class="row footer"> 
 
    <p><b>footer</b> (fixed height)</p> 
 
    </div> 
 
</div>

+0

Upvoted Yours, ich musste nur eine eigene Antwort posten, da dies eine klassische Frage ist, wo flexbox wirklich sehr gut mit extrem wenig Code und Markup funktioniert :) – LGSon