2017-08-27 3 views
3

Ich habe einen ganzen Tag damit verbracht, diese Arbeit zu machen. Während ich in der Lage bin, eine Flex-Box zu verwenden, wird es ein Problem, wenn eine Flex-Box eine andere Flex-Box enthalten soll.Browser-Unterstützung für Flexbox innerhalb einer anderen Flexbox

Ich habe versucht, die Hinweise von dieser Frage zu folgen: Flexbox inside another flexbox?

es ein wenig geholfen, aber ich bin leider immer noch nicht da.

Was die Sache noch verwirrender macht, ist, dass es scheint, als würden Safari und Chrome dieselbe Seite völlig anders anzeigen. Das macht es noch schwerer zu verstehen, was ich falsch mache.

Was ich versuche zu tun ist, mit einer äußeren Flex-Box mit einem Header und Inhalt. Diese äußere Flexbox muss eine weitere Flex-Box innerhalb des Inhalts haben, wiederum mit Header und Inhalt.

Es sieht so aus, als ob der Tisch, der sich im Inhalt der inneren Flexbox befindet, nicht zur inneren Flexbox gehört.

html { 
 
    height: 100%; 
 
} 
 

 
body { 
 
    margin: 0; 
 
\t min-height: 100%; 
 
\t height: 100%; 
 
\t overflow: hidden; 
 
} 
 

 
.outerFlexBox { 
 
    height:100%; 
 
    display: flex; 
 
    display: -webkit-flex; /* for Safari */ 
 
    flex-direction: column; 
 
    overflow: hidden; 
 
    -webkit-flex-direction: column; /* for Safari */ 
 
    background-color: green; 
 
    border: black dotted; 
 
} 
 

 
.outerHeader { 
 
    border: blue dotted; 
 
} 
 

 
.outerContent { 
 
    flex: 1; 
 
    border: red dotted; 
 
    overflow: hidden; 
 
} 
 

 
.innerFlexBox { 
 
    height:100%; 
 
    display: flex; 
 
    display: -webkit-flex; /* for Safari */ 
 
    flex-direction: column; 
 
    overflow: hidden; 
 
    -webkit-flex-direction: column; /* for Safari */ 
 
    background-color: yellow; 
 
    border: black solid; 
 
} 
 

 
.innerHeader { 
 
    border: blue solid; 
 
} 
 

 
.innerContent { 
 
\t flex: 1; 
 
    border: red solid; 
 
    overflow: hidden; 
 
} 
 

 
.myTable { 
 
\t flex: 1; 
 
\t height: 100%; 
 
\t min-height: 100%; 
 
\t width: 100%; 
 
\t overflow-y: auto; 
 
\t border: grey solid; 
 
}
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <link rel="stylesheet" href="index.css"> 
 
</head> 
 
<body> 
 
\t <div class="container-fluid outerFlexBox"> 
 
    <div class="outerHeader"> 
 
     <h4>Some Outer Header</h4> 
 
    </div> 
 
    <div class="outerContent"> 
 
\t \t <p>Some outer content</p> 
 
\t \t <div class="innerFlexBox"> 
 
\t \t  <div class="innerHeader"> 
 
\t \t  \t <p>Some Inner Header</p> 
 
\t \t  </div> 
 
\t \t </div> 
 
\t \t <div class="innerContent"> 
 
\t \t \t <p>Some inner content</p> 
 
\t \t \t <table class="myTable"> 
 
\t \t \t \t <thead> 
 
\t \t \t \t \t <tr><th>Some Header Column</th></tr> 
 
\t \t \t \t </thead> 
 
\t \t \t \t <tbody> 
 
\t \t \t \t \t <tr><td>Some row</td></tr> 
 
\t \t \t \t \t <tr><td>Some row</td></tr> 
 
\t \t \t \t \t <tr><td>Some row</td></tr> 
 
\t \t \t \t \t <tr><td>Some row</td></tr> 
 
\t \t \t \t \t <tr><td>Some row</td></tr> 
 
\t \t \t \t \t <tr><td>Some row</td></tr> 
 
\t \t \t \t </tbody> 
 
\t \t \t </table> 
 
\t \t </div> 
 
    </div> 
 
</div> 
 
</body> 
 
</html>

Und das ist, wie dieselbe Seite wie auf Chrome sieht (links) und Safari (rechts). enter image description here

+2

Ich habe gebissen vorher von verschachtelten Flexboxen in Safari, vor allem mit 'flex-direction: colu mn'. Dies könnte einen Besuch wert sein: https://github.com/philipwalton/flexbugs –

Antwort

2

Wenn Sie Flexbox verwenden und die Eigenschaften voll ausnutzen, erhalten Sie eine Cross-Browser-Lösung.

Der Hauptteil hier ist, alle height:100%; fallenzulassen und die Wachstumseigenschaft von Flebox, flex-grow, zu verwenden.

Zusätzlich habe ich sowohl outerContent als auch innerContent Flexcontainer hergestellt, damit Flebox sich um den verbleibenden Platz kümmern kann.

Hinweis, habe ich getestet dies mit Erfolg auf Chrome/Firefox/IE11/Kanten

Fiddle demo

Stapel Snippet

html, body { 
 
    margin: 0; 
 
} 
 

 
body { 
 
    display: flex;    /* IE11 fix */ 
 
} 
 

 
.outerFlexBox { 
 
    flex: 1;     /* IE11 fix */ 
 
    min-height: 100vh; 
 

 
    display: -webkit-flex; 
 
    /* for Safari */ 
 
    -webkit-flex-direction: column; 
 
    /* for Safari */ 
 
    display: flex; 
 
    flex-direction: column; 
 
    background-color: green; 
 
    border: black dotted; 
 
} 
 

 
.outerHeader { 
 
    border: blue dotted; 
 
} 
 

 
.outerContent { 
 
    flex-grow: 1; 
 
    border: red dotted; 
 
    display: -webkit-flex; 
 
    /* for Safari */ 
 
    -webkit-flex-direction: column; 
 
    /* for Safari */ 
 
    display: flex; 
 
    flex-direction: column; 
 
} 
 

 
.innerFlexBox { 
 
    flex-grow: 1; 
 

 
    display: -webkit-flex; 
 
    /* for Safari */ 
 
    -webkit-flex-direction: column; 
 
    /* for Safari */ 
 
    display: flex; 
 
    flex-direction: column; 
 
    background-color: yellow; 
 
    border: black solid; 
 
} 
 

 
.innerHeader { 
 
    border: blue solid; 
 
} 
 

 
.innerContent { 
 
    flex-grow: 1; 
 
    border: red solid; 
 
    display: -webkit-flex; 
 
    /* for Safari */ 
 
    -webkit-flex-direction: column; 
 
    /* for Safari */ 
 
    display: flex; 
 
    flex-direction: column; 
 
} 
 

 
.myTable { 
 
    flex-grow: 1; 
 
    width: 100%; 
 
    border: grey solid; 
 
}
<div class="container-fluid outerFlexBox"> 
 
    <div class="outerHeader"> 
 
    <h4>Some Outer Header</h4> 
 
    </div> 
 
    <div class="outerContent"> 
 
    <p>Some outer content</p> 
 
    <div class="innerFlexBox"> 
 
     <div class="innerHeader"> 
 
     <p>Some Inner Header</p> 
 
     </div> 
 
     <div class="innerContent"> 
 
     <p>Some inner content</p> 
 
     <table class="myTable"> 
 
      <thead> 
 
      <tr> 
 
       <th>Some Header Column</th> 
 
      </tr> 
 
      </thead> 
 
      <tbody> 
 
      <tr> 
 
       <td>Some row</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Some row</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Some row</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Some row</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Some row</td> 
 
      </tr> 
 
      <tr> 
 
       <td>Some row</td> 
 
      </tr> 
 
      </tbody> 
 
     </table> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div>

+0

Sie sehen jetzt beide auf Safari und Chrome gleich aus. Danke, LGSon! Ich bin ein wenig verwirrt, obwohl die innerFlexBox immer noch nicht den inneren Inhalt enthält. Es sieht so aus, als ob die InnerFlexBox nur den InnerHeader enthält. Wenn Sie die Boarder- und Hintergrundfarben betrachten, wird die gelbe Hintergrundfarbe und der schwarze, durchgezogene Rand der innerenFlexBox nur um den innerenHeader herum angezeigt. Der innere Inhalt hat eine grüne Hintergrundfarbe, die von der outerFlexBox stammt. Außerdem scheint sich die rote Solid Boarder des inneren Inhalts innerhalb des äußerenContent-Containers zu befinden. Macht das Sinn? – Hans

+0

@Hans Die 'innerFlexBox' und' innerContent' sind Geschwister, also kann die 'innerFlexBox' nicht den' innerenContent' enthalten, aber der 'innereHeader' ist ein Kind von' innerFlexBox' und ist daher darin enthalten. – LGSon

+0

@Hans Und da die 'innerContent' und' innerFleBox' Geschwister sind, sind sie beide Flex Items (Kinder) von 'outerContent' – LGSon