Erwägen flex-direction
Das erste, was Ihnen beim Lesen Ihrer Frage einfällt, ist, dass flex-basisdies nicht immer zutrifft width.
Wann flex-directionist row, flex-basissteuert die Breite.
Aber wann flex-directionist column, flex-basissteuert die Höhe.
Hauptunterschiede
Hier sind einige wichtige Unterschiede zwischen flex-basisund width/ height:
flex-basisgilt nur für flexible Artikel. Flex-Container (die nicht auch Flex-Elemente sind) werden ignoriert flex-basis, können jedoch widthund verwenden height.
flex-basisfunktioniert nur auf der Hauptachse. Wenn Sie sich beispielsweise in befinden flex-direction: column, wird die widthEigenschaft für die horizontale Dimensionierung von Flex-Elementen benötigt.
flex-basishat keinen Einfluss auf absolut positionierte Flex-Artikel. widthund heightEigenschaften wären notwendig. Absolut positionierte Flex-Elemente nehmen nicht am Flex-Layout teil .
Durch die Verwendung der flexEigenschaft, drei Eigenschaften - flex-grow, flex-shrinkund flex-basis- kann fein säuberlich in eine Erklärung kombiniert werden. Die Verwendung widthderselben Regel würde mehrere Codezeilen erfordern.
Browserverhalten
In Bezug auf die Art und Weise , wie sie gerendert werden, sollte es keinen Unterschied zwischen flex-basisund geben width, es flex-basissei denn, es ist autooder content.
Aus der Spezifikation:
7.2.3. Das flex-basisEigentum
Für alle Werte außer autound content, flex-basiswird auf die gleiche Art und Weise wie aufgelöst widthin horizontalem Schreibmodus.
Aber die Auswirkungen von autooder contentkönnen minimal sein oder gar nichts. Mehr aus der Spezifikation:
auto
Bei Angabe in einem Flex-Element autoruft 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 autozusammen mit einer Hauptgröße ( widthoder height) von verwendet wird auto.
Also, gemäß der Spezifikation, flex-basisund widthidentisch auflösen, es flex-basissei denn, ist autooder content. In solchen Fällen flex-basiskann die Inhaltsbreite verwendet werden (die vermutlich auch von der widthEigenschaft verwendet wird).
Der flex-shrinkFaktor
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/ heightaußer Kraft gesetzt werden kann.
Zum Beispiel flex-basis: 100pxoder 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 flexKurzschrift 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-basisin einem verschachtelten Flex-Container ignoriert. widthfunktioniert.
Bei der Verwendung flex-basisignoriert der Container die Größe seiner untergeordneten Elemente, und die untergeordneten Elemente laufen über den Container. Mit der widthEigenschaft respektiert der Container jedoch die Größe seiner Kinder und erweitert sich entsprechend.
Verweise:
Beispiele:
Flexgegenstände mit flex-basisund white-space: nowrapÜberlaufbehälter inline-flex. widthfunktioniert.
Es scheint, dass ein Flex-Container, der so eingestellt ist, inline-flexdass er flex-basisein 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 widthEigenschaft 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-basisschlä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: absoluteVerwendung von floatund inline-blockauch dieselbe fehlerhafte Ausgabe gerendert ( jsfiddle-Demo ).
Fehler, die IE 10 und 11 betreffen: