Es gab Fragen und Artikel dazu, aber soweit ich das beurteilen kann, nichts aussagekräftiges. Die beste Zusammenfassung, die ich finden konnte, ist
Mit flex-base können Sie die Anfangs- / Startgröße des Elements angeben, bevor etwas anderes berechnet wird. Es kann entweder ein Prozentsatz oder ein absoluter Wert sein.
... was an sich nicht viel über das Verhalten von Elementen mit Flex-Basis- Set aussagt . Mit meinem derzeitigen Wissen über Flexbox verstehe ich nicht, warum das auch die Breite nicht beschreiben kann .
Ich würde gerne wissen, wie genau sich die Flex-Basis in der Praxis von der Breite unterscheidet :
- Was ändert sich optisch, wenn ich die Breite durch eine Flex-Basis ersetze (und umgekehrt)?
- Was passiert, wenn ich beide auf einen anderen Wert setze? Was passiert, wenn sie den gleichen Wert haben?
- Gibt es einige Sonderfälle, in denen die Verwendung von Breite oder Flex-Basis einen signifikanten Unterschied zur Verwendung der anderen Basis hätte?
- Wie unterscheiden sich Breite und Flex-Basis in Verbindung mit anderen Flexbox-Stilen wie Flex-Wrap , Flex-Grow und Flex-Shrink ?
- Irgendwelche anderen signifikanten Unterschiede?
Bearbeiten / Klarstellung : Diese Frage wurde in einem anderen Format in Was genau Flex-Basis-Eigenschaftssätze gestellt? Ein direkterer Vergleich oder eine Zusammenfassung der Unterschiede zwischen Flex-Basis und Breite (oder Höhe ) wäre jedoch hilfreich.
Antworten:
Erwägen
flex-direction
Das erste, was Ihnen beim Lesen Ihrer Frage einfällt, ist, dass
flex-basis
dies nicht immer zutrifftwidth
.Wann
flex-direction
istrow
,flex-basis
steuert die Breite.Aber wann
flex-direction
istcolumn
,flex-basis
steuert die Höhe.Hauptunterschiede
Hier sind einige wichtige Unterschiede zwischen
flex-basis
undwidth
/height
:flex-basis
gilt nur für flexible Artikel. Flex-Container (die nicht auch Flex-Elemente sind) werden ignoriertflex-basis
, können jedochwidth
und verwendenheight
.flex-basis
funktioniert nur auf der Hauptachse. Wenn Sie sich beispielsweise in befindenflex-direction: column
, wird diewidth
Eigenschaft für die horizontale Dimensionierung von Flex-Elementen benötigt.flex-basis
hat keinen Einfluss auf absolut positionierte Flex-Artikel.width
undheight
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
undflex-basis
- kann fein säuberlich in eine Erklärung kombiniert werden. Die Verwendungwidth
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 gebenwidth
, esflex-basis
sei denn, es istauto
odercontent
.Aus der Spezifikation:
Aber die Auswirkungen von
auto
odercontent
können minimal sein oder gar nichts. Mehr aus der Spezifikation:Also, gemäß der Spezifikation,
flex-basis
undwidth
identisch auflösen, esflex-basis
sei denn, istauto
odercontent
. In solchen Fällenflex-basis
kann die Inhaltsbreite verwendet werden (die vermutlich auch von derwidth
Eigenschaft verwendet wird).Der
flex-shrink
FaktorEs ist wichtig, sich die Anfangseinstellungen eines Flex-Containers zu merken. Einige dieser Einstellungen umfassen:
flex-direction: row
- Flex-Elemente werden horizontal ausgerichtetjustify-content: flex-start
- Flex-Elemente werden am Anfang der Linie auf der Hauptachse gestapeltalign-items: stretch
- Flex-Elemente werden erweitert, um die Quergröße des Containers abzudeckenflex-wrap: nowrap
- Flex-Elemente müssen in einer einzelnen Zeile bleibenflex-shrink: 1
- Ein flexibler Gegenstand darf schrumpfenBeachten 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
oderwidth: 100px
, gekoppelt mitflex-shrink: 1
, wird nicht unbedingt 100px sein.Um die angegebene Breite zu rendern - und festzuhalten - müssen Sie das Verkleinern deaktivieren:
ODER
ODER, wie von der Spezifikation empfohlen:
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 derwidth
Eigenschaft respektiert der Container jedoch die Größe seiner Kinder und erweitert sich entsprechend.Verweise:
Beispiele:
Flexgegenstände mit
flex-basis
undwhite-space: nowrap
Überlaufbehälterinline-flex
.width
funktioniert.Es scheint, dass ein Flex-Container, der so eingestellt ist,
inline-flex
dass erflex-basis
ein Kind beim Rendern eines Geschwisters nicht erkenntwhite-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 wirdflex-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
(undflex-grow
) nicht am Tabellenelement arbeitenVerweise:
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 vonfloat
undinline-block
auch dieselbe fehlerhafte Ausgabe gerendert ( jsfiddle-Demo ).Fehler, die IE 10 und 11 betreffen:
flex
Kurzdeklarationen mit einheitlosenflex-basis
Werten werden ignoriertflex-basis
erklärt nichtbox-sizing: border-box
flex-basis
unterstützt nichtcalc()
flex-basis
bei der Verwendung vonflex
Kurzschrift ignoriertquelle
min-width:100px;
? Kann es eine Option sein, das Schrumpfen zu deaktivieren?flex-shrink
hört bei aufmin-width
. Die äquivalente Flex-Regel wäreflex: 1 0 100px
.flex: 1 0 100px
führt zum gleichen Ergebnis, aber ich bin nicht sicher, was Sie mit "gleichwertig" meinen.flex: 0 0 100px
zum Beispiel nicht als gleich betrachten ?Zusätzlich zu Michael_Bs hervorragender Zusammenfassung lohnt es sich, dies zu wiederholen:
Der wichtige Teil hier ist initial .
Dies löst sich von selbst in Breite / Höhe auf, bis die anderen Eigenschaften des Flex-Wachstums / Schrumpfens ins Spiel kommen.
So. ein Kind mit
wird anfangs 25% breit sein, sich dann aber sofort so weit wie möglich ausdehnen, bis die anderen Elemente berücksichtigt werden. Wenn keine vorhanden sind, wird es 100% breit / hoch sein.
Eine kurze Demo:
Code-Snippet anzeigen
Das Experimentieren mit
flex-grow
,flex-shrink
undflex-basis
(oder der Kurzschriftflex :fg fs fb
) ... kann zu interessanten Ergebnissen führen.quelle
flex-basis
undwidth / height
die Anfangs- / Startgröße eines Elements festgelegt wurden. Zum Beispielflex-basis: 200px
funktioniert im Grunde das gleiche wieflex-basis: auto; width: 200px;
. Es sieht so aus, als ob wennflex-basis
nicht eingestellt,auto
nur derwidth / height
Wert überschrieben wird. Der einzige Unterschied, den ich sehe, ist die Art und Weise, wie mit dem Überlauf von Inhalten umgegangen wird.Möglicherweise der wichtigste Punkt zum Hinzufügen:
Was ist, wenn der Browser dies nicht unterstützt
flex
? In einem solchen Fallwidth/height
übernehmen und ihre Werte gelten.Es ist eine sehr gute Idee - fast unabdingbar -,
width/height
Elemente zu definieren , auch wenn Sie dann einen völlig anderen Wert für habenflex-basis
. Denkendisplay:flex
Sie daran, zu testen, indem Sie deaktivieren und sehen, was Sie erhalten.quelle
flex
.