Wenn Sie eine CSS-Eigenschaft auf ein Element anwenden, geschehen viele Dinge im Hintergrund. Nehmen wir zum Beispiel an, wir haben etwas HTML wie dieses
<div class="parent">
<div class="child">Child</div>
<div class="child">Child</div>
<div class="child">Child</div>
</div>
Und dann schreiben wir etwas CSS…
.parent {
display: flex;
}
Dies sind technisch gesehen nicht die einzigen Stile, die wir anwenden, wenn wir die obige Zeile CSS schreiben. Tatsächlich werden eine ganze Reihe von Eigenschaften auf die .child-Elemente angewendet, als ob wir diese Stile selbst geschrieben hätten
.child {
flex: 0 1 auto; /* Default flex value */
}
Das ist seltsam! Warum werden diese Elemente mit diesen zusätzlichen Stilen versehen, obwohl wir diesen Code nicht geschrieben haben? Nun, das liegt daran, dass einige Eigenschaften Standardwerte haben, die dann von uns überschrieben werden sollen. Und wenn wir diese Stile nicht kennen, die angewendet werden, wenn wir CSS schreiben, können unsere Layouts ziemlich verwirrend und schwer zu handhaben sein.
Diese obige flex-Eigenschaft ist eine sogenannte Kurzschreibweise für CSS-Eigenschaften. Und tatsächlich setzt *dies* drei separate CSS-Eigenschaften gleichzeitig. Was wir oben geschrieben haben, ist also dasselbe wie das hier zu schreiben
.child {
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
}
Eine Kurzschreibweise fasst also eine Reihe verschiedener CSS-Eigenschaften zusammen, um das Schreiben mehrerer Eigenschaften auf einmal zu erleichtern, genau wie die background-Eigenschaft, bei der wir etwas wie dieses schreiben können
body {
background: url(sweettexture.jpg) top center no-repeat fixed padding-box content-box red;
}
Ich versuche, Kurzschreibweisen zu vermeiden, da sie ziemlich verwirrend sein können und ich dazu neige, die ausgeschriebenen Versionen zu schreiben, nur weil mein Gehirn lange Zeilen von Eigenschaftswerten nicht verarbeiten kann. Aber es ist empfohlen, die Kurzschreibweise für Flexbox zu verwenden, was... seltsam ist... bis man versteht, dass die flex-Eigenschaft viel Arbeit leistet und jede ihrer Untereigenschaften mit den anderen interagiert.
Außerdem sind die Standardstile gut, weil wir die meiste Zeit nicht wissen müssen, was diese Flexbox-Eigenschaften tun. Zum Beispiel schreibe ich, wenn ich Flexbox verwende, oft so etwas wie
.parent {
display: flex;
justify-content: space-between;
}
Ich muss mich nicht einmal um die Kindelemente oder die auf sie angewendeten Stile kümmern, und das ist großartig! In diesem Fall richten wir die Kindelemente nebeneinander aus und verteilen sie dann gleichmäßig zwischen ihnen. Zwei Zeilen CSS geben Ihnen hier viel Macht, und das ist das Genialste an Flexbox und diesen geerbten Stilen – Sie müssen nicht die gesamte Komplexität unter der Haube verstehen, wenn Sie nur 90% der Zeit dasselbe tun wollen. Es ist bemerkenswert intelligent, weil die gesamte Komplexität aus dem Blickfeld verborgen ist.
Aber was ist, wenn wir verstehen wollen, wie Flexbox – einschließlich der Eigenschaften flex-grow, flex-shrink und flex-basis – tatsächlich funktioniert? Und welche coolen Dinge können wir damit machen?
Gehen Sie einfach zum CSS-Tricks Almanac. Fertig!
Nur ein Scherz. Beginnen wir mit einem kurzen, etwas vereinfachten Überblick und kehren wir zu den Standard-flex-Eigenschaften zurück, die auf Kindelemente angewendet werden
.child {
flex: 0 1 auto;
}
Diese Standardstile sagen dem Kindelement, wie es sich dehnen und ausdehnen soll. Aber jedes Mal, wenn ich sehe, wie sie verwendet oder überschrieben werden, finde ich es hilfreich, diese Kurzschreibweisen so zu betrachten
/* This is just how I think about the rule above in my head */
.child {
flex: [flex-grow] [flex-shrink] [flex-basis];
}
/* or... */
.child {
flex: [max] [min] [ideal size];
}
Der erste Wert ist flex-grow und er ist auf 0 gesetzt, denn standardmäßig wollen wir nicht, dass sich unsere Elemente überhaupt ausdehnen (meistens). Stattdessen wollen wir, dass jedes Element von der Größe des darin enthaltenen Inhalts abhängt. Hier ist ein Beispiel
.parent {
display: flex;
}
Ich habe die Eigenschaft contenteditable zu jedem .child-Element oben hinzugefügt, damit Sie darauf klicken und noch mehr Inhalt eingeben können. Sehen Sie, wie es reagiert? Das ist das Standardverhalten eines Flexbox-Elements: flex-grow ist auf 0 gesetzt, weil wir wollen, dass sich das Element basierend auf dem darin enthaltenen Inhalt vergrößert.
Aber! Wenn wir den Standardwert der Eigenschaft flex-grow von 0 auf 1 ändern würden, so wie hier…
.child {
flex: 1 1 auto;
}
Dann nehmen alle Elemente einen gleichen Teil des .parent-Elements ein, aber *nur, wenn die Längen ihrer Inhalte gleich sind*.
Dies ist genau dasselbe wie das Schreiben…
.child {
flex-grow: 1;
}
…und das Ignorieren der anderen Werte, da diese sowieso standardmäßig gesetzt wurden. Ich glaube, das hat mich bei der Arbeit mit flexiblen Layouts *so* lange verwirrt. Ich sah Code, der nur flex-grow hinzufügte, und fragte mich, woher die anderen Stile kamen. Es war wie ein frustrierendes Kriminalrätsel, das ich einfach nicht lösen konnte.
Wenn wir nun nur eines dieser Elemente stärker wachsen lassen wollten als die anderen, müssten wir Folgendes tun
.child-three {
flex: 3 1 auto;
}
/* or we could just write... */
.child-three {
flex-grow: 3;
}
Ist dieser Code auch ein Jahrzehnt nach der Einführung von Flexbox in Browsern seltsam anzusehen? Für mich ist er das sicherlich. Ich brauche zusätzliche Denkpower, um beim Lesen der Kurzschreibweise zu sagen: „Ah, max, min, ideale Größe“, aber es wird mit der Zeit einfacher. Jedenfalls nehmen im obigen Beispiel die ersten beiden Kindelemente proportional den gleichen Platz ein, aber das dritte Element versucht, dreimal so viel Platz wie die anderen einzunehmen.
Nun, hier wird es seltsam, denn das alles hängt vom Inhalt der Kindelemente ab. Selbst wenn wir flex-grow auf 3 setzen, wie im obigen Beispiel, und dann mehr Inhalt hinzufügen, wird das Layout etwas Seltsames und Merkwürdiges tun, wie dieses
Diese zweite Spalte nimmt nun zu viel Platz ein! Wir werden später darauf zurückkommen, aber für den Moment ist es nur wichtig zu erinnern, dass der Inhalt eines Flex-Elements einen Einfluss darauf hat, wie flex-grow, flex-shrink und flex-basis zusammenarbeiten.
OK, nun zu flex-shrink. Denken Sie daran, das ist der zweite Wert in der Kurzschreibweise
.child {
flex: 0 1 auto; /* flex-shrink = 1 */
}
flex-shrink sagt dem Browser, wie klein ein Element sein soll. Der Standardwert ist 1, was bedeutet: „Nimm jederzeit den gleichen Platz ein.“ Aber! Wenn wir diesen Wert auf 0 setzen würden, wie hier
.child {
flex: 0 0 auto;
}
…dann sagen wir diesem Element, dass es jetzt nicht mehr schrumpfen soll. *Bleib gleich groß, verdammt noch mal!* ist im Wesentlichen das, was dieses CSS sagt, und genau das wird es auch tun. Wir werden in Kürze auf diese Eigenschaft zurückkommen, sobald wir den letzten Wert in dieser Kurzschreibweise betrachtet haben.
flex-basis ist der letzte Wert, der standardmäßig in der flex-Kurzschreibweise hinzugefügt wird, und er gibt an, wie wir einem Element eine ideale Größe geben. Standardmäßig ist er auf auto gesetzt, was bedeutet: „Nutze meine Höhe oder Breite.“ Wenn wir also ein übergeordnetes Element auf display: flex setzen…
.parent {
display: flex;
}
.child {
flex: 0 1 auto;
}
Dies erhalten wir standardmäßig im Browser
Beachten Sie, wie alle Elemente standardmäßig die Breite ihres Inhalts haben? Das liegt daran, dass auto besagt, dass die ideale Größe unseres Elements durch seinen Inhalt definiert ist. Damit alle Elemente den vollen Platz des übergeordneten Elements einnehmen, können wir die Kindelemente auf width: 100% setzen, *oder* wir können flex-basis auf 100% setzen, *oder* wir können flex-grow auf 1 setzen.
Macht das Sinn? Es ist seltsam, oder? Wenn man darüber nachdenkt, schon. Jeder dieser Kurzschreibweise-Werte beeinflusst den anderen, und deshalb wird empfohlen, diese Kurzschreibweise anstelle der unabhängigen Einstellung dieser Werte zu verwenden.
OK, weiter geht's. Wenn wir etwas wie das hier schreiben…
.child-three {
flex: 0 1 1000px;
}
Was wir dem Browser hier sagen, ist, flex-basis auf 1000px zu setzen oder: „Bitte, bitte, bitte nimm einfach 1000px Platz ein.“ Wenn das nicht möglich ist, nimmt das Element diesen Platz proportional zu den anderen Elementen ein.
Sie werden feststellen, dass das dritte Element auf kleineren Bildschirmen nicht tatsächlich 1000px breit ist! Das liegt daran, dass es eigentlich ein Vorschlag ist. Wir haben immer noch flex-shrink angewendet, das dem Element sagt, dass es sich auf die gleiche Größe wie die anderen Elemente verkleinern soll.
Auch das Hinzufügen von mehr Inhalt zu den anderen Kindern wird hier weiterhin Auswirkungen haben
Wenn wir nun verhindern wollen, dass sich dieses Element überhaupt verkleinert, könnten wir etwas wie das hier schreiben
.child-three {
flex: 0 0 1000px;
}
Denken Sie daran, flex-shrink ist hier der zweite Wert, und indem wir ihn auf 0 setzen, sagen wir: „Schrumpfe niemals, du Idiot.“ Und das wird es auch nicht tun. Das Element wird sogar aus dem übergeordneten Element ausbrechen, weil es nie kürzer als 1000px breit wird
Nun ändert sich all dies, wenn wir flex-wrap für das übergeordnete Element auf true setzen
.parent {
display: flex;
flex-wrap: wrap;
}
.child-three {
flex: 0 0 1000px;
}
Wir sehen dann so etwas wie das hier
Das liegt daran, dass Flex-Elemente standardmäßig versuchen, in eine Zeile zu passen, aber flex-wrap: wrap ignoriert das vollständig. Wenn die Flex-Elemente nicht in den gleichen Platz passen, brechen sie in eine neue Zeile um.
Dies sind nur einige der Möglichkeiten, wie sich flex-Eigenschaften überschneiden und warum es so unglaublich wertvoll ist, zu verstehen, wie diese Eigenschaften unter der Haube funktionieren. Jede dieser Eigenschaften kann die andere beeinflussen, und wenn Sie nicht verstehen, wie eine Eigenschaft funktioniert, verstehen Sie irgendwie gar nichts – was mich früher sicherlich verwirrt hat, bevor ich anfing, mich damit zu beschäftigen!
Aber zusammenfassend
- Versuchen Sie, die
flex-Kurzschreibweise zu verwenden - Denken Sie dabei an max, min und ideale Größe
- Denken Sie daran, dass der Inhalt eines Elements auch die Funktionsweise dieser Werte beeinflussen kann.
Toller Beitrag!
Toller Beitrag! Ich kämpfe immer noch mit Flexbox und seinem magischen Verhalten, aber Ihre „max min ideal“ Denkweise scheint es wirklich einfacher zu machen, sich zu erinnern und zu verstehen. Danke!
Toller Beitrag, danke, ich glaube, ich kann Flexbox benutzen, ohne jedes Mal eine Anleitung zu Rate ziehen zu müssen!
Sehr guter Artikel! Das hilft mir, mehr über Flexbox zu verstehen.
Ich kommentiere normalerweise nicht auf Drittanbieter-Formularen, aber dieses Mal hatte ich das Bedürfnis dazu!
Ich wollte sagen, abgesehen von den Fakten – die genau richtig sind –, dass Ihre Art zu schreiben fabelhaft ist! Die Art, wie Sie mich die ganze Zeit konzentriert gehalten haben, großartige Arbeit! Auch meine Komplimente für die Zugänglichkeit, damit Anfänger alles verstehen und erfahrenere Benutzer durch den Inhalt scrollen (oder lesen) können, um den Teil zu finden, den sie suchen.
Machen Sie weiter so mit dieser guten Arbeit! Ich denke, Sie wären ein ausgezeichneter Texter / Blogger als Beruf.
Schönes Tutorial hat mir sehr geholfen, bitte posten Sie weiter Artikel.
Sie nehmen einen gleichen Teil des .parent-Elements ein, *nur wenn die Längen ihrer Inhalte gleich sind*.
Korrekt. Dieses Detail ist SEHR wichtig. Hoffentlich wird es im Artikel korrigiert, damit Anfänger später bei der Arbeit mit Flexbox keine Probleme bekommen. Falsche Informationen zu erhalten ist schlimmer als gar nichts zu wissen.
Hallo, ich habe ein Problem mit Flexbox und abgeschnittenem Text.
Ich wollte den überschüssigen Text abschneiden, aber es funktionierte nicht, wenn ich es mit Flexbox verwendete. Aber wenn ich stattdessen Float benutze, funktioniert es wieder. Kannst du mir helfen?
Ich habe mich auf diesen Artikel bezogen, aber er hilft mir immer noch nicht. Vielleicht verstehe ich nicht richtig, wie Flexbox funktioniert.
Beispiel: https://jsfiddle.net/95mgc083/
Fügen Sie
overflow: hiddenzu.detailhinzu und übertragen Sie alle Stile voma-Element auf.nameUm Text innerhalb eines
flex-itemabzuschneiden, müssen Sieoverflow: hiddenzum übergeordneten Element (demflex-item) hinzufügen.Ich fand dieses CodePen etwas hilfreich.
Danke, Mann! Dieser Beitrag macht das „flex-grow/shrink/basis“-Problem für mich vorstellbar ... zum ersten Mal seit ich im Frontend arbeite. <3 Da ich meistens die Standardwerte verwende und sie nicht überschreibe, kann ich es kaum erwarten, mit etwas herausgefordert zu werden, wo ich dieses Wissen brauche. (
Verwenden Sie das Flexbox Zombies Spiel von Dave Geddes, um es besser zu verstehen.
Danke für dieses Tutorial, ich hatte nie verstanden, wie flex-grow/shrink/basis funktionieren.
Gut gemacht, das hat mein Verständnis sehr verbessert. Danke
Toller Beitrag! Ich komme jeden Tag darauf zurück, um es zu verinnerlichen.
Ich möchte nur noch einmal betonen, dass die „flex“-Eigenschaft von allen Kindern eines übergeordneten Elements geerbt wird, so dass, wenn Sie die flex-Kurzschreibweise explizit für das übergeordnete Element ändern, diese Änderungen von den Kindern geerbt werden. Aus irgendeinem Grund habe ich mich verwirrt und gedacht, ich müsste die flex-Eigenschaften der Kinder einzeln ansprechen. Ich schätze, es spielt wirklich keine Rolle, wo Sie die flex-Eigenschaft festlegen, wenn man darüber nachdenkt. Sie können sie entweder für das übergeordnete oder für die Kinder festlegen. Trotzdem nochmals vielen Dank!
Erstaunlicher Beitrag. Jetzt macht es mir total Sinn, wenn ich mich daran erinnere als [max] [min] und [ideal]. Danke!
Danke, die
[max] [min] und [ideal]Sache ist großartig. Würden Sie sagen, es ist ratsam, Höhe/Breite nicht in Verbindung mit Flex zu verwenden (wenn vermeidbar)? Ich frage mich nur, ob Sie eine Meinung dazu haben. Ich denke, viele meiner Verwirrungen mit Flexbox entstehen durch die Dinge, die Sie in Ihrem Artikel beschrieben haben, sowie durch die häufige Verwendung von Höhe/Breite durch die Leute.Min und max werden irrtümlich verwendet, denn tatsächlich zeigt flex-grow die potenzielle Vergrößerung der Größe (auch der Flex-Basis), während flex-shrink die potenzielle Verkleinerung (den Verlust) von der ursprünglichen Größe (die Flex-Basis) des jeweiligen Elements zeigt. Sie können es besser als Gewinn oder Verlust aus einem Anfangskapital verstehen. Es ist nicht das Mindest- oder Maximalkapital an sich. Leider hat der Autor das Thema missverstanden und durch die Veröffentlichung auf einem renommierten CSS-Portal die Dinge noch schlimmer gemacht.
Wie kann ich Flexbox verwenden, um eine horizontal scrollende Bildergalerie zu erstellen, bei der die Bildgröße bis zu einem bestimmten Punkt responsiv ist?
Hier bin ich angelangt
Die Höhe des Bereichs für den Text unter jedem Bild ist kein wirkliches Problem, da ich denke, dass ich das einigermaßen gut gelöst habe.
Idealerweise sollen die Bilder responsiv zwischen einer maximalen und einer minimalen Größe sein, mit einer unbestimmten Anzahl von Bildern, abhängig von der Nutzung. Die Anzahl der angezeigten Bilder sollte ursprünglich durch die Breite des umschließenden Divs bestimmt werden. Ich möchte keine Media Queries verwenden.
Ich würde mich über jede Hilfe freuen :)
Die Erklärung, dass
flex-shrinkdie minimale Größe des Elements ist, ist falsch.Flex shrink sagt tatsächlich (wie flex grow auch, aber in verdrehter Richtung), wie viel der verfügbare Platz neu verteilt wird.
Der „verfügbare“ Platz für den Schrumpfungsfall ist natürlich negativ.
Daher muss aus dem gesamten benötigten Platz (denken Sie an den überlaufenden Platz außerhalb des umschließenden Containers), der für die Elemente benötigt wird, um genau in diesen Container zu passen, nachdem sie durch die Flex-Schrumpfung komprimiert wurden, jeder eine Aktie abgeben, entsprechend dem Flex-Schrumpfkoeffizienten jedes einzelnen.
Das bedeutet nicht, dass dies ihre endgültige Größe ist, sondern wie viele Bruchteile des gesamten negativen Raums jeder abgeben muss.
Vergleichen Sie das mit der Verwässerung von Eigenkapital in der Finanzwelt, wenn ein Investor in ein Unternehmen eintritt, Liquidität bereitstellt und stattdessen Anteile erhält, wodurch alle Gründer zu einem kleineren Stück ihres ursprünglichen Aktienbesitzes gedrängt werden.
Ich werde später einen ausführlicheren Beitrag zu diesem Thema veröffentlichen, mit Beispielen für leere Elemente oder solche mit oder ohne auferlegte Ränder oder Abstände, damit unsere Mitentwickler besser verstehen, wie man in diesem Bereich qualitativ hochwertigen Code schreibt.
Leider wurden mehrere meiner Kommentare zu einigen nützlichen Bereichen von Chris nicht auf dieser Seite akzeptiert, da ich hier meine Meinung äußere. Daher bin ich mir nicht sicher, ob mein Beitrag hier gesehen wird oder nicht.
Ich setze mich für die einfachste und stärkste Codeverwendung ein, wenn möglich. Daher schätze ich auch die Effizienz eines Kommentars, wenn er dem guten Willen des Blog-Hosts entspricht. Wenn nicht, mögen diese Kommentare zum größeren Wohl der Nutzer zu den Seiten anderer beitragen. Ich denke, gute Punkte könnten gehört werden und nicht vor den Toren gestoppt werden.
Danke!
Super, danke.
Das war großartig, ich war am Anfang auch verwirrt und habe viel recherchiert, aber jetzt habe ich die ganze Idee verstanden.
Danke dafür! Ich glaube, ich verstehe das Konzept jetzt... Ich glaube! :D
Dies besagt, dass 0 und 1 dasselbe bedeuten, was eindeutig nicht der Fall ist.
0 bedeutet gar nicht schrumpfen. 1 bedeutet, um den Faktor 1 proportional zu dem Schrumpfen zu schrumpfen, das von allen schrumpfbaren Geschwistern benötigt wird. 2 bedeutet, um den Faktor 2 zu schrumpfen.
Stellen Sie sich vor, Sie haben drei Geschwister-Flex-Elemente, die kollektiv um 100 Pixel schrumpfen müssen, und das erste Kind hat
flex-shrink: 2und die anderen habenflex-shrink: 1. Das erste Kind schrumpft um 50 Pixel und die anderen beiden um 25 Pixel.Ich dachte,
flex-grow: 3bedeutetflex: 3 1 0, nichtflex: 3 1 auto. Habe ich etwas missverstanden?Ihre Frage hat mich dasselbe gefragt. Ich glaube, flex-grow hat keinen Einfluss auf die Standardwerte für flex-shrink und flex-basis, die 1 und auto sind. Allerdings setzt flex: 1, flex-shrink auf 1 und flex-basis auf 0.
Kurz gesagt,
flex-grow: 1; = flex: 1 1 auto;
flex: 1; = flex: 1 1 0;
Sehr gut erklärt.
Eine sehr bodenständige Erklärung! Also sehr wertvoll
Beste Erklärung aller Zeiten, danke
Wirklich gute Erklärung für einen Anfänger in CSS zum Verständnis, danke!
Danke! Du bist ein erstaunlicher Mensch.
Das ist eine erstaunliche Seite. Der Schreibstil ist so leicht verständlich. Er folgt meinem eigenen Denkprozess so gut und macht die Konzepte viel leichter verdaulich. Andere Ressourcen wie die Informationen auf der Mozilla Developer Network sind so frei von normaler Sprache und enthalten nur die Mindestmenge an Informationen, um Eigenschaften zu definieren, aber als Anfänger kann es ein echter Kampf sein. Dieser Stil verschwimmt leicht in unverständliches Kauderwelsch. Ich kann nicht genug betonen, wie viel effektiver diese Ressource ist.