Erwägen flex-direction
Das erste, was Ihnen beim Lesen Ihrer Frage einfällt, ist, dass flex-basis
dies nicht immer zutrifft width
.
Wann flex-direction
ist row
, flex-basis
steuert die Breite.
Aber wann flex-direction
ist column
, flex-basis
steuert die Höhe.
Hauptunterschiede
Hier sind einige wichtige Unterschiede zwischen flex-basis
und width
/ height
:
flex-basis
gilt nur für flexible Artikel. Flex-Container (die nicht auch Flex-Elemente sind) werden ignoriert flex-basis
, können jedoch width
und verwenden height
.
flex-basis
funktioniert nur auf der Hauptachse. Wenn Sie sich beispielsweise in befinden flex-direction: column
, wird die width
Eigenschaft für die horizontale Dimensionierung von Flex-Elementen benötigt.
flex-basis
hat keinen Einfluss auf absolut positionierte Flex-Artikel. width
und height
Eigenschaften wären notwendig. Absolut positionierte Flex-Elemente nehmen nicht am Flex-Layout teil .
Durch die Verwendung der flex
Eigenschaft, drei Eigenschaften - flex-grow
, flex-shrink
und flex-basis
- kann fein säuberlich in eine Erklärung kombiniert werden. Die Verwendung width
derselben Regel würde mehrere Codezeilen erfordern.
Browserverhalten
In Bezug auf die Art und Weise , wie sie gerendert werden, sollte es keinen Unterschied zwischen flex-basis
und geben width
, es flex-basis
sei denn, es ist auto
oder content
.
Aus der Spezifikation:
7.2.3. Das flex-basis
Eigentum
Für alle Werte außer auto
und content
, flex-basis
wird auf die gleiche Art und Weise wie aufgelöst width
in horizontalem Schreibmodus.
Aber die Auswirkungen von auto
oder content
können minimal sein oder gar nichts. Mehr aus der Spezifikation:
auto
Bei Angabe in einem Flex-Element auto
ruft das Schlüsselwort den Wert der Hauptgrößeneigenschaft als verwendet ab flex-basis
. Wenn dieser Wert selbst ist auto
, ist der verwendete Wert content
.
content
Zeigt die automatische Größenanpassung basierend auf dem Inhalt des Flex-Elements an.
Hinweis: Dieser Wert war in der ersten Version von Flexible Box Layout nicht vorhanden und wird daher von einigen älteren Implementierungen nicht unterstützt. Der äquivalente Effekt kann erzielt werden, indem auto
zusammen mit einer Hauptgröße ( width
oder height
) von verwendet wird auto
.
Also, gemäß der Spezifikation, flex-basis
und width
identisch auflösen, es flex-basis
sei denn, ist auto
oder content
. In solchen Fällen flex-basis
kann die Inhaltsbreite verwendet werden (die vermutlich auch von der width
Eigenschaft verwendet wird).
Der flex-shrink
Faktor
Es ist wichtig, sich die Anfangseinstellungen eines Flex-Containers zu merken. Einige dieser Einstellungen umfassen:
flex-direction: row
- Flex-Elemente werden horizontal ausgerichtet
justify-content: flex-start
- Flex-Elemente werden am Anfang der Linie auf der Hauptachse gestapelt
align-items: stretch
- Flex-Elemente werden erweitert, um die Quergröße des Containers abzudecken
flex-wrap: nowrap
- Flex-Elemente müssen in einer einzelnen Zeile bleiben
flex-shrink: 1
- Ein flexibler Gegenstand darf schrumpfen
Beachten Sie die letzte Einstellung.
Da flex Elemente erlaubt sind standardmäßig zu schrumpfen (was sie überläuft den Behälter verhindert), die angegebene flex-basis
/ width
/ height
außer Kraft gesetzt werden kann.
Zum Beispiel flex-basis: 100px
oder width: 100px
, gekoppelt mit flex-shrink: 1
, wird nicht unbedingt 100px sein.
Um die angegebene Breite zu rendern - und festzuhalten - müssen Sie das Verkleinern deaktivieren:
div {
width: 100px;
flex-shrink: 0;
}
ODER
div {
flex-basis: 100px;
flex-shrink: 0;
}
ODER, wie von der Spezifikation empfohlen:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
7.2. Komponenten der Flexibilität
Autoren werden aufgefordert, die Flexibilität mithilfe der flex
Kurzschrift und nicht direkt mit ihren Langhand-Eigenschaften zu steuern , da die Kurzschrift alle nicht spezifizierten Komponenten korrekt zurücksetzt, um den allgemeinen Verwendungszwecken gerecht zu werden .
Browser-Fehler
Einige Browser haben Probleme bei der Dimensionierung von Flex-Elementen in verschachtelten Flex-Containern.
flex-basis
in einem verschachtelten Flex-Container ignoriert. width
funktioniert.
Bei der Verwendung flex-basis
ignoriert der Container die Größe seiner untergeordneten Elemente, und die untergeordneten Elemente laufen über den Container. Mit der width
Eigenschaft respektiert der Container jedoch die Größe seiner Kinder und erweitert sich entsprechend.
Verweise:
Beispiele:
Flexgegenstände mit flex-basis
und white-space: nowrap
Überlaufbehälter inline-flex
. width
funktioniert.
Es scheint, dass ein Flex-Container, der so eingestellt ist, inline-flex
dass er flex-basis
ein Kind beim Rendern eines Geschwisters nicht erkennt white-space: nowrap
(obwohl es sich nur um ein Element mit undefinierter Breite handeln kann). Der Container wird nicht erweitert, um die Elemente aufzunehmen.
Wenn jedoch die width
Eigenschaft anstelle von verwendet wird flex-basis
, berücksichtigt der Container die Größe seiner untergeordneten Elemente und wird entsprechend erweitert. Dies ist in IE11 und Edge kein Problem.
Verweise:
Beispiel:
flex-basis
(und flex-grow
) nicht am Tabellenelement arbeiten
Verweise:
flex-basis
schlägt in Chrome und Firefox fehl, wenn der Großelterncontainer ein verkleinertes Element ist. Das Setup funktioniert in Edge einwandfrei.
Wie in dem im obigen Link dargestellten Beispiel wird bei position: absolute
Verwendung von float
und inline-block
auch dieselbe fehlerhafte Ausgabe gerendert ( jsfiddle-Demo ).
Fehler, die IE 10 und 11 betreffen: