Chrome / Safari keine Füllung 100% Höhe der flex-Eltern
Ich möchte ein vertikales Menü mit einer bestimmten Höhe.
Jedes Kind ausfüllen müssen, die Höhe der Eltern-und haben Mitte ausgerichteter text.
Die Anzahl der Kinder ist zufällig, so habe ich zu arbeiten mit dynamischen Werten.
Div .container
enthält eine zufällige Anzahl von Kindern ( .item
), die haben immer zu füllen, die Höhe der Eltern. Zu erreichen, die ich verwendet flexbox.
Für die Herstellung von links mit text, ausgerichtet an der Mitte bin ich mit display: table-cell
Technik. Aber über die Tabelle zeigt, benötigt mit einer Höhe von 100%.
Mein problem ist, dass .item-inner { height: 100% }
funktioniert nicht in webkit (Chrome).
- Gibt es eine Lösung für dieses problem?
- Oder gibt es eine andere Technik, um alle
.item
füllen Sie die Höhe von der Elternteil, bei text vertikal ausgerichtet, auf mittleren?
Hier z.B. jsFiddle, sollte angezeigt werden in Firefox und Chrome
CSS:
.container {
height: 20em;
display: flex;
flex-direction: column;
border: 5px solid black
}
.item {
flex: 1;
border-bottom: 1px solid white;
}
.item-inner {
height: 100%;
width: 100%;
display: table;
}
a {
background: orange;
display: table-cell;
vertical-align: middle;
}
HTML:
<div class="container">
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
</div>
- es wurde nun behoben - bugs.chromium.org/p/chromium/issues/detail?id=426898
- Das ist nicht besonders relevant zu OP, aber relevant sein könnte, für die Googler, die hier landen, für "safari-Anzeige der absoluten Höhe 100% funktioniert nicht" oder etwas ähnliches. Ich habe ein element wie dieses auch in einem flex-container und musste angeben
top:0
undleft:0
zu haben, die es so erscheinen, als erwartet. - noch nicht behoben wurde, noch: stackoverflow.com/questions/46226298/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lösung
Verschachtelte flex-Containern.
Loszuwerden Prozentsatz Höhen. Loszuwerden Tabelle Eigenschaften. Loswerden
vertical-align
. Vermeiden Sie absolute Positionierung. Nur stick mit flexbox den ganzen Weg durch.Gelten
display: flex
auf die flex-Element (.item
), so dass es ein flex-container. Dieser stellt automatischalign-items: stretch
, was sagt das Kind (.item-inner
) erweitern die volle Höhe des übergeordneten Elements.Wichtig: entfernt den angegebenen Höhen von flex-Elemente für diese Methode zu arbeiten. Wenn ein Kind hat eine Höhe angegeben (z.B.
height: 100%
), dann wird es ignoriert diealign-items: stretch
kommen von den Eltern. Für diestretch
Standard zu arbeiten, Größe des Kindes berechnen muss, umauto
(vollständige Erklärung).Probieren (keine änderungen an der HTML -):
CSS:
HTML:
jsFiddle demo
Erklärung
Funktioniert es nicht, da Sie prozentualen Höhe, in einer Weise, die nicht konform mit der traditionellen Implementierung der spec.
In anderen Worten, für die prozentuale Höhe mit der Arbeit an einer in-flow-Kind, den Eltern muss haben eine Höhe festlegen.
In Ihrem code, die top-level-container mit fester Höhe:
.container { height: 20em; }
Den third-level-container mit fester Höhe:
.item-inner { height: 100%; }
Aber zwischen Ihnen, die second-level-container –
.item
– nicht haben eine definierte Höhe. Webkit sieht, dass da ein link fehlt..item-inner
sagt Chrome: mirheight: 100%
. Chrom sieht auf den übergeordneten (.item
) für Referenz-und antwortet: 100% von was? Ich sehe nichts (ignoriert dieflex: 1
Regel, dass es ist). Als Ergebnis, es giltheight: auto
(Inhalt Höhe), in übereinstimmung mit der spec.Firefox, auf der anderen Seite, jetzt übernimmt ein Elternteil die flex-Höhe als Referenz für das Kind der prozentualen Höhe. IE11 und Edge akzeptieren flex-Höhen, als auch.
Auch, Chrome akzeptieren
flex-grow
als eine angemessene parent-Referenz , wenn verwendet, in Verbindung mitflex-basis
(beliebiger numerischer Wert arbeitet (auto
nicht), einschließlichflex-basis: 0
). Als dieses schreiben jedoch, diese Lösung scheitert im Safari.CSS:
HTML:
Vier Lösungen
1. Geben Sie eine Höhe an alle Eltern-Elemente
Eine zuverlässige cross-browser-Lösung ist die Angabe der Höhe auf alle übergeordneten Elemente. Dies verhindert, dass missing links, die die Webkit-basierten Browser betrachten ein Verstoß gegen die Spezifikation.
Beachten Sie, dass
min-height
undmax-height
sind nicht akzeptabel. Es muss dieheight
Eigenschaft.Mehr details hier: Arbeiten mit CSS
height
- Eigenschaft und die prozentualen Werte2. CSS Relative & Absolute Positionierung
Gelten
position: relative
dem Mutterunternehmen und denposition: absolute
für das Kind.Größe des Kindes mit
height: 100%
undwidth: 100%
oder verwenden Sie die offset-Eigenschaften:top: 0
,right: 0
,bottom: 0
,left: 0
.Mit absoluter Positionierung, prozentuale Höhe arbeitet, ohne eine der angegebenen Höhe auf die Muttergesellschaft.
3. Entfernen Sie unnötige HTML-Container (empfohlen)
Ist es erforderlich, die zwei Container um
button
? Warum nicht entfernen.item
oder.item-inner
oder beides? ObwohlTaste
- Elemente, manchmal nicht als flex-Container, können Sie flex-Elemente. Sollten Siebutton
ein Kind.container
oder.item
und das entfernen überflüssiger mark-up.Hier ein Beispiel:
CSS:
HTML:
4. Verschachtelte Flex-Containern (empfohlen)
Loszuwerden Prozentsatz Höhen. Loszuwerden Tabelle Eigenschaften. Loswerden
vertical-align
. Vermeiden Sie absolute Positionierung. Nur stick mit flexbox den ganzen Weg durch.Gelten
display: flex
auf die flex-Element (.item
), so dass es ein flex-container. Dieser stellt automatischalign-items: stretch
, was sagt das Kind (.item-inner
) erweitern die volle Höhe des übergeordneten Elements.Wichtig: entfernt den angegebenen Höhen von flex-Elemente für diese Methode zu arbeiten. Wenn ein Kind hat eine Höhe angegeben (z.B.
height: 100%
), dann wird es ignoriert diealign-items: stretch
kommen von den Eltern. Für diestretch
Standard zu arbeiten, Größe des Kindes berechnen muss, umauto
(vollständige Erklärung).Probieren (keine änderungen an der HTML -):
CSS:
HTML:
jsFiddle
Lösung: Entfernen Sie
height: 100%
im .Element-inner und fügen Siedisplay: flex
im .ElementDemo: https://codepen.io/tronghiep92/pen/NvzVoo
Für den Mobilen Safari gibt Es ein Browser-Update. man muss hinzufügen, - webkit-box - für iOS-Geräte.
Ex.
wenn Sie
align-items: stretch;
- Eigenschaft für das übergeordnete element, entfernen Sie dieheight : 100%
von der Kind-element.Ich hatte ein ähnliches Problem in iOS 8, 9 und 10 und die info oben konnte es nicht reparieren, jedoch habe ich entdecken Sie eine Lösung, die nach einem Tag der Arbeit an diesem. Zugegeben, es wird nicht für jeder arbeiten, aber in meinem Fall meine items gestapelt wurden, in einer Spalte, und hatte 0 die Höhe, wenn es gewesen sein sollte, Inhalt, Höhe. Umschalten der css zu Zeile und wickeln Sie das Problem beseitigt haben. Dies funktioniert nur, wenn Sie ein einzelnes Element, und Sie werden gestapelt, aber da hat es mich einen Tag, um das herauszufinden, dachte ich, ich sollte mein Anteil fix!